Clean Code Nedir?

Alperen Çorak
Yetkin Yayın
Published in
11 min readApr 23, 2021

Clean Code (Temiz Kod) Nedir?

Clean Code tam olarak nedir? Arabanın, masanın, evin temizi olur da kodun nasıl temizi olur?

Temiz olmayan bir kod dağınık bir oda gibidir. Çok sayıda kod satırı, anlaşılmayan şekilde adlandırılmış değişkenler, bir fonksiyonun birden fazla ve karışık işlevleri olması vb. durumlar kodun karmaşıklığının artmasına neden olur. Karmaşıklık arttıkça verimlilik düşer. Böylece bu karmaşıklık bir çığ gibi büyüyerek kötü kod diye adlandırdığımız şeye dönüşür ve daha kötüsü projenin başarısız olmasına bile sebebiyet verebilir.

Temiz kod tam olarak da burada devreye giriyor. Eğer kodumuzdan gereksiz kod satırlarını arındırırsak, her değişkene anlaşılabilir isimler atarsak, fonksiyonların birden fazla işlev yapmasındansa tek işlev yapmasını sağlarsak kodumuzun özü hem insanlar tarafından anlaşılabilir olup kolayca yorumlanabilir hem de verimlilik büyük oranda artar. Tabii temiz kod yazmak büyük oranda bir çaba gerektirir. Fakat başarıyı da beraberinde getirir.

Peki bu temiz kodu neden yazalım?

Bir kod düşünün ki istediğiniz bütün işlevlere sahip ve istediğiniz gibi de çalışıyor. Fakat kodunuz clean code’a uygun bir şekilde yazılmamış. Kısaltma şeklinde isimlendirmeler, iç içe geçmiş fonksiyonlar, sıkışık kalmış kod satırları…

Bu kodu ekip arkadaşlarınızın anlaması çok zor olacaktır. Böyle bir durumda ise kodu ekip arkadaşlarınıza anlatmanız gerekecek. Bu da boşa zaman kaybına ve projenin süresinin uzamasına yol açacaktır. Üstelik sorun bundan da ibaret değil. Kodunuzda tanımlanan karmaşık isimlendirmeler, karmakarışık kod satırları gibi unsurlar sebebiyle kodunuzun üzerine yeni geliştirmeler yaparken ekipçe sıkıntı çekmek kaçınılmaz olacaktır. Bu durum yine boşu boşuna giden zaman ve gereksiz kaynak kullanımına sebebiyet vermekle beraber fazlaca bir maliyeti de beraberinde getirecektir. Oysaki baştan isimlendirmeler anlaşılır bir şekilde tanımlansa, tek bir fonksiyonun tek bir işlevi olsa, o kod satırları sıkışık kalmayıp ferah ferah boşluklarla yazılsa kısaca clean code’a uygun bir şekilde yazılsa en başta ekibiniz bu koda bakıp anlatmanıza gerek kalmadan anlayacak, geliştirmeler kolay bir şekilde yapılacaktır. Bu sayede hem zamandan hem de kaynak kullanımından tasarruf etmiş olunacaktır. Projenin başarı oranı ise büyük bir oranda artacaktır.

1. İsimlendirme

İsimlendirme konusu kulağa çok basit gelse de yazılım geliştirmede gerçekten önemli bir yere sahiptir. Çünkü isimler kodumuzda her yerdedir. (Dosyalar, değişkenler, fonksiyonlar vb.) Rastgele olarak belirlenmiş olan değişken, sınıf, fonksiyon adları kodun okunurluğunu azaltacak ve kodu anlayacak kişiye zaman kaybettirecektir. Ekip arkadaşlarımıza hatta bu adı kendi belirlemiş olan geliştiricinin bile kodda kaybolmasına bile sebebiyet verebilir.

İsimlendirmelerimizi mutlaka kolay anlaşılabilir, kısaltma içermeyen mantıklı kelimelerden oluşturmalıyız. Başta iyi bir isim bulmak biraz zaman alabilir ama ileride takımınıza ve size daha fazla zaman kazandıracaktır. Böylece projenin devamlılığına olanak sağlanmış olacaktır.

Anlamlı ve Açık İsimler Kullanmak Kodun Anlaşılabilirliğini Arttırır

Değişkenleri adlandırırken bu değişkenin neden kullanıldığını açıklamak için yorum satırı kullanmamalıyız. Onun yerine değişken adımızı anlamlı, kısaltmalardan uzak bir şekilde tanımlamalıyız. Böylece değişkenimiz ne işe yaradığını kendi anlatacaktır.

