Java Kodunuzun Nesne-Merkezli Olmadığının 10 İşareti

Benzer belgeler
Java Kodunuzun Nesne-Merkezli Olmadığının 10 İşareti

BİL-141 Bilgisayar Programlama I (Java)

Java da Soyutlama ( Abstraction ) ve Çok-biçimlilik ( Polymorphism )

Yazılım Kodlama ve İ simlendirme Standartları v1.0

Eclipse, Nesneler ve Java 2 Java Nereden Çıktı? 2

Görsel Programlama DERS 02. Görsel Programlama - Ders02/ 1

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

Arayüz soyut metotların oluşturduğu bir koleksyondur. Bir sınıf arayüzü çalıştırırken arayüzün sahip olduğu soyut metotları da miras alır.

Sınıf üyeleri: değişkenler (fields) and metotlar (methods) Değişkenler: nesne içerisindeki değişkenlerdir Temel veri tipi veya sınıf tipi

Java C.Thomas Wu 2004b kitabından Türkçeleştirilerek ve örneklendirilerek hazırlanmıştır.

Nesne tabanlı programlama nesneleri kullanan programlamayı içerir. Bir nesne farklı olarak tanımlanabilen gerçek dünyadaki bir varlıktır.

Bire-bir Sahiplik İlişkisi ile İlgili Sorular:

BMH-303 Nesneye Yönelik Programlama

MAT214 BİLGİSAYAR PROGRAMLAMA II DERSİ Ders 12: Grafik Kullanıcı Arayüzü (Graphical User Interface-GUI)

MOBIL UYGULAMA GELIŞTIRME

Decorator Tasarım Şablonu

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

Facade (Cephe) Tasarım Şablonu KurumsalJava.com

Clean Code Akın Kaldıroğlu ! 30 Eylül 2014

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

BMÜ-112 ALGORİTMA VE PROGRAMLAMA-II LABORATUARI DENEY-2 FÖYÜ

public static int Toplam int x, int y

Nesne Yönelimli Programlama

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

BİL-142 Bilgisayar Programlama II

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

Liskov Substitution Principle (LSP) Liskov un Yerine Gecme Prensibi KurumsalJava.com

Arayüz (Interface) Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 7 1

.com. Özcan Acar 2009 Kurumsal Java.com

İçindekiler. Okuma lisansı info acar, için verilmiştir. Çoğaltılması ve dağıtılması yasaktır.

Sınıflar ve Yapılar Arasındaki Farklılıklar. Değer ve Referans Türde Olan Aktarımlar

MALTEPE ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ YAZILIM MÜHENDİSLİĞİ LİSANS PROGRAMI

Business Delegate Tasarım Şablonu KurumsalJava.com

JavaTürk. Java Kod İsimlendirme ve Şekil Standardı

Ders 8 Konu Özeti ve Problemler

5. Bölüm Alt Sınıflar (Nested Classes) Java ile Nesne Merkezli ve Fonksiyonel Programlama Akın Kaldıroğlu

Upgrading Internet Technology skills of Information and Communication Technologies (ICT) Professionals

3. Bölüm Soyut Sınıflar (Abstract Classes) Java ile Nesne Merkezli ve Fonksiyonel Programlama Akın Kaldıroğlu

Java ile Nesneye Yönelik Programlama (Object Oriented Programming)

Spring Framework Eğitimi

İçerik. Kapsülleme ( Encapsulation ) Java da Kalıtım: Örnek 2.1. Kalıtım ( Inheritance ) Tekrar Ziyaret. Java da Kalıtım: Örnek 2.2.

Paket Erişimleri. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 4 1

.com. Özcan Acar 2009 Kurumsal Java.com

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

Kapsülleme ( Encapsulation ) BBS-515 Nesneye Yönelik Programlama

Erişim konusunda iki taraf vardır:

Sınıf üyeleri: değişkenler (fields) and metotlar (methods) Değişkenler: nesne içerisindeki değişkenlerdir Temel veri tipi veya sınıf tipi

