Clean Code
Yazılan kodlar ne kadar karmaşık ve uzun olursa, yazılımların verimliliği de bir o kadar düşük olur. Bir projeye sonradan dahil olan ve projeye hakim olmayan biri veya kodu okumak isteyen herhangi biri bu karmaşık kodlamaya baktığında rahatça okuyup anlayamaz. Bunların önüne geçmek için yazılımcılar Clean Code kullanmalıdır. Peki nedir bu Clean Code? İşte Clean Code yazmak için gerekli olan adımlar:
- İsimlendime
- Koşullar (if-else blokları)
- Döngüler (do-while)
- Yorum Satırları
- Fonksiyon Kullanımı
- Hata Yönetimi
- Nesne Yönelimli Programlama (Soyutlama, Kalıtım, Çok Biçimlilik, Bilgi Saklama, Kapsülleme)
- Tasarım Prensipleri
- SOLID (Singleton, Open-Close, Liskov Substitution, Interface Segregation, Dependency Inversion)
- DRY (Do Not Repeat Yourself)
- Tasarım Kalıpları (Singleton, Factory, Facade, Adapter, Command, Proxy, Repository)
SEKTÖRÜN İLERİ GELENLERİNDEN “CLEAN CODE” YORUMLARI
Bjarne Stroustrup (C++’ın mucidi): Kodumun şık ve temiz olmasını seviyorum. Kodda mantık; hataların saklanmasını zorlayacak kadar düz, bağımlılıklar (dependency) bakımı kolaylaştıracak kadar minimal olmalı. Tüm istisnai durumlar (exceptions) ele alınmalı, performans optimale yakın olmalı.
Grady Booch (Object Oriented Analysis and Design with Applications kitabının yazarı): Temiz kod basit ve açıktır. Temiz kod, iyi yazılmış bir düzyazı gibidir. Temiz kod, asla tasarımcının niyetini gizlemez, daha çok berrak soyutlamalarla ve düz kontrol satırlarıyla doludur.
Dave Thomas (OTI Labs’ın kurucusu): Temiz kod, onu geliştiren yazılımcı dışında başka geliştiriciler tarafından da okunabilir ve iyileştirilebilir. Birim ve kabul testleri vardır. Anlamlı isimlendirmeleri vardır. Bir şeyin yapılması için tek bir yol vardır. Çok az bağlılığı vardır ve temiz bir API sağlar.
Michael Feathers (Working Effectively with Legacy Code kitabının yazarı): Temiz kod için bildiğim birçok özelliği sıralayabilirim ancak bir tanesi diğer tüm özellikleri kapsıyor. Temiz kod her zaman ona değer veren biri tarafından yazılmış gibi görünür.
Sektörün ileri gelenlerinin tavsiyelerini de göz önünde bulundurarak yazılımcıların kodlarken dikkat etmesi gerekenleri listeleyelim:
- İyi kod ve kötü kod arasındaki farkı anlamak
- İyi kod yazmak ve kötü kodu iyi koda dönüştürebilmek
- İyi isimlendirme yapabilme; iyi fonksiyon, nesne ve sınıf oluşturabilme
- Optimum seviyede okunabilirlik için kodu formatlama
- Kod yapısını bulanıklaştırmadan hata işleyebilme
- Test odaklı geliştirme yapma
Şimdi de Clean Code yazmak için gereken adımlardan birkaç tanesini örneklerle inceleyelim.
1İSİMLENDİRME
Düzgün kodlamada en önemli adımlardan biri düzgün isimlendirmedir. Değişken, nesne, sınıf, fonksiyon vs. oluştururken verdiğimiz ad, yapılacak işi çağrıştırmalıdır ve o iş hakkında bilgi vermelidir. Bu sayede kodlayan kişi, hata ayıklarken zorlanmaz. Kodu ilk kez görüp okuyan biri ise, düzgün isimlendirme sayesinde kodları rahatça anlar ve kodlamaya dahil olabilir.
Örnek verelim:
int s; //geçen sürenin saniye cinsinden değeri
s, bu kodda bir harf olarak tek başına pek bir şey ifade etmiyor.
Clean Code:
int saniyeCinsindenGecenSure;
int saatCinsindenGecenSure;
Bu kodlarda ise değişken, yapacağı işlevi yorum satırına gerek kalmadan direkt olarak adından çağrıştırıyor.
Başka bir örnek:
int a = l; //küçük l harfi(değişkeni), a değişkenine atanıyor.
int O=1; //bir sayısı, büyük O harfine(değişkene) atanıyor.
Kodlamada ‘büyük O harfi’ ve ‘küçük l harfi’ kullanılmamalıdır. Bu harfler görünüş olarak 1 ve 0 sayılarına benzedikleri için kod okunabilirliğini düşürür ve hatalara neden olabilir.
2KOŞUL KULLANIMI
a) İç içe if kullanılması,
b) If bloğu içinde ters koşul kullanılması,
c) If ve else bloklarında koşul kullanım sırası,
d) If bloğu içindeki karşılaştırılan verilerin ne anlama geldiğinin bilinmemesi
gibi durumlar karşımıza çıkar. Şimdi bunları örnekler üzerinden gösterelim.
a) Örnek:
Bu kodda çok fazla if ve else kullanılmıştır. Dolayısıyla hangi else’in hangi if’e denk geldiğini anlamak zordur.
Clean Code:
Burada ise if’ler alt alta sıralanmış, return edilmiş ve else bloklarından kurtularak daha sade bir kod elde edilmiştir.
b) Örnek:
if (!girisHatali)
İki tane negatif ifadenin kullanılması kafa karıştırıcı olabilir. Bu kod ile aynı işlevi yapacak olan aşağıdaki koda bakalım.
Clean Code:
if (girisHatasiz)
Pozitif ifade kullanmak hem kafa karışıklığı oluşturmaz hem de daha kısa ve sade bir kod yazılmasını sağlar.
c) Örnek:
if (a!=b) {işlem1…}
else {işlem2…}
If bloğunda negatif bir ifade yerine pozitif ifade tercih edilmesi daha uygundur. Bu, kötü koddur.
Clean Code:
if (a==b) { işlem2…}
else {işlem1…}
Pozitif bir ifadeyi ilk önce halledip, sonrasında negatif bir ifade ile uğraşmak beynimiz için daha kabul edilebilirdir.
d) Örnek:
if (yas>18)
Buradaki koşulda 18’in hangi anlamda kullanıldığı bilinmemektedir.
Clean Code:
int resitOlmaYasi=18;
if (yas>resitOlmaYasi)
Buradaki kodda ise 18’in, reşit olma yaşı için koşul oluşturduğu rahatça anlaşılabilmektedir.
3DÖNGÜ KULLANIMI
Birçok dilde bulunan do-while döngüsü, kullanım ve verimlilik açısından uygun değildir. Bu döngüde, “while” kısmının koşulu tutarsız olsa bile, “do” kısmı en az bir kere dönmüş yani çalışmış olur. Yani koşula bağlı olmaksızın bir kere döner. Kodlamada bunu göz önünde bulundurmamız gerekir. Eğer ki gözümüzden kaçarsa, hatalara yol açabilir.
Örnek verelim:
Burada, bir sayısı sıfır sayısına eşit olmasa da (koşul kısmı yanlış olsa da), do kısmı koşuldan önce geldiği için döngü döner ve işlemler gerçekleşir. Bu, kodlama açısından verimsiz bir kullanımdır.
Clean Code için “do-while” döngüsü yerine “while” döngüsü kullanılmalıdır.
4YORUM KULLANIMI
“Kötü kodu yorumlamayın, kodu yeniden yazın.”
-Brian Kernighan
“Kodlar asla yalan söylemez, yorumlar ise bazen.”
-Ron Jeffries
“Yorumlar yalan söyler çünkü yazılımcılar yorumları güncellemek konusunda gereken özveriyi göstermez. Yorumlar eski kalır, hatalı anlamlar çıkarmamıza sebep olur.”
-Uncle Bob
Yorum satırlarının, gereken yerlerde ve aşırıya kaçmadığı sürece kullanılması faydalı olabilmektedir. Fakat genelde kötü kodu saklamak için yorum satırı kullanılır. Kötü koddan kasıt, okunduğu zaman anlaşılmayan veya anlaşıldığı halde gereksiz yere yorum satırı eklenmiş koddur.
Şimdi örneklerle inceleyelim:
int i=1; // i’ye 1 değerini atadık.
Buradaki kodu kötü yapan detay, gereksiz yorum satırı kullanılmasıdır.
Clean Code:
int i=1;
i’nin bir döngü değişkeni olduğu kabul edilirse(başka bir iş yapmıyorsa) bu kod, temiz koddur.
Başka bir örnek:
if (aktifMi==1) // durumun aktif olduğuna emin oluyoruz.
Kodda anlatılamayıp yorum satırında kodu açıklamak kötü kod örneğidir.
Clean Code:
if (aktifMi==Durum.Aktif)
Yorum satırına gerek kalmadan, aktiflik durumunun kontrol edildiği anlaşılmaktadır.
Bir örnek daha:
// çalışanın emekli olup olmama durumunu kontrol ediniz.
if ( (calisan.yas>65) && (calisan.calismaYili>20) )
Yorum satırı olmadan, sadece koda bakarak bu sayıların emekli olma koşulu olduğunu anlayamayız. Kötü kod örneğidir.
Clean Code:
if ( calisan.EmekliOlmaKosullariniSagliyorMu() )
Düzgün isimlendirme sayesinde yorum satırına ihtiyacımız kalmadı.
Son olarak bir kod örneği verip buradaki kötü kodları bulalım ve Clean Code’a dönüştürelim:
- 1. satırdaki kod açık ve anlaşılabilir olduğu için yorum satırı gereksiz yere kullanılmıştır (yorum kullanımı)
- 4. satırdaki yorum satırı, kodu açıklamada kullanılmıştır. Kod, “Hata: Sayı sıfırdan küçük olamaz!” ifadesi ile değiştirilirse yorum satırına gerek kalmaz (yorum kullanımı)
- 2. satırdaki “digerSayi” değişkeninin adı, kodun işlevine uygun olarak “faktoriyel” olarak değiştirilmeli (isimlendirme)
- 6. satırdaki “j” değişkeninin adı, yine kodun işlevine uygun olarak “sayac” olarak değiştirilmeli (isimlendirme)
- if bloğu(3) ve else bloğunun(5) işlemleri yer değiştirilmeli, pozitif olan ifadeye öncelik verilmelidir. Böylece if bloğunun koşul kısmı “okunanSayi>=0” olarak değiştirilir (koşul kullanımı)
CLEAN CODE HALİ:
YARARLANILAN KAYNAKLAR:
https://www.kucukakarsu.net/yazilim/clean-code-temiz-kod-yapisi/
https://www.karel.com.tr/blog/temiz-kod-icin-15-oneri
https://burakekici.com/clean-code/
https://medium.com/@busrauzun/bolum-7-hata-isleme-a7df929b06fb