Bu kod parçasında sadece değişken isimlerine bakarak değişkenlerin ne işe yaradığını anlayamıyoruz. Değişkenlerin ne işe yaradığını yorum satırı sayesinde anlayabiliyoruz. Ama bu değişkenler kodun ilerleyen aşamalarında kendini anlatamadığı için kafa karıştırabilir.

Böyle yapılan bir isimlendirme değişkenlerin ne işe yaradığını çok net bir şekilde açıklıyor.

Kısaltmalar İşi Zorlaştırabilir

Çeşitli fonksiyonlarda, classlarda, değişkenlerde okuyamayacağımız ve anlayamayacağımız şekilde kullandığımız kısaltmaları kullanmak kodda kaybolmamıza sebep olabilir.

Bu kod parçasında fonksiyon isimlendirmemize baktığımızda hiçbir şey anlaşılmıyor. İstenen değişkenlerin ne olduğu bile belirsiz. Kendiniz bile bu fonksiyona baktığınızda ne işe yaradığını anlayamayabilirsiniz.

Kısaltmalardan kurtulduğumuzda ise ortaya fonksiyonun ne yaptığı anlaşılabilir bir kod parçası çıkıyor.

Bazen benzer değişkenlerde farklı olması için hızlıca harflerin yanına sayılar koyabiliyoruz. Ama böylesi bir durum sorun yaratabilir.

Bu kod parçasında alan hesaplama için kullanılan a1, a2 ve s değişkenlerinin ne olduğunu bu fonksiyona bakarak anlamak oldukça zor. Bu değişkenleri ileride kullanırken ne olduğunu anlayamadığımız için sıkıntı yaratabilir.

a1, a2 ve s değişkenleri böyle bir isimlendirmede anlam kazanmış olur ve ileride isimlendirme karmaşasından dolayı karşımıza çıkacak sorunları önler.

Aranabilir İsimler Kullanmak Karmaşıklığı Önler

Bazen kodumuzda tek harfli değişkenler kullanırız. Bunlar döngü içinde kullanıldığında (Örneğin dizi indislerini gezmek için kullandığımız i değişkeni) problem oluşturmayabilir. Fakat bunları aşağıdaki gibi kullanırsak ortaya daha kısa fakat anlaşılmayan değişkenler çıkar.

Böyle bir kullanımda kodun okunabilirliği ve anlaşılabilirliği büyük ölçüde azalır.

Bu şekilde bir kullanım kodun daha anlaşılabilir olmasını sağlar.

Gereksiz Kelimelerden Kaçının

Örneğin burada Müşteri Bilgileri için oluşturduğumuz struct’ın içine tekrardan MusteriAdSoyad isimli değişken oluşturulmuş. Struct’ın ismi zaten neye ait bilgileri tuttuğunu gösteriyor.

Değişken isimlerini Müşteri Bilgileri struct’ının içinde bu şekilde tutmak hem gereksiz uzunluktaki tanımlamalardan bizi kurtarır hem de kodun daha temiz olmasını sağlar.

Benzer Anlamlar Kafa Karışıklığına Yol Açar

Örneğin Customer isimli bir class oluşturulmuş olsun. CustomerInfo ve CustomerData şeklinde de kullanmış olduğumuz isimler olsun. Bu kullanım şekilleri kafa karışıklığına yol açar.

MusteriBilgileriAl ve MusteriVerileriniAl fonksiyon isimlendirmeleri arasında ne fark olabilir ki? Böyle kullanımlar sıkıntılara yol açacaktır. Bu tür kullanımlardan kaçınmalıyız.

Class İsimlendirmeleri

Class isimleri bir fiil olmak yerine isim veya isim tamlamaları olmalıdır. Çünkü aynı tür metotları ve değişkenleri içinde barındırır. Class’ın ismi bu tür yapıların ortak özelliğini gösteren türde bir isim olmalıdır.

Method ve Fonksiyon İsimlendirmeleri

Method ve Fonksiyon isimleri isim olmak yerine işlevleri gereği bir fiil veya fiil tamlaması olmalıdır. KayitliUyeleriGetir(); MailleriGetir(); gibi fonksiyon isimlendirmeleri bakıldığında fonksiyonun ne işe yaradığını anlamamızı sağlar.

Boolean İsimlendirmeleri

Booleanlar bize “true” veya “false” değerleri döndürdüğü için isimleri de buna uygun olmalıdır. Örneğin; isOpen, isActive gibi cevabı evet ya da hayır şeklinde olan isimlendirmeler, boolean yapısına daha uygundur.

Saçma İsimler Kullanmaktan Kaçının

