0% found this document useful (0 votes)
15 views78 pages

Clean Code

Uploaded by

egeee eemmm
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
15 views78 pages

Clean Code

Uploaded by

egeee eemmm
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

AGILE SOFTWARE DEVELOPMENT TURKEY

Clean Code
Temiz Kod
Akın Kaldıroğlu
Selsoft Yazılım Danışmanlık Eğitim ve Ticaret Ltd. Şti.
Hakkımda
• Balıkesir, Ayvalıklıyım.
• 1990 İTÜ mezunuyum.
• Sonrasında 1993 – 2001 yılları arasında
ABD’de master eğitimi aldım ve çalıştım.
• Yazılıma C/C++ ile başladım ve çıktığından bu
yana Java’yı kullanıyorum.
• İlk Java sertifikalı developerlardanım.
• 2001-2008 arasında Türkiye’de yazılım
mimarı, yazılım müdürü, GMY vb.
pozisyonlarda çalıştım. 2
Hakkımda

• 2008’den bu yana Selsoft’ta danışmanlık ve eğitmenlik yapıyorum.

• Mesleki ilgi alanlarım:

• Agile Yazılım Geliştirme, Yazılım Mimarisi, Design Patterns, Clean


Code.

• Java Teknolojileri

• JVM ve uygulama performans iyileştirmesi

3
Eğitmen Hakkında
Hakkımda
• [Link] adresinde bir günlüğüm var.

• Vakit buldukça Felsefe ve Matematik ile ilgileniyorum.

• Erişim noktalarım:

• Email: [Link]@[Link] & akin@[Link]

• Twitter: @kaldiroglu

• LinkedIn: [Link]/in/akinkaldiroglu/

4
Temiz Kod Nedir?
Clean Code - Temiz Kod Nedir?
• Clean Code ya da Temiz Kod (iyi, kaliteli, yalın kod) nedir?

• Nasıl tanımlarsınız?

• Ya da kodun hangi özellikleri onu temiz yapar?

• Ya da kodun hangi özellikleri onu kirli/kötü yapar?

• Siz kişisel olarak kod yazarken temiz olması adına nelere dikkat
ediyorsunuz?

6
Clean Code Nedir? - I
• Bjarne Stroustrup: Şık ve etkin (elegant and efficient)

• Grady Booch: Basit ve doğrudan (simple and direct)

• Michael Feathers: Dikkatli, önem veren birisi tarafından yazılmış


görünür (it looks like it was written by someone who cares)

• Ron Jeffries: Küçük, ifade gücü yüksek, basit ve tekrarsız (small,


expressive, simple, and no duplication)

• Bu ifadeler açıklanmaya muhtaçtır, örneğin “basit ve doğrudan” o kadar


da basit ve doğrudan değildir, ya da “şık kod” nedir?
7
Clean Code Nedir? - II

Temiz kod, orijinal yazarından başka developer tarafından


okunabilir ve geliştirilebilir. Birim ve kabul testlerine sahiptir. Anlamlı
isimleri vardır. Bir şeyi yapmanın pek çok yolundan ziyade tek bir yolunu
sağlar. Açık-seçik olarak tanımlanmış minimal bağımlılıklara sahiptir ve
temiz ve minimal bir API sunar. Kod okunabilir olmalıdır, çünkü sadece
programlama diline bağlı kalınırsa, her türlü gerekli bilgi kodda açık bir
şekilde ifade edilemez.

Dave Thomas

8
Uncle Bob
• Clean Code kavramı Robert Cecil
Martin (uncle Bob) tarafından öne
çıkarılmıştır.

• Kendisi eskiden bu yana OOP ve OOD


konularında yazmakta ve danışmanlık
yapmaktadır.

• [Link] adresinde
Clean Code eğitim videolarını
yayınlamaktadır.
9
Bence “Temiz Kod” - I
• Kodlama (programlama) aslen karmaşık ve zordur ve aslolan
geliştirmek değil değiştirmektir (bakım), dolayısıyla değişebilen kod
geliştirmek daha da zordur.

Temiz Kod (Clean Code), zaten zor olan programlama sürecini,


insani zaafiyet ve kaprislerle daha da zorlaştırmamaktır,
kolaylaştırmaktır.

Temiz Kod (Clean Code), rahat anlaşılır ve kolay değişebilir koddur.


