Temiz Kod (Clean Code)
Makaleme ilk olarak temiz kodun (clean code) ne olduğu hakkında farklı düşünürlerin temiz kod hakkındaki sözleri ve ardından kendi fikrimi belirterek başlayacağım.
Robert C. Martin: “Gerçekten de, okumakla yazarak harcanan zamanın oranı 10'a 1'in oldukça üzerindedir. Yeni kod yazma çabasının bir parçası olarak sürekli eski kodu okuyoruz. … [Bu nedenle] okumayı kolaylaştırmak yazmayı kolaylaştırır. “
“Gereksiz yorumlar, yalanların ve yanlış bilgilerin toplandığı yerlerdir.”
“Temiz kod yazmayı öğrenmek zor bir iştir. İlke ve kalıp bilgisinden daha fazlasını gerektirir. Terlemelisin. Kendin pratik yapmalı ve izlemelisin.Başkalarının pratik yapmasını ve başarısız olmasını izlemelisiniz. Onları tökezlediklerini görmeli ve adımlarını takip etmelisiniz. Kararları yüzünden acı çektiklerini görmeli ve bu kararları yanlış almak için ödedikleri bedeli görmelisiniz. “
Martin Fowler: “Kent Beck’in sık sık kendisi hakkında yaptığı bir açıklama,” Ben harika bir programcı değilim; sadece harika alışkanlıkları olan iyi bir programcıyım. “
Daniel Roy Greenfeld: “Kod yazıldığından daha fazla okunur.
Temiz kod bende bir bebeğin ilk doğduğundan reşit olana kadarki zamanını andırıyor.
Bir bebek doğduğunda hiçbir şey bilmez ona ne öğrenmesi gerektiğini ,neler yapması neler yapmaması gerektiğini hep ebeveynleri öğretir.Aynı bizim sıfırdan bir yazılımı kolayca yazmamız gibi .Sonra bebek gittikçe büyümeye başlar ve çocukluk evresine gelir .Artık bu evrede çocuğa bir şeyler yine katarız ama bebekteki evre kadar kolay olmaz ama tabi ki bir şeyler katmak çok da zor olmaz.Kod yazarken de kodu yarıladığımızı varsaydığımızda önceki değişken tanımlamalarımız kullanıdığımız döngüler,fonksiyonlar vs. bunları hatırlamakta yavaş yavaş zorlanmaya başlarız,kodun gerisine dönüp baktığımızda karmaşıklık göze çarpar ama tıpkı çocuklukta da olduğu gibi istersek bu kodu o zaman fazla uğraştırmadan düzeltebiliriz.Sonra çocukluk evresini de bitirip,reşit olunduktan sonra artık onu tanımak,anlamak,yanlış öğrendiği ya da anladığı bir şeyi düzeltmek,onu iyi anlayamadığımız için zor olur .Kodda da aynı şekilde kodu bitirdiğimizde eğer temiz ve düzenli bir kod yazmamışsak ,geri dönüp baktığımızda anlamak için bir kaç sefer okumamız gerekecek, bu da bize bir hayli vakit kaybettirmiş ve zihnimi boşu boşuna başta düzeltmediğimiz bir şey için yormuş olacaktır.Tabi ki temiz kod hemen öğrenilecek ve kusursuz yapılacak bir şey değildir.Bizim amacımız kodu olabildiğince kolay anlayıp vakitten tasarruf etmektir.Bu vakitten tasarruf da zaten peşinde bir çok getiri sağlayacaktır.Peki temiz bir kod nasıl yazabiliriz?Temiz kod yazmak için neler yapmamız gerektiğine birlikte bakalım.Temiz kod yazmak için genel olarak şu maddlere dikkat etmek gerekmektedir:
• İsimlendirmeler
• Koşullar
• Döngüler
• Yorum Satırları
• Fonksiyonlar
• Hata Yönetimi
1.İsimlendirmeler:İsimlendirme,bir şeyin ne olduğunu veyahut neye,kime ait olduğunu belirten şey.Peki biz bu isimlendirmeyi aklımızda kalması açısından nasıl yapmalıyız:
· Genelleme yapmamalıyız.İsim seçmede daha kolay akılda kalması,hatırlanması için daha spesifik olmalıyız.
· Soyut isimler yerine somut isimler kullanmalıyız.
· Kod estetik açıdan güzel durmalıdır.
· İsmin ne kadar uzunlukta olması gerektiğine karar vermeliyiz.
· İsimlendirme yaparken ismi uzun yapmaktan korkmamalıyız ama tabi ki aşırı uzun da yapmamalıyız.Hatırlamak için ne kadar uzunluk gerekiyorsa o kadar uzunlukta yazmalıyız.Örnek veriyorum,
newNavigationControllerWrappingViewControllerForDataSourceOfClass
şu kadar uzunluktaki bir ismi çoğu kişi aklında tutmakta zorlanır.
newController
gibi bir tanımlamanın da üstü çok kapalı olur.
newNavigationController
gibi bir tanımlama kullanırsak,hem çok uzunluktan kaçınmış oluruz,hem de anlaşılır bir isimlendirme yapmış oluruz.
· İsimlendirme yaparken olumlu bir ifade kullanmaya özen göstermeliyiz .Çünkü,insan beyni olumluyu olumsuzdan daha çabuk ve kolay çözer.
· Özel isim kullanmamaya özen gösterelim.
· Bir metodu iki şekilde kullanmak.Mesela,”FaturalariAlVeKontrolEt” bunun gibi isimlendrimelerde ilerki zamanlarda koda tekrar baktığımızda bu metodun iki iş birden yaptığını düşünebiliriz.
· Bir metodun yapacağı işi hangi iş kuralına göre yaptığına dair bilgi verilmez.Örneğin,”HarfleriAlfabetikSirala”bunun yerine “HarfleriSirala”olmalıdır.
2.Koşullar:Koşul,kodun karmışıklaşmasını sağlayan şeylerden biridir.Peki koşulu nasıl kullanmalıyız:
· Koşul yapıları kodu karmaşıklaştırdığı için dallanma ve zıplama yapmamaya yani iç içe Koşul yapılarından elimizden geldiğince kaçınmamız gerekmektedir.
· Koşulları yaparken mümkün olduğunda doğal olmamız gerekmektedir.Yani Koşul yapısını herkesin aklında bulunduğu gibi yazmalıyız,macera aramamalıyız.
· İsimlendirme kısmında da bahsettiğimiz gibi insan beyni olumluyu daha kolay ve çabuk anlar.Bunun için Koşul yapımızda koşul koyarken,ilk olarak kullanacaksak “== (eşittir)”,”!=(eşit değildir)” arasıdan “==(eşittir)” ile başlamalıyız ki daha kolay anlaşılsın.
· Koşul yapısını daha açıklayıcı,gerekirse uzun yapmalıyız.
3.Döngüler:Döngüler de koşullar gibi karışıklığa yol açan yapıların başında gelmektedir.Peki döngüleri ,karmaşıklığı azaltmak için nasıl kullanmalıyız:
· Do/while yapısı kullanmaktan kaçınmalıyız.Çünkü do yapıları kafa karışılığına yol açar.Bunun yerine do/while yapısıyla aynı işleve sahip olan while yapısını kullanmalısınız.
· İç içe for döngüsü kullanmaktan elinizden geldiğince kaçınmalıyız.
4.Yorum Satırları:Kodda yorum satırı kullanmamızın amacı,kodda ifade edemediğimiz ya da etmekte zorlandığımız yerleri telafi etmek için kullanmaktır.Yorum satırları nasıl kullanılmalı ve nerelerde kullanımına ihtiyaç duyulmalı birlikte bakalım.
· Bir şey hakkında yorum satırı yazmak,o şeyi kodda tamamen ifade edemediğimiz anlamına gelir[ama bazı yerlerde kullanmak mecburidir].Bu da temiz kod sayılmaz.
· Kendimizi yorum yazarken buluyorsak,bilmeliyiz ki öncesin de bir yanlış yapmışızdır.Çünkü,temiz kodun amacı,kodu anlamaktır.Yorum satırı kullanmak da,”ben bunu anlamadım,onun için bunu yazıyorum” demektir.
· Yukardaki madde de bahsettiğim gibi bazı durumlar bizi yorum satırı yazmaya mecbur eder.Bunlar:telif hakkı,yazarlık vs.
5.Fonsiyonlar(Metot):Fonsiyonları nasıl kullanarak karmaşıklığı azaltabiliriz?Şu şekilde:
· Fonksiyon olabildiğince kısa olmalıdır(en fazla 20 satır).
· Fonsiyon sadece adına atanan şeyi yapmalıdır ,yoksa fonksiyon karışıklığa yol açar.Az ve öz olmalıdır.
· Fonsiyonu 20 satıra sığdırmak için de satırları gereğinden fazla uzatmamalıyız.Satırlar da 150 karakterden küçük olmalıdırlar.
· İsimlendirme kısmında da bahsettiğimiz gibi,fonksiyon isimlerini uzun yapmaktan korkmamalıyız.
· Fonksiyonu isimlendirirken,kullanacağımız ismi iyice düşünmeliyiz .Bunun için uzun zaman da harcayabiliriz ama fazla zaman harcamaktan korkmamalıyız.
· İsimlendirme yaparken genel değil de daha açıklayıcı isimler kullanmaya özen göstermeliyiz.
6.Hata Yönetimi:Hata yönetimini nasıl yapmamız gerektiğine birlikte bakalım:
· Try-catch-finally bloklarını yazmalıyız.Şu şekilde inceleyebiliriz:
fonksiyonumuz
{
dönüş değişkenimize hata durumunda döneceği bir değer atanması ;
try
{
return : işlemlerimiz ve dönüş değişkenin döneceği değerin atanması;
}
catch
{
…
}
finally
{
her türlü durumda yapacağımız işlemler;
}
return : hata durumunda dönecek sabit değişkenimiz;
}
Örnek vermek gerekirse:
Şimdi bu öğrendiklerimizi bir örnek üzerinde gösterelim:
1.satır
“okunanSayi”adında bir integer bibr tanımlama yapılmış,bunu yerine isimlendirme kısmında da yazdığımız gibi daha akılda kalıcı sayılar yazarsak daha iyi olur.Çünkü okunanSayi çok üstü kapalı bir tanımdır.Onun dışında yorum satırı kısmın da belirttiğimiz gibi gereksiz yorum satırı kullanmamalıyız.Burada “sayı okuyoruz” yorum satırı çok gereksizdir,zaten Console.Readline() bu işi yapmaktadır.
2.satır
2.satırda “digerSayi” adında integer bir değişken tanımlanmış ve bu değişkene 1 değeri atanmış.1.satırda da bahsettiğimiz gibi digerSayi çok üstü kapalı bir ifadedir.İsim seçerken daha spesifik olmalıyız.
3.satır
3.satırda “okunanSayi” değişkeni dışına bir problem yoktur.okunanSayi probleminden de 1.satırda bahsetmiştik.
4.satır
4.satırda da 1.satırda olduğu gibi gereksiz yorum satırı kullanılmıştır.Ne anlatmak istediğimiz kodda rahatlıkla anlaşılmaktadır.Süslü parantezler aynı satırda bulunmaktadır ve yanındaki şeyle bitişiktirler,bu durum da estetikliği bozmaktadır.
6.satır
6.satırda “j” adında bir değişken tanımlayıp,ona 1 değerini atamışız ve yorum satırı yazarak bu değişkenin ne işe yaradığından bahsetmişiz.Bunun yerine “sayac” adlı bir değişken tanımlasaydık hem kod daha anlaşılır olurdu,bu sayede yorum satırı kullanmamıza gerek kalmazdı.
7.satır
7.satırda önceden bahsettiğimiz tanımlamaları mevcuttur,onun dışında bir problem yoktur.
8.1.satır
“digerSayi = digerSayi*j”kullanmak yerine “digerSayi *= j” kullanırsak gereksiz uzunluğun önüne geçerek daha düzenli bir kod yazmış oluruz.Tabi ki önceki satırlarda bahsettiğimiz gibi tanınlamalar yanlıştır.
8.2.satır
Yorum satırı kullanmaya gerek yoktur.Zaten “j++” ifadesi j’yi bir arttırıyoruz demektir,bunu bir daha dile getirmek gereksizdir.
9.satır
Bir hata bulunmamaktadır.
“Temiz kod yazmayı öğrenmek zor bir iştir. İlke ve kalıp bilgisinden daha fazlasını gerektirir. Terlemelisin. Kendin pratik yapmalı ve izlemelisin.Başkalarının pratik yapmasını ve başarısız olmasını izlemelisiniz. Onları tökezlediklerini görmeli ve adımlarını takip etmelisiniz. Kararları yüzünden acı çektiklerini görmeli ve bu kararları yanlış almak için ödedikleri bedeli görmelisiniz. "