Örneğin fonksiyonların isimlendirmelerinde SonDosyaBukucu(), TheFlamethrower(), Explosion() gibi komik isimlendirmeler yerine daha açıklayıcı olan DosyalariSil(), OnbellegiTemizle() gibi isimlendirmeler daha iyi olacaktır.

2.Döngüler

Döngüler yazılımda gerçekten önemli bir araçtır. Fakat döngüleri kullanırken iç içe bir sürü döngü, kötü isimlendirmeler, yanlış döngüler kodu karmakarışık hale getirerek anlaşılabilirliği ve okunabilirliği büyük ölçüde azaltır.

Tekrar Etmekten Kaçının

Tekrar eden kod satırları hem yazan kişiyi bıktırır hem de kodun anlaşılabilirliği ve okunabilirliğini azaltır. Böyle durumlar yerine döngüleri kullanmak işimizi daha kolaylaştıracak ve okunabilirliği büyük oranda arttıracaktır.

Bu tür veri tanımlamalarında veriler arttıkça kod satırları da bir hayli artacak ve okunabilirliği azaltacaktır.

Veri tanımlamalarını elle sürekli yazmaktansa bir for döngüsü kullanmak artan veri sayılarıyla beraber gelen onlarca kod satırı yerine hem kodu kısaltacak hem de okunabilirliği arttıracaktır.

Do/while döngüsü yerine while kullanmak daha iyi olacaktır

Bir çok dilde olan do/while döngüsü dışardan bakacak biri için kafa karıştırıcı bir durum ortaya çıkarır. Çünkü koşul sağlanabilir de sağlanmayabilir de buna göre kod bloğu çalışabilir ya da çalışmayabilir. Bu tür do/while döngüleri while döngüsüne çevrilebilir. Bu yüzden do/while döngüsü yerine bu tür tercihler daha iyi olacaktır.

Kodun okunabilirliğini arttıracaksa başka döngü kullanın

Örneğin ; Bazı durumlarda sonsuz bir döngüye ihtiyaç yoksa yani sınırları belli olan bir döngüyse bu sınırları açıkça gösteren for döngüsü, while döngüsünün yerine tercih edilebilir. Böylesi bir tercih kodun anlaşılabilirliğini önemli oranda arttıracaktır.

Burada sınırları belli bir şekilde dizi indislerini yazdıracaksak while döngüsü kullanmak yerine aşağıdaki gibi bir for döngüsü tercih edilmelidir.

Böyle bir durumda while döngüsünün yerine for döngüsünü kullanmak kodun anlaşılabilirliğini arttıracaktır.

3.Fonksiyonlar

Kodumuzda olmazsa olmaz fonksiyonlar uzadıkça uzuyorsa, karmakarışık birden fazla işlev yapıyorsa, sürekli kendini tekrar eden kod satırlarından oluşuyorsa, isimlendirmesi de ne yaptığı hakkında en ufak bir ipucu bile vermiyorsa o fonksiyon kodun ilerleyen safhalarında bize çok büyük bir fatura çıkarabilir.

Fonksiyonlar Olabildiğince Kısa Olmalıdır

Fonksiyonlarımızın uzamasının önemli bir sebebi fonksiyon içinde kendimizi tekrar etmemizdir. Bu tekrar sebebiyle fonksiyon uzadıkça uzar ve fonksiyonun anlaşılabilirliğini büyük ölçüde azaltır. Fonksiyonlarımızda kendimizi asla tekrar etmemeliyiz. Bu sadece fonksiyonlar için de geçerli değildir. Genel olarak tüm kod içeriğimizde kendimiz tekrar etmekten kaçınmalıyız. Kısaca kodumuz eğer çok uzun satırlardan oluşuyorsa bu fonksiyonu nasıl daha küçük parçalara ayırabilirim diye düşünmek iyi bir tercih olacaktır.

Fonksiyonların Tek İşlevi Olmalıdır

Fonksiyonlarımız sadece ve sadece bir işlevi yerine getirmeli ve bu işlevi de en iyi şekilde yerine getirmesi gerekmektedir. Çünkü o fonksiyonu ileride çağıracak olan kişi ismine göre tek bir işlev için çağıracaktır. Fonksiyonu çağıran kişi başka işlevler yapmasını elbette istemeyecektir. Böyle bir durumda geriye dönüp o fonksiyonu tekrar tekrar kontrol etmek ise zaman kaybı olacaktır. Kısaca fonksiyonun birden fazla işlevi yerine getirmesi kodu karmaşıklaştıracak ve takibini zor bir hale getirecektir.

Fonksiyonların İsimleri Ne Yaptığını Anlatmalı