Üst Düzey Programlama

Lecture 11: Generics

NESNEYE YÖNELİK PROGRAMLAMA

Cahit GÜNGÖR Hacettepe Üniversitesi Bilişim Enstitüsü. Sorumluluk Zinciri. Kod Üretme (Code Generation)

NESNE TABANLI PROGRAMLAMA-1 DERS UYGULAMALARI (22 EYLÜL - 14 KASIM

Nesneye Dayalı Programlama

Java ile Tasarım Prensipleri ve Tasarım Örüntüleri

Kılgıladığı arayüzler: Serializable, Cloneable, Map<K,V>, NavigableMap<K,V>, SortedMap<K,V>

BİL132 Bilgisayar Programlama II

PAKET ERİŞİMLERİ SINIFLARIN YENİDEN KULLANIMI. BMU-112 Algoritma ve Programlama-II Yrd. Doç.Dr. İlhan AYDIN

Class PriorityQueue. Class PriorityQueue<E> java.lang.object java.util.abstractcollection<e> java.util.abstractqueue<e> java.util.

Java Dersi. Altuğ Bilgin Altıntaş

Görsel Programlama DERS 01. Görsel Programlama - Ders01/ 1

Chain of Responsibility Tasarım Şablonu KurumsalJava.com

JBoss Seam. Melih Sakarya

7. HAFTA. Erişim Belirleyiciler

Görsel Programlama. Temel Veri Tipleri, Değişkenler, Operatörler, Akış Kontrolü, Sınıflar, Metotlar, Paketler ve JavaDoc

İçerik. Temel Kavramlar. Nesne Nedir? 1. Nesne : Örnek. Nesne Nedir? 2. Geçen hafta: Bu hafta: BBS-515 Nesneye Yönelik Programlama

.com. Kurumsal Java. Özcan Acar com

Bölüm 24. Java Ağ Uygulamaları 24.1 Java Appletleri. Bir Applet in Yaşam Döngüsü:

İki Yöntem. Komposizyon (Composition) Kalıtım (Inheritance)

Sınıfların Tekrardan Kullanılması. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 5 1

Interface Comparator. Kılgılayan sınıf: Collator. Bildirimi: public interface Comparator

Temel Kavramlar BBS-515 Nesneye Yönelik Programlama

public class SalesLineItem // Java { private int quantity; private ProductSpecification description; public Money getsubtotal() {...

Java da Program Denetimi ve Operatörler. Altuğ B. Altıntaş 2003 Java ve Yazılım Tasarımı - Bölüm 2 1

Object-Oriented Programming Laboratuvar 11

YZM311 YAZILIM YAPIMI BÖLÜM 4 TASARIM KALIPLARI. Yrd. Doç. Dr. Volkan TUNALI Mühendislik ve Doğa Bilimleri Fakültesi / Maltepe Üniversitesi

BTEP243 Ders 3. class Yazım Kuralı:

Java da, tüm değişkenlerin kullanılmadan önce tanımlanması edilmesi gerekir. Bir değişken tanımlamanın temel gösterimi bu şekildedir:

// hataları işaret eden referans

Sunum İçeriği. Programlamaya Giriş

Şablon Türler (Generics)

Özcan Acar 2010 Kurumsal Java Akademisi.com

ANA SINIF TÜRETİLEN BİRİNCİ SINIF TÜRETİLEN İKİNCİ SINIF

BMH-303 Nesneye Yönelik Programlama

YZM 2105 Nesneye Yönelik Programlama

JavaTürk. Java Kod İsimlendirme ve Şekil Standardı

«BM364» Veritabanı Uygulamaları

Java dili, aşağıdakiler de dahil olmak üzere çok çeşitli denetleyici türlerine sahiptir.

MAT213 BİLGİSAYAR PROGRAMLAMA I DERSİ Ders 1: Programlamaya Giriş

NESNEYE DAYALI PROGRAMLAMA 9. HAFTA UYGULAMA DERSİ

Kalıtım (Inheritance)

#ifndef COMPLEX_H #define COMPLEX_H

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 4. Yrd.Doç.Dr.Hacer Karacan

BMM3101 PROGRAMLAMA DİLLERİ

VERİ TABANI İŞLEMLERİ (NESNE TABANLI PROGRAMLAMA TEKNİĞİ İLE)

İlgili Konular: Object.equals(java.lang.Object), Object.hashCode(), rehash(), Collection, Map, HashMap, TreeMap, Serialized Form

Önemli noktalar. Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar Bilgi Gizleme (Information Hiding ) Sınıflar(Classes) Kalıtım/Inheritance

Kitapta UML diyagramları kullanılarak, tasarım şablonları görsel olarak açıklanmıştır. İçerik aşağıdaki bölümlerden oluşmaktadır:

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

Selsoft Eğitim Kataloğu

Transkript:

Java Kodunuzun Nesne-Merkezli Olmadığının 10 İşareti Akın Kaldıroğlu akin@javaturk.org 5 Ekim 2014

Akın Kaldıroğlu Kimdir? Akın Kaldıroğlu, Ayvalık lıdır. 1990 İTÜ mezunudur. 1993-2001 yılları arasında ABD de Bilgisayar ve Yazılım Mühendisliği yüksek lisans eğitimleri almış ve çalışmıştır. Analist- programcı olarak başladığı kariyerine Yazılım Mühendisliği ve Java danışmanı ve eğitmeni olarak devam etmektedir. da blog yazmaktadır. Müzik, felsefe ve çocukları en çok sevdiği hobileridir. akin@javaturk.org ve sosyal medyadan rahatlıkla ulaşılır. 2

Seminerler Bu tür seminerleri vermedeki amacım, tanışmak, paylaşmak, öğrenmek ve tanıtımdır. Clean Code Tasarım Şablonları (Design Patterns) Java Kodunuzun Nesne- Merkezli Olmadığının 10 İşareti Java 8 ve Fonksiyonel Programlama JVM ve Tuningi (JVM and Its Tuning) 3

Neden? Neden Java Kodunuzun Nesne- Merkezli Olmadığının 10 İşareti? CDI, fonksiyonel programming vb. yapılara sahip Java dili varken, JVM üzerinde Scala, Groovy vb. bir sürü dilciğe sahipken, EJB, JPA, JSF, Spring gibi yetkin frameworkler kullanıyorken, Son derece gelişmiş JVM, AppServer, IDE vb. yapılar elimizin altındayken, Hala mı o eski nesne- merkezli olup- olmama tartışmaları? 4

Kadim Sorular? Evet tüm bunlara sahibiz ama şu soruları hala sorabiliriz? Tüm bu araçlar yazılım geliştirmemizi kolaylaştırıyor mu? Tüm bu araçlar geliştirdiğimiz yazılımın kalitesini arttırıyor mu? 5

Hız ve Kalite Tüm bu gelişmeler yazılımı geliştirme hızımızı arttırıyor. Ama geliştirdiğimiz yazılımın kalitesi hala bizim sorumluluğumuzda, Tüm bu yapılar bize daha kaliteli yazılım geliştirmemiz için imkan sağlıyorlar ama bu imkanları kullanmak bizim sorumluluğumuzda. 6

Problem Nedir? Java projelerinde envai çeşit dilcikler, frameworkler, araçlar vs. kullanılmasına rağmen hala en temel nesne- merkezli prensipler atlanıyor. Çok sıklıkla karşılaştığım ve nesne- merkezli yaklaşıma ters olan bu durumları Java bağlamında listeledim. Bu maddelerin ciddi bir kısmı cohesion ve coupling ile ilgili. 7

10 İşaret Java kodunuzun nesne- merkezli olmadığının 10 işareti Listedeki maddeler geneldirler, özel durumlarda farklı şeyler söylenebilir. Maddeler doğrudan kod kalitesinden ziyade kodu nesne- merkezli olmasının önündeki engellere odaklanmaktadır. 8

10 Numara Sıra dışı durumları ifade etmek için Exception nesneleri oluşturmamak. No Exception objects to represent exceptional situations. Her şeyi nesnelerle ifade ediyorsak, sıra dışı durumları da Exception nesneleriyle ifade etmeliyiz. Çünkü sıra dışı durumlar iş mantığının bir parçasıdır. Sıra dışı durumları görmezden gelmek ya da int ya da String vb. tiplerle, return değeri olarak ifade etmek nesneden uzaklaşmaktır, anlam problemine ve karmaşık programlara yol açar. 9

10 Numara Fırlattığınız sıra dışı durum nesneleri, metotların arayüzlerinin yani anlamlarının bir parçasıdır, Yeterliyse APIlerdeki Exception nesneleri Aksi taktirde iş modelimizi sıra dışı durumlara özgü kendi Exception nesnelerimizle zenginleştirmeliyiz. Kullanıcıya bilgi verme, loglama vb. ihtiyaçlar yanında aslen sistemin çalışmasını devam ettirme amaçlı kullanılmalıdır. 10

10 Numara public interface UserDao{ public User getuser(string tckn) throw Exception; public User saveuser(user user) throw Exception; public interface UserDao{ public User getuser(string tckn) throw NoSuchUserException; public User saveuser(user user) throw DuplicatedUserException; 11

9 Numara Aşırı miktarda karar ifadelerine ( if/switch vb.) sahip metotlar. Methods that include excessive number of decision (if/ switch etc.) statements. Karar yapılarının oluşturduğu karmaşıklık, cyclomatic complexity, metodun anlaşılmasını ve testini zorlaştırır. Aşırı karar, muhtemelen pek çok farklı konuyu bir arada yönetmek anlamına geldiğinden, ekseriyetle cohesionu düşürür. Böyle metotlar muhtemelen çok sayıda parametre alırlar. 12

9 Numara 13

9 Numara Yüksek CC nin sebebi, çoğu zaman düzgün soyutlamalar yaptığımızda farklı metot ve sınıilara koyulacak yapıları, bir arada halletmeye çalışmaktır. Strategy, Command, Proxy, State gibi tasarım kalıpları bu duruma çözümdür. Bazen de bir is- a hiyerarşisi kurmamak yüksek CC ye sebep olur. Bir sınıftaki tip gösteren int ya da String bir değişken metotlarınızda pek çok if/switch e sebep olur. Bir tip hiyerarşisi oluşturup, polymorphic davranışla kararı JVM e bırakmak olması gereken davranıştır. 14

9 Numara public class JavaturkUser{ private String username; private String password; private String name; private String lastname; private int type; public void register(){ if(type == 1){ else if(type == 2){ 15

8 Numara Demeter prensibini ihlal eden metotlar. Methods that break the Demeter law. Demeter kanunu, her yazılım biriminin sadece ve sadece çok yakınındakilerle haberleşebileceğini, uzaktakileri bilmemesi gerektiğini söyler. Yabancılarla konuşma ya da az bilgi prensibi (principle of least information) Bu prensip yapılarımızı yüksek couplingten korur 16

8 Numara Buna göre bir nesnenin metotlarında, kendisi üzerinde metot çağrısı yapabileceği nesneler ancak şunlar olabilir: O nesnenin instance variableları, O nesnenin metotlarına geçilen parametre nesneler, O nesnenin o metotunda oluşturulan nesneler. Yani bir nesne ancak arkadaşlarıyla konuşur, yabancılarla konuşmaz. 17

public class A{ private B b; public void f(c c){ b.g(); // 1- Yapılabilir c.u(); // 2- Yapılabilir D d = new D() d.v(); // 3- Yapılabilir E e = c.w(); // Yapma bunu e.z(); // E den iş isteme, C den, E'den iş // istemesini talep et. Müdür Sekreter Fotokopici 18

8 Numara Developerlar, bu prensibi göz önüne almadan, gelişi güzel coupling yaratma eğilimdedirler, Çünkü onlar amaçlarını en kısa yoldan gerçekleştirme isterler. Bu da bağımlılığı yüksek dolayısıyla da kaotik yazılımlara sebep olur. 19

8 Numara 20

7 Numara Karmaşık metotlar. Complex methods. Metotların karmaşıklığına etki eden temelde 3 nokta vardır: Satır sayısı Parametre sayısı Karar karmaşıklığı (cyclomatik complexity) 21

7 Numara Metotların satır sayısı ortalama olarak 10 u geçmemelidir. Her metot, tekrar kullanılabilir bir tek işi yerine getirmelidir. Koordine eden metotlar, koordine edilen metotları çağırarak daha büyük bir bağlamda ama tek bir işi yerine getirmelidir. 22

7 Numara Argüman sayısı arttıkça hem metotların hem de sınıilarının cohesionları düşer, couplingleri artar. Makul sayıda (<5) argümanlı metotlar yazmak ve geçilen argüman sayısını ortalama olarak 1 civarında tutmak sağlıklıdır. Constructorlar, factory metotları, façade ve remote arayüzler bunun istisnaları olabilir. Çok parametreli metotları ya bölün ya da parametreleri nesne olarak soyutlayıp geçin. 23

public JVTUser(String username, String password, boolean enabled, boolean accountnonexpired, boolean credentialsnonexpired, boolean accountnonlocked, Collection<? extends GrantedAuthority> authorities, String uid, String email, String salt, String name, String surname, String msisdn, String accountid, boolean verified, boolean newuser, String welcomemessage, boolean verifyreminder, Date registrationdate, Date verificationdate) String uid = utils.generateuuid(); String salt = utils.generatesalt(32); String accountid = utils.generateaccid(); JVTUser user = new JVTUser( registrationform.getemail().trim(), null, true, true, true, true, AuthorityUtils.NO_AUTHORITIES, uid, registrationform.getemail().trim(), salt, registrationform.getname().trim(), registrationform.getsurname().trim(),null, accountid, true, true, null, true, new Date(),null ); 24

public static JVTUser createnonlockedunverifieduser(registrationform registrationform) JVTUser user = JVTUser.createNonlockedUnverifiedUser(registrationForm); 25

6 Numara Çok sayıda metoda sahip olan sınıilar. Classes with lots of methods. Fazla sayıda metoda sahip olan sınıilar fazla sorumluluğa sahiptir. Sınıilar sadece bir kavramla ilgili sorumlulukları bir araya getirmeli. Bu tür sınıilar çok şeyi bir araya getirir bu yüzden de cohesionu düşük, couplingi yüksek olur. 26

public class SuperDashboard extends JFrame implements MetaDataUser{ public String getcustomizerlanguagepath() public void setsystemconfigpath(string systemconfigpath) public String getsystemconfigdocument() public void setsystemconfigdocument(string systemconfigdocument) public boolean getgurustate() public boolean getnovicestate() public boolean getopensourcestate() public void showobject(metaobject object) public void showprogress(string s) public boolean ismetadatadirty() public void setismetadatadirty(boolean ismetadatadirty) public Component getlastfocusedcomponent() public void setlastfocused(component lastfocused) public void setmouseselectstate(boolean ismouseselected) public boolean ismouseselected() public LanguageManager getlanguagemanager() public Project getproject() public Project getfirstproject() public Project getlastproject() public String getnewprojectname() public void setcomponentsizes(dimension dim) public String getcurrentdir() public void setcurrentdir(string newdir) public void updatestatus(int dotpos, int markpos) public Class[] getdatabaseclasses() public MetadataFeeder getmetadatafeeder() public void addproject(project project) public boolean setcurrentproject(project project) public boolean removeproject(project project) public MetaProjectHeader getprogrammetadata() public void resetdashboard() public Project loadproject(string filename, String projectname) public void setcansavemetadata(boolean cansave) public MetaObject getselectedobject() public void deselectobjects() public void setproject(project project) public void editoraction(string actionname, ActionEvent event) public void setmode(int mode) public FileManager getfilemanager() public void setfilemanager(filemanager filemanager) public ConfigManager getconfigmanager() public void setconfigmanager(configmanager configmanager) public ClassLoader getclassloader() public void setclassloader(classloader classloader) public Properties getprops() public String getuserhome() public String getbasedir() public int getmajorversionnumber() public int getminorversionnumber() public int getbuildnumber() public MetaObject pasting(metaobject target, MetaObject pasted, MetaProject project) public void processmenuitems(metaobject metaobject) public void processmenuseparators(metaobject metaobject) public void processtabpages(metaobject metaobject) public void processplacement(metaobject object) public void processcreatelayout(metaobject object) public void updatedisplaylayer(metaobject object, int layerindex) public void propertyeditedrepaint(metaobject object) public void processdeleteobject(metaobject object) public boolean getattachedtodesigner() public void processprojectchangedstate(boolean hasprojectchanged) public void processobjectnamechanged(metaobject object) public void runproject() public void setaçowdragging(boolean allowdragging) public boolean allowdragging() public boolean iscustomizing() public void settitle(string title) public IdeMenuBar getidemenubar() public void showhelper(metaobject metaobject, String propertyname) //... many non-public methods follow... 27

6 Numara Servis nesneleri ise couplingi yüksek olma eğilimindedirler, daha ufak servis nesnelerine bölünmelidir. İş alanı nesneleri ise doğrudan veri tabanındaki tablolara karşılık gelmemeli, uygun bir şekilde modellenmelidir. Devasa utility nesneleri ise alt nesnelere bölünmelidir, SystemUtil yerine StringUtil, SecurityUtil, HttpUtil gibi. 28

6 Numara Çok fazla sayıda metoda sahip sınıiların çok fazla değişkeni de olabilir. Çok sayıda değişken düşük cohesion, yüksek coupling demektir. 29

6 Numara public class MyService{ private UserDao userdao; private RegisteredEmailDao registeredemaildao; private AuthorityDao authoritydao; private Utils utils; private MailSender mailsender; private PasswordEncoder passwordencoder; private SaltSource saltsource; private AuditLogDao auditlogdao; private EraseUserAction eraseuseraction; private AuthenticationUtils authenticationutils; private BankDao bankdao; private BankParamDao bankparamdao; private KeyAliasDao keyaliasdao; private JavaTurkCipher javaturkcipher; private BankServiceFactory bankservicefactory; private OtpDao otpdao; private BankUtils bankutils; private FormUtils formutils; private EventLogAction eventlogaction; private BankServiceLogAction logaction; 30

6 Numara public class JavaturkUser{ private String username; private String password; private String name; private String lastname; private int type; private Set<GrantedAuthority> authorities; private boolean accountnonexpired; private boolean accountnonlocked; private boolean credentialsnonexpired; private boolean enabled; private String uid; private String email; private String salt; private String name; private String lastname; private String msisdn; private String accountid; private boolean verified; private boolean newuser; private String welcomemessage; private boolean verifyreminder; private Date registrationdate; private Date verificationdate; private String registrationtype; 31

5 Numara Aralarında benzerlik ilişkisi olan nesneleri modellemek için kalıtım kullanmamak. No inheritance hierarchy to model is- a relationships between objects. Eğer kalıtım/inheritance kullanmıyorsanız, polymorphismden yararlanamazsınız Bu da nesneleriniz üzerindeki iş mantığını karmaşıklaştırır, if/switch sayısını arttırır. 32

5 Numara public class User{ private String username; private String password; private String firstname; private String lastname; private int type; public void register(){ if(type == 1){ dothis(); else if(type == 2){ dothat(); 33

5 Numara public abstract class User{ protected String username; public abstract void register(); public class IndividualUser extends User{ public void register(){ dothis(); public class CorporateUser extends User{ public void register(){ dothat(); 34

4 Numara Kodunuzda hiç ya da çok az sayıda interface olması. No or very few interfaces in the code. Nesne- merkezli programlama, responsibility- driven dır. Interface kullanmamak, sorumlulukları- davranışları soyutlamamak demektir. Hiç ya da az interface, muhtemelen data- driven düşünme anlamına gelir. 35

4 Numara Bir yazılım projesinde tasarımın en temel belirtisi interfacelerdir. Tasarıma interface ile başlanıldığında elde etdilen sınıiların cohesionunu yüksek, couplingini az olma eğilimindedir. Örneğin, interfacelerdeki metotlar, sınıiların üzerine koyuverilenlerden daha az argüman alma eğilimindedirler. 36

3 Numara Kodunuzda hiç alan nesnesinin olmaması ya da olsa bile çok yetersiz olmaları. No or very thin domain objects in the code. İş mantığınızı alan nesneleri ile ifade etmiyorsanız, sadece primitivler ve collectionları kullanıyorsunuz demektir. Bu durum anlam ve anlaşılma problemine sebep olur. İş mantığınız ise servis, utility vb. nesnelere dağılmış demektir. 37

3 Numara public class Date { private int day; private String month; private int year; public int getday() { public void setday(int day) { public String tostring() { return "Date: " + day + " - " + month + " - " + year; Date sınıfını, cohesion ve coupling açısından ele alalım. Nedir sizce bu nesnenin cohesionu? Ve diğer nesnelerle olan ya da olacak olan irtibatı, couplingi nedir? 38

2 Numara Yüksek içerik bağımlılığı yani bir başka sınıfın nesne değişkenlerine aşırı sayıda doğrudan erişim ya da aşırı set ve get metodu çağrısı. High content coupling, i.e. direct access to the instance variables or excessive number of calls to setters and getters of another class. Aşırı sayıda bir başka sınıfın nesne değişkenlerine doğrudan erişim ya da aşırı set ve get metodu çağrısı, yüksek bir bağımlılık oluşturur. 39

2 Numara İçerik bağımlılığı, hizmet yerine bilgi alış- verişi demektir. Nesnelerin varlık sebebi bilgi alıp- vermek değildir. Nesneler hizmet için vardırlar, veri yerine getirilecek hizmet için vardır. 40

1 Numara Sınıilarda aşırı miktarda statik metot kullanımı. Excessive use of static methods in classes. Statik, nesne kullanımının alternatiiidir. Fakat statik kullanım standart dışı kullanımdır, genel değildir, bazı durumlara mahsus olmalıdır. Ne kadar çok statik kullanırsanız o kadar az nesne oluşturursunuz. 41

1 Numara public class MyClass { private int i; public static void main(string[] args){ System.out.println(i); print(); public void print() { System.out.println(i); 42

1 Numara Statik yapılar, nesne oluşturmanın anlamsız olduğu haler içindir. Sınıfın durumuna bağlı olmayan metotlar, Utility metotları örneğin Singleton kullanımına alternatif durumlar 43

10 İşaret 1. Sını8larda aşırı miktarda statik metot kullanımı. 2. Yüksek içerik bağımlılığı. 3. Kodunuzda hiç alan nesnesinin olmaması ya da olsa bile yetersiz olmaları. 4. Aralarında benzerlik ilişkisi olan nesneleri modellemek için kalıtım kullanmamak. 5. Kodunuzda hiç ya da çok az sayıda arayüz olması. 6. Çok sayıda metoda sahip olan sını8lar. 7. Karmaşık metotlar. 8. Demeter prensibini ihlal eden metotlar. 9. Aşırı sayıda karar ifadelerine sahip olan metotlar. 10.Sıra dışı durumları ifade etmek için Exception nesneleri oluşturmamak. 44

Bazı Noktalar Değerleri hard- coded yapmaktan hiç doküman yazmamaya kadar pek çok farklı kötü kod işareti mevcuttur. Ama ben sadece nesne kullanımıyla ilgili olanları listeledim. Listeyi Java bağlamında yaptım ama hepsi diğer nesne- merkezli diller için de geçerlidir. 45

Dinlediğiniz için teşekkür ederim. Bu sunuma adresinden ulaşabilirsiniz.