Temiz kod, odaklıdır dolayısıyla da kısadır ve bağımlılıkları azdır.

10
Bence “Temiz Kod” - II
• Clean code, teknolojiden, sektörden bağımsız olarak, anlaşılır,
yalın, kaliteli koddur.

• Kod temiz değilse kötüdür (dirty kod), karmakarışıktır (Spagetti Code)


Code Smell, Kötü Koku’ya sahiptir.

• Clean/Dirty Code, bir teknoloji problemi değildir.

• Clean/Dirty Code, bir ahlak ve bilgi problemidir.

• Clean/Dirty Code, işini iyi yapmakla ilgilidir.

11
Temiz Kod - Teknik Borç - I

• Temiz yazılmayan kod, karmakarışıktır (mess).

• Temiz yazılmayan kod, teknik borç (technical debt) biriktirir.

• Teknik borcu yüksek kodun bakımı zordur (low maintainability).

• Teknik borcu yüksek kod, zor anlaşılır dolayısıyla doğruluğunu ya da


yanlışlığını belirlemek de zordur, değiştirilmesi de maliyetlidir.

• Temiz yazılmayan kodun oluşturduğu karmakarışıklık çığ gibi büyür.

12
Temiz Kod - Teknik Borç - II
• Yazılımda üretim hızını etkileyen pek
çok faktör vardır:

• İş ve teknik mimari,

• Yetkin yazılımcılar, vs.

• Temiz olmayan kod da, yeni kodun


yazılmasında güçlük çıkartarak,
üretim hızını düşüren önemli bir
etkendir.

13
Temiz Kod ve Karmaşıklık
• Temiz olmayan kod karmaşıktır (complex), temiz kod karmaşık değildir.

• Ousterhout “A Philosophy of Software Design”da der ki:

Complexity is caused by two things: dependencies and obscurity

…one of the goals of software design is to reduce the number of


dependencies and to make the dependencies that remain as simple
and obvious as possible.

Obscurity occurs when important information is not obvious.

14
15
Temiz Kod Çerçevesi
Temiz Kod Çerçevesi - I

• Temiz Kod Çerçevesi (Clean Code Framework), temiz kodu


bileşenlerine ayırarak daha rahat anlaşılmasını ve uygulanmasını
sağlamak amacıyla geliştirilmiş bir çerçevedir.

• Çerçevede ana ve alt hedefler ile onları gerçekleştirmede kullanılacak


metotlar ve teknikler verilmiştir.

17
Temiz Kod Çerçevesi - II

• Çerçeveye göre Temiz Kod, temelde dört özelliğe sahiptir:

• Basit (Simple)

• Odaklı (Focused)

• Doğru (Correct)

• Tam (Complete)

18
Temiz Kod Çerçevesi - III

19
20
Basitlik
Basitlik - I
• Çoğu zaman dilde basit (simple) kelimesini, bayağı, gelişigüzel anlamında
kullanırız.

• Bu “galat-ı meşhur”dur.

• Basitlik (simplicity) meziyettir, karmaşıklık (complexity) gelişigüzelliktir,


sıradanlıktır.

• Anlaşılabilirlik, takip edilebilirlik, makuliyet (rationality), bir düzeni (order) işaret


eder.

• Anlaşılma zorluğu, takip edilemezlik, akıl-dışılık (irrationality) ise düzensizliğin


göstergesidir. 22
Basitlik - II

• Basitlik, erişilmesi, sanılanın aksine, karmaşıklıktan daha zor olandır.

• Bir şeyi ilk defa yaparken muhtemelen karmaşık yaparız.

• Basit olan rahat anlaşılır, tutarlı, tek düze ve umulandır; şaşırtmayandır.

• Karmaşık olan ise anlaşılması zor, tutarsız ve çeşitlidir.

• KISS: Keep it simple, stupid - keep it simple and short!

23
Basitlik Nihai Karmaşıklıktır

• Leonardo Da Vinci’ye göre

Simplicity is the ultimate sophistication.

Basitlik nihai karmaşıklıktır.

24
Basitlik Nasıl Elde Edilir? - I
• Basit, bir seferde elde edilen bir durum değildir.

• Basitleştirmek, bir şeye tümüyle, her yönüyle hakim olup, asıl ile
teferruatı ayırmaktır, gelişigüzel çıkarma, indirgeme değildir.