Fonksiyonları çağırırken ismiyle çağırırız. Eğer fonksiyonun ismi ne yaptığını anlatmıyorsa o fonksiyona geri dönüp tekrar tekrar ne yaptığını anlamak zaman kaybından başka bir şey olmayacaktır. Bu yüzden fonksiyonlarımızın ismi kendini anlatır nitelikte ve net olmalıdır.

Az Parametre Kullanılmalı

Fonksiyonlarda kullandığımız parametre fazlalığı hangisi ne işe yarıyordu diye düşündürerek kafa karışıklığına sebep olabilir. Aynı zamanda bu fazlalık fonksiyonun birden fazla işlevi olmasına işaret olabilir. Bu yüzden bu durumu gözden geçirmek gerekebilir. Bir fonksiyonda parametre sayısını mümkün oldukça 0-2 arasında tutmakta fayda var.

4.Koşullar

Koşullar bir takım kontrollerimizi ve kodun düzgün şekilde işlemesini sağlayan önemli parçalardan birisidir. Koşullarımızı gereksiz ifadelerle doldurmak, koşulları iç içe karmaşık bir şekilde tutmak kodun anlaşılabilirliğini ve okunabilirliğini azaltacak ve kodu inceleyen bir kişide kafa karışıklığından başka bir şeye sebep olmayacaktır.

Argüman Sırası

Örneğin bir karşılaştırma yaparken sözlü olarak karşılaştırmayı nasıl yapıyorsak kodumuzda da karşılaştırmayı o şekilde yapmak koşulların okunmasını kolaylaştıracak kısaca kodun akmasını sağlayacaktır.

5 ton bir kamyonun ağırlığından büyük ve eşitse demek yerine,

Bir kamyonun ağırlığı maximum 5 ton olmalıdır ifadesi, günlük konuşma dilimize daha yakın olduğu için böylesi bir kullanım kodun okunabilirliğini kolaylaştıracaktır.

Koşullarda Boolean Kullanımı

Koşullarımızın içinde hali hazırda boolean olan bir değeri tekrar true veya false ‘a eşitlemek gereksiz bir karmaşıklık oluşturacaktır.

Onun yerine böyle bir kullanım tercih edilmelidir.

Boolean değerlere değişken sonuçlarımızı direkt atayabileceğimiz için uzun kodları tek bir satırda yazabilmemize olanak sağlar.

Bu kod kolayca anlaşılabilir bir kod. Fakat bu kodu tek bir satırda yazabiliyorsak gereksiz uzatmaya gerek kalmaz.

Böylesine bir kullanım kodun anlaşılabilirliğini daha da arttıracak ve bizi uzun kod satırlarından kurtaracaktır.

Böylesine uzun koşullar anlaşılabilirlik konusunda kafa karışıklığına yol açacak ve kodun okunabilirliğini azaltacaktır.

Boolean kısa devre kullanımı ise böyle bir kullanımı daha kolay anlaşılabilir bir hale getirecektir.

If/else Blok Sıralaması

Genel olarak bir if koşulunda pozitif bir durumu ele alarak işlem yapmak bize daha kolay gelir.

Böylesi bir negatif kullanım en başta kod parçası anlaşılmaya çalışırken kafa karışıklığını yol açabilir.

Pozitif bir kullanım böyle bir koşul için daha uygun bir tercih olacaktır.

Üçlü (Ternary) Operatör Kullanımı

Üçlü operatör bize koşullarda kısalık sağlar. Uzun satırları kısa hale getirmek ise kodun okunabilirliğini arttıracaktır.

Bu şekilde bir koşulu daha da kısaltmak için Üçlü operatörü kullanabiliriz.

Üçlü operatör kullanımı kodumuzu kısaltacak ve okunabilirliği arttıracaktır. Fakat uzun ve karmaşık ifadelerde üçlü operatör kullanımı kafa karışıklığından başka bir şeye yol açmayacaktır.

İç içe if Kullanımı

İç içe geçmiş bir kodun okunabilirliği ve anlaşılabilirliği çok çok azdır.

Her bir if fonksiyonunu ayrı ayrı yazıp return etmek gerçekten okunabilirliği büyük oranda arttırıyor.

5.Yorum Satırları

Yorum satırları gerekli kullanımlarda gerçekten yol gösterici araçlardır. Ama bu satırların gereksiz kullanımı kodu karmaşık bir hale getirebilir. Genelde yorum satırı kötü kodumuzu azıcık da olsa perdelemek için kullanılır. Unutmayın iyi kodlar kendini açıklar.

Yorum satırı değil isimlendirmeleriniz kendisini anlatsın

Eğer isimlendirmeleriniz kendini anlatmıyor ve yorum satırlarına ihtiyaç duyuyorsa o kodu yeniden yazmaktan kaçınmayın. Çünkü böylesi bir koda yorum satırı yazmak o kodun kötülüğünü örtmeye çalışmaktan başka bir işe yaramayacaktır.

Burada aktiflik bir değere atanmış fakat değer bir sayı ve burada bir yorum satırı olmazsa o değerin ne olduğunu gerçekten anlayamayız.

Böyle bir isimlendirme yaparsak ne yorum satırına gerek kalır ne de başka birinin gelip burada ne yaptığını anlatmasına. Kod zaten kendini anlatıyor.

Gereksiz Yorum Satırlarından Kaçının

Kod ne yaptığını anlatırken bir de yorum satırı kullanmak gereksizlikten başka bir şey değildir.

Zombie Code

Zombi Kod kullanılmayan kod parçasının yorum satırı içine alınmasıyla ve orada öylece durmasıyla oluşan kafa karıştırıcı bir unsurdur. Diğer geliştiricilere kodu anlamaya çalışırken gereksiz sorgulama yaptıran bir unsurdur. Kodun okunabilirliğini azaltır ve boşa zaman kaybına sebep olur.

Yasal Yorumlar

Kurumsal kodlama standartlarından kaynaklı olarak telif hakkı, yazarlık gibi durumlar gerekebilir. Böylesi metinlerin kodun başına yorum satırı şeklinde konulması faydalı olacaktır.

Şimdi anlatılan bilgilerle örnek bir kodu inceleyelim

Örnek kodumuza baktığımızda clean code ilkesine göre gözümüze çarpan birkaç şey bulunuyor;

İsimlendirme

Kodu biraz uğraşarak incelediğimizde bu kod faktöriyel hesabı yapıyor. Fakat faktöriyel hesabı yaptığımız değişken olan “digerSayi” değişkeni sanki başka bir sayı daha alıyoruz algısı yaratıyor. Bunun yerine bu değişkene “faktoriyel” ismini atasak kod daha anlaşılabilir olur.

Döngüler

Kodu incelediğimizde sınırları belli olan bir while döngüsü görüyoruz. Sınırları belli olan bir döngüde while döngüsü yerine for döngüsü kullanmak sınırları rahatça görebilmemizi sağlayarak kodun okunabilirliğini ve anlaşılabilirliğini arttıracaktır.

Yorum Satırları

Kodu incelediğimizde birden fazla yorum satırı görüyoruz. Fakat bu yorum satırları amacından uzaklaşarak tamamen gereksiz yorum satırlarına dönüşmüş. Çünkü açıklama yapılan kod satırları ne yaptığını zaten anlatıyor. Bu yorum satırlarını kaldırmamız kodun okunabilirliği açısından faydalı olacaktır.

Şimdi eleştirilerimize uygun bir şekilde kodumuzu yeniden düzenleyelim.

Gerekli düzeltmeleri yaptığımızda elimizde daha basit, anlaşılabilir ve okunabilirliği yüksek olan bir kodumuz oldu.

Özetleyecek olursak

Clean Code İlkesini kullanmak kodumuzda basitlik, anlaşılabilirlik ve okunabilirlik sunar. Bu faydalar sayesinde de hem kendimize hem de ekibimize zaman, motivasyon ve kolaylık anlamında kayda değer faydalar sağlar.

Kaynakça

[1]Doç. Dr. Deniz KILINÇ “Yazılım Mühendisliği Temelleri Ders Notları”, Bakırçay Üniversitesi
[2]https://medium.com/@busrauzun/clean-code-kitabindan-notlar-1-temiz-kod-derken-44e6f7a27eb0
[3]https://medium.com/@kadircolak1999/clean-code-nedir-eeac3cb489cd
[4]http://cagataykiziltan.net/tr/clean-code
[5]https://blog.kmk.net.tr/clean-code-nedir
[6]https://burakekici.com/clean-code/
[7]https://www.freecodecamp.org/news/clean-coding-for-beginners/
[8]https://github.com/JuanCrg90/Clean-Code-Notes
[9]https://www.yazilimgelistiricileri.com/temiz-kod-nedir/
[10]https://github.com/ryanmcdermott/clean-code-javascript#introduction
[11]https://medium.com/@busrauzun/https-medium-com-busrauzun-clean-code-kitabindan-notlar-2-anlamli-isimlendirmeler-de309168e13e
[12]https://medium.com/@bsrutmn/clean-code-derken-393898b3b161

--

--

Alperen Çorak
Yetkin Yayın

Computer Engineering Student at Izmir Bakircay University