• Bu da çoğu zaman bir süreç gerektirir.

• Kodun basitleştirilmesine iyileştirme (refactoring) denir.

• İyileştirme temelde, çıkarmak ve bölüp-parçalamaktır.

25
Basitlik Nasıl Elde Edilir? - II

26
Basitlik Nasıl Elde Edilir? - III

• Mükemmellik nasıl elde edilir? Basitlikle mi yoksa karmaşıklıkla mı

• Fransız yazar Antoine de Saint-Exupery’a göre:

Perfection is achieved, not when there is nothing more to add, but


when there is nothing left to take away.

Mükemmellik, eklenecek bir şey olmadığında değil, çıkarılacak bir şey


olmadığında başarılır.

27
Basitlik Nasıl Elde Edilir? - IV
• Einstein’e atfedilen

Everything should be made as simple as possible, but no simpler.

Her şey olabildiğince basit olmalı, ama daha da basit değil.

ya da

Make things as simple as possible, but not simpler.

Her şeyi olabildiğince basitleştir, ama daha da basit yapma.

cümleleri bunu ifade eder.


28
29
Basit Kod
Basit Kod
• C. A. R. Hoare der ki

There are two ways of constructing a software design. One way is


to make it so simple that there are obviously no deficiencies. And
the other way is to make it so complicated that there are no
obvious deficiencies.

Bir yazılım tasarımı geliştirmenin iki yolu vardır. Birisi onu o kadar
basit yapmaktır ki hiç bir hata olmadığı açık olsun. Diğeri onu o
kadar karmaşık yapmaktır ki açıkta görünen hiç bir hata olmasın.

31
Basit Kod Nasıldır? I

• Basit kodu tanımlamak zordur ama en azından kötü örneklere


bakarak kalitenin ne olduğuyla alakalı bir şeyler söyleyebiliriz.

• En azından böyle değildir!

[Link]([Link]() ?
([Link]([Link]()) ?
[Link]() : [Link]()):
([Link]([Link]())) ?
[Link](): [Link]());

32
Basit Kod Nasıldır? II
#// Burada CardInfo’nun Idsi atanır. Id olarak eğer musteri TC vatandasi ise
#// ve ya WS’den ya da fromdan gelen tckn atanır. Eğer müşteri TC vatandaşı
#// değilse Id olarak customerNo alınır.
#// Burada da yine ya WS’den ya da formdan gelen customer no atanır.
String idNo = null;
boolean isTcCitizen = [Link]();
String tcknFromForm = [Link]();
String tcknFromWS = [Link]();
boolean nullOrEmptyTcknFromWS = [Link](tcknFromWS);
String custNoFromWS = [Link]();
Bu çok daha boolean nullOrEmptyCustNoFromWS = [Link](custNoFromWS);

basittir. if(isTcCitizen){
if(nullOrEmptyTcknFromWS)
idNo = tcknFromForm;
else
idNo = tcknFromWS;
}
else{
if(nullOrEmptyCustNoFromWS)
idNo = tcknFromForm;
else
idNo = custNoFromWS
} 33
[Link](idNo);
[Link]([Link]() ?
([Link]([Link]()) ?
[Link]() : [Link]()):
([Link]([Link]())) ?
[Link](): [Link]());

#// Burada CardInfo’nun Idsi atanır. Id olarak eğer musteri TC vatandasi ise
#// ve ya WS’den ya da fromdan gelen tckn atanır. Eğer müşteri TC vatandaşı
#// değilse Id olarak customerNo alınır.
#// Burada da yine ya WS’den ya da formdan gelen customer no atanır.
String idNo = null;
boolean isTcCitizen = [Link]();
String tcknFromForm = [Link]();
String tcknFromWS = [Link]();
boolean nullOrEmptyTcknFromWS = [Link](tcknFromWS);
String custNoFromWS = [Link]();
boolean nullOrEmptyCustNoFromWS = [Link](custNoFromWS);

if(isTcCitizen){
if(nullOrEmptyTcknFromWS)
idNo = tcknFromForm;
else
idNo = tcknFromWS;
}
else{
if(nullOrEmptyCustNoFromWS)
idNo = tcknFromForm;
else
idNo = custNoFromWS
}
[Link](idNo);
34
Anlaşılır Kod - I
• Anlaşılır kodun iki şartı vardır:

• Şekil şartı, standart olması,

• İçerik şartı, odaklı olmasıdır.

• Anlaşılır kod standard bir şekilde yazılmıştır, mümkün olan her yerde
aynı yaklaşımı, aynı çözümü, şekli, aynı ismi vs. kullanır.

• Anlaşılır kod odaklıdır, bir yerde sadece ve sadece bir şeyi yapar ama
tam yapar.

35
Anlaşılır Kod - II

36
Dilimiz ve Dünyamız
• L. Wittgenstein Tractatus Logico-Philosophicus (5.6
nolu not) isimli kitabında şöyle der:

The limits of my language mean the limits of my


world.

Dilimin sınırları, dünyamın sınırlarını demektir.

Dilimin sınırları, dünyamın sınırlarını imler.

37
İsimlendirme Zordur

There are only two hard things in Computer Science: cache


invalidation and naming things.

Bilgisayar Bilimlerinde sadece iki tane zor şey vardır: ön belleği


temizleme ve şeyleri isimlendirme.

Phil Karlton

38
İsimlendirme - I
• Anlaşılır isimlendirmenin en temel engeli kısaltmadır.

• Her kısaltma bir kodlamadır ve kısaltanın bir zihinsel durumunu yansıtır.

• Zihinsel kodlamalardan kaçının, açıkça anlaşılır olun.

private int nofInst; private int nofInst;

• “I” mı “L” mi “1” mi? “L” ise “fl” “float” mı demek?

• “number of” mu “no” mu?

• Ya da “Institution” mı, “Installation” mı yoksa “Installments” mı?


39
Soyut, Kapsayıcı İsim
• İsimleriniz olabildiğince soyut ve kapsayıcı olsun.

• Sadece değişkenin aldığı değerlere bakarak isim


vermeyin, neyi temsil ettiğini düşünün.
int distanceToGo
int km int distance
int remainingDistance

int hour int timeToCook

int calculateKm(City c1, City c2)

int calculateDistanceBetween(City from, City to)


40
İsimlendirme - II
• İsmin uzun olması anlamlı ya da bağlama uygun olduğunu göstermez.

• “executeInner“ ya da “executeInner1” ne demek?

public boolean executeInner(…){…}

public boolean executeInner1(…){…}

• “executeUser“ ne demek?

public boolean executeUser(…){##...}

41
İsimlendirme - III
• Ne yaptığınızı bilmiyorsanız iyi isim veremezsiniz!
public class GenericUtil{…}

public class SystemUtil{…}

public class Util{…}

public class Helper{…}

• Genel isimler vermeyin, daima daha özel, daha açıklayıcı olun.

void process(){…} void processDailyEarningReportRequest(){…}

class Util{…} class DateUtil{…}

class XMLParsingUtil{…}
42
İsimlendirme - IV

• Ve lütfen İngilizce ve Türkçe’yi karıştırarak isimlendirmeyin!

public List getTotalPartageBySatan(){…}

ParaDate

public List getTotalPartageBySalesChannel(){…}

TransactionDate

43
Odaklılık
Temiz Kod Çerçevesi

45
Anlaşılır Kod - İçerik Şartları - I

• Anlaşılırlık, şekilden çok içerikle ilgilidir.

• İçerik açısından bakıldığında anlaşılır kod, olabildiğince okuyanın


konuya çok hakim olmasına gerek kalmadan, çok detaya girmeden,
nispeten yüzeysel olarak hızlıca kavranan koddur.

• Dolayısıyla öncelikle programcı, kendisi için anlaşılır kod yazmalıdır.

• Kodunu yazdıktan sonra dön bir bak, 3 ay ya da 1 yıl sonra bu kodu


anlaman, hatasını bulman ve düzeltmen ne kadar sürer?

46
Anlamak İçin Kod
• Martin Fowler, Refactoring isimli kitabında şöyle der:

Any fool can write code that a computer can understand. Good
programmers write code that humans can understand.

Herhangi bir insan bilgisayarın anlayabileceği kod yazabilir. İyi


programcılar ise insanların anlayabileceği kod yazar.

47
Anlaşılır Kod - İçerik Şartları - II
• Anlaşılır kodun en temel içerik özelliği, odaklı olmasıdır.

• Odaklı kod, çerçeve (framework)-bileşen-paket-arayüz-sınıf-metot/


fonksiyon-blok-değişken, ne olursa olsun, sadece ve sadece bir şeyi
halleder.

• Odaklı kod, bir yerde birden fazla şeyi bir araya getirmez.

• Odaklı kod aynı zamanda kısadır, küçüktür.

• Yazılımda hiç bir soyutlamanın büyüğü makbul değildir.

• Kodlama, anlama, anlatma, test, değişim vs. için odaklı kod şarttır. 48
Odaklılık İlkesi
• Odaklı kodun iki özelliği vardır:

• Tek hedefli

• Tekrarsız

• Tek hedeflilik, bir seferde sadece bir şeyi hedeflemek, onu yapmak,
halletmek demektir.

• Bir şeyi değiştirmenin sadece bir sebebi olmalıdır.

• Yapılan işi sadece ve sadece bir yerde ve bir kere yapmak, tekrarsız
kodun gereğidir.
49
Odaklı Kod

50
Odaklılık
• Odaklılık bir hedeftir ve farklı terimlerle ifade edilir.

Separation of concerns

Single-responsibility principle

High-cohesion

Low-coupling

51
Temel Prensipler - I

Techniques - Patterns

Principles

Coupling & Cohesion

52
Temel Prensipler - II

• Literatürde farklı prensip listeleri ya da aileleri vardır, en bilinen ikisi


şunlardır:

• SOLID

• GRASP

• Ayrıca Design by Contract, Defensive Programming ve En az Bilgi


Prensibi (Least information principle/Law of Demeter)

53
SOLID Prensipleri
• SOLID prensipleri şunlardır:

• Single Responsibility Principle

• Open-Closed Principle

• Liskov Substitution Principle

• Interface Segregation Principle

• Dependency Inversion Principle

54
GRASP
• GRASP, “General Responsibility Assignment
Software Patterns”ın kısaltmasıdır.

• Craig Larman, “Applying UML and Patterns:


An Introduction to Object-Oriented Analysis
and Design and Iterative Development” isimli
kitabında anlatmaktadır.

• Kitap giriş seviyesinde bir kitaptır.

55
GRASP
• GRASP patternları şunlardır:

• Information Expert • Polymorphism

• Creator • Pure Fabrication

• High Cohesion • Indirection

• Low Coupling • Protected Variations

• Controller

56
Odaklı ve Tekrarsız Kod İçin Budama

• Odaklı dolayısıyla da küçük soyutlamalar bir seferde elde edilemez.

• Soyutlamalarınızı devamlı surette budayarak kısa ve küçük soyutlamalara


ulaşabilirsiniz.

Sürekli İyileştirme ya da Continuous Refactoring

• Unutmayın, mükemmelliğe ekleyerek değil, çıkararak ulaşabilirsiniz.

• Tekrarsız kod, ancak tasarımla ve sonrasında gerektiğinde refactoring


ile elde edilir.
57
Kısa Kod İçin Budama

• B. Pascal The Provincial Letters isimli eserinin 16. mektubunda şöyle


der:

I have only made this letter longer because I have not had the
time to make it shorter.

Bu mektubu böyle uzun yapabildim çünkü kısa tutmak için


zamanım yoktu.

58
Don’t Repeat Yourself - I

• Don’t Repeat Yourself, DRY, tekrarsız kod yazmanın sloganıdır:

Every piece of knowledge must have a single, unambiguous,


authoritative representation within a system.

Her bilgi parçasının sistemde, tek, açık, güvenilir bir ifadesi olmak
zorundadır.

• Davranış, bilgi, kısıt, vs. ne olursa olsun sadece bir yerde olsun.

59
Don’t Repeat Yourself - II
• DRY prensibini sadece tasarım ile gerçekleştirmek imkansızdır.

• Kodlarken refactoring ile tekleştirmeye gidilmelidir.

• Tekleştirme, cut-paste ile sağlanır.

• Birbirine benzeyen kodlar, tek bir yapı altında toplanır.

• Tekrar kullanım (reusability) artar.

• Copy-paste kullanmayın, cut-paste kullanarak tekrar kullanılabilen


yapılar kurun!

60
Uygulama
Uygulama
• login() metodunu SRP’ye uygun olarak nasıl gerçekleştirilebileceğini
düşünün.

• Verilen gerçekleştirmeyi değerlendirin.

public void login(String tckn, String password) throws


NoSuchCustomerException,CustomerAlreadyLoggedException,
WrongCustomerCredentialsException,
MaxNumberOfFailedLoggingAttemptExceededException,
CustomerLockedException, ImproperCustomerCredentialsException,
NoProperPasswordException;
[Link]

62
public void login(String tckn, String password) throws NoSuchCustomerException,
CustomerLockedException, CustomerAlreadyLoggedException, WrongCustomerCredentialsException,
MaxNumberOfFailedLoggingAttemptExceededException, ImproperCustomerCredentialsException,
NoProperPasswordException {

• login validateTckn(tckn);
validatePassword(password);
Customer customer = [Link](tckn);
metodu if ([Link]().equals(password) & ![Link]() & ![Link]()) {
[Link](true);
prosedürel [Link]([Link]() + " " + [Link]() + " logs in.");
[Link](customer);
birlikteliğe currentCustomer = customer;
} else if ([Link]()) {
throw new CustomerAlreadyLoggedException("Customer is already logged in. Please first log out.");
sahiptir. } else if ([Link]()) {
throw new CustomerLockedException("Customer is locked. Please consult your admin.");
} else if (![Link]().equals(password)) {
loginAttemptCount#++;
• Birden int limit = [Link]([Link]("[Link]")
if (loginAttemptCount #== limit)) {

fazla işi [Link](true);


[Link](customer);
loginAttemptCount = 0;
sırayla throw new MaxNumberOfFailedLoggingAttemptExceededException(
"Max number of login attempt reached: " + loginAttemptCount);

yapıyor. }
else
throw new WrongCustomerCredentialsException("TCKN/password is wrong.");
}
}
63
public void login(String tckn, String password) throws NoSuchCustomerException,
CustomerLockedException, CustomerAlreadyLoggedException,
WrongCustomerCredentialsException,
MaxNumberOfFailedLoggingAttemptExceededException {
Customer customer = [Link](tckn);
1
if ([Link]().equals(password) &
![Link]() & ![Link]()) {
#// Database is updated when a customer logs in.
[Link](true);
if ([Link](customer))
currentCustomer = customer;
2
loginAttemptCount = 0;
}

else if ([Link]()) {
throw new CustomerAlreadyLoggedException("Customer is already logged in.
Please first log out."); 3
}

else if ([Link]()) {
throw new CustomerLockedException("Customer is locked.
Please consult your admin.");
4
}

else if (![Link]().equals(password)) {
badLoginAttemptCount#++;
if (badLoginAttemptCount #== [Link]([Link](
"[Link]"))) {
[Link](true); 5
[Link](customer);
throw new MaxNumberOfFailedLoggingAttemptExceededException("Max number of
login attempt reached: "
+ badLoginAttemptCount);
}
throw new WrongCustomerCredentialsException("TCKN/password is wrong.");
} 64
}
public void checkIfCustomerAlreadyLoggedIn(Customer customer) throws CustomerAlreadyLoggedException {
if ([Link]()) {
throw new CustomerAlreadyLoggedException("Customer is already logged in.
Please first log out."); 3
}
}

public void checkIfCustomerLocked(Customer customer) throws CustomerLockedException {


if ([Link]()) {

}
throw new CustomerLockedException("Customer is locked. Please consult your admin."); 4
}

public void checkCustomerPassword(Customer customer, String password) throws


MaxNumberOfFailedLoggingAttemptExceededException, WrongCustomerCredentialsException {
if (![Link]().equals(password)) {
loginAttemptCount#++;
checkLoginAttempCount(customer); 5 • Atomik iş
throw new WrongCustomerCredentialsException("Wrong password!");

}
}
yapan
public void checkLoginAttempCount(Customer customer) throws
MaxNumberOfFailedLoggingAttemptExceededException{
metotlar
if (loginAttemptCount #== [Link]([Link](

lockCustomer(customer);
"[Link]"))) { 5
}
}

public void lockCustomer(Customer customer) throws MaxNumberOfFailedLoggingAttemptExceededException{


[Link](true);
throw new MaxNumberOfFailedLoggingAttemptExceededException("Max number of login
attempt reached: " 5
+ loginAttemptCount);
} 65
public void login(String tckn, String password) throws
NoSuchCustomerException, CustomerAlreadyLoggedException,
WrongCustomerCredentialsException,
MaxNumberOfFailedLoggingAttemptExceededException,
CustomerLockedException{
validateTckn(tckn); 1
validatePassword(password); • Yönetsel
Customer customer = [Link](tckn);
loginCustomer(customer, password); metotlar.
}

private void loginCustomer(Customer customer, String password) • Atomik


throws
CustomerAlreadyLoggedException, işler ile
WrongCustomerCredentialsException,
MaxNumberOfFailedLoggingAttemptExceededException, yönetsel
CustomerLockedException{
işler
boolean login = false; 2
checkIfCustomerAlreadyLoggedIn(customer); ayrılmış
checkIfCustomerLocked(customer);
checkCustomerPassword(customer, password); durumda.
[Link](customer);
}
66
[Link]
Doğruluk
Doğru Kod - I
• Temiz kod doğrudur (correct).

• Bir kodun kendi başına doğruluğu ancak birim testiyle (unit test)
sınanabilir.

• Bir kodun çevresindeki diğer kod parçalarıyla birlikte doğru çalıştığı ise
ancak entegrasyon testiyle sağlanabilir.

• Birim ve entegrasyon testleri TDD yaklaşımı ile yapılırsa, doğruluk ve


tamlık konusunda daha iyi seviyeler elde edilebilir.

68
Doğru Kod - II

69
Tamlık
Tam Kod - I
• Temiz kod tamdır (complete).

• Kodun tam olması, olması gerekenleri yaparken olmaması gerekenleri


önlemesi ve olabilecek olanları da öngörürüp gerekli davranışlara sahip
olması demektir.

71
Tam Yazılım - II
• Sadece ilk maddeye, olması gerekene odaklanmak kodunuzu tam
yapmaz.

• Olmaması gerekenlerin önlenmesi savunmacı programlama teknikleri


ve assertion yapılarını kullanarak olur,

• Olabilecek olanları öngörmek ve yazılımı ona göre tasarlamak da sıra


dışı durum yönetimiyle mümkündür.

72
Savunmacı Programlama - I
• Savunmacı programlama (defensive programming) ismini
savunmacı sürüşten (defensive driving) alır.

• Savunmacı programlama programcıya pek çok şeyin hatalı


olabileceğini akılda tutarak kodunu geliştirmesini tavsiye eder.

• Savunmacı programlamanın temel amacı, programın güvenirliğini


(reliability) sağlamaktır.

• Güvenilirlik, program/yazılımın olabildiğince hatadan arınmış olması ve


bu sayede çalışmaya devam etmesidir.
73
Savunmacı Programlama - II
• Bu tedbirler hem programın kullanıcılarına hem de programın diğer
geliştiricilerine karşı alınmalıdır:

• Örneğin kullanıcılar sıklıkla beklenmedik türde veri girerler, bu durumda


programın nasıl davranacağı önemlidir,

• Benzer şekilde her programcı kodunu öyle geliştirmelidir ki diğer


programcılar bu kodu rahatlıkla, yanlışa düşmeden kullanıp, hatalı
çıkarımda bulunmadan kendi kodlarını geliştirebilsinler.

• Hatta programcı, ileride kendisi için bile kodunu savunmacı bir şekilde
yazmalıdır.
74
Önleme ve Yönetme
• Savunmacı programlamanın tedbirleri iki türlü olabilir:

• Geliştirme sırasında alınan önlemler ve tabi olarak yapılan testler ile


istenmeyen durumun oluşmayacağından emin olmak,

• Bu amaçla assertion mekanizmaları kullanılır,

• Çalışma zamanında olabilecek durumları öngörmek

• Bu amaçla sıra dışı durum yönetimi (exception handling) yapılır.

• Tekniklerin ilk türü önlemeye ikincisi ise yönetmeye odaklanır.


75
Nasıl Elde Edilir?
Temiz Kod Nasıl Elde Edilir?
• Öncelikle kurumsal ve bireysel farkındalık ve bilgi,

• Kurumsal süreç ve bireysel iş yapış şekilleri,

• Azıcık düşünme yani tasarım,

• Bol iletişim, paylaşma ve tartışma,

• Refactoring için cesaret ve zaman,

• PMD, SonarCube gibi kod kalitesi araçları,

• Kod review, formal ya da peer review süreci.


77
Teşekkürler !
Akın Kaldıroğlu
[Link]@[Link]

Selsoft
[Link]

You might also like