CLEAN CODE

Utku Aydın
11 min readApr 19, 2021

--

Clean Code (Temiz Kod) Nedir?

Kendimize bu sorunun cevabını şu şekilde verebiliriz “Öyle bir kod yaz ki herkes anlasın.” dediğimizde ortaya çıkacak olan kod stili temiz koddur. Temiz kod yazmak, kodu özveri ve incelikle yazma işidir aslında. Bir kod türü değil kod yazma etiğidir temiz kod. Herhangi bir alanda kod yazarken dikkat etmemiz gereken ve uygulandığı zaman, süreçle birlikte kodun ileriki aşamalarındaki karmaşıklığın önüne geçilmesini, kodun üzerinde takım olarak çalışılmasını ve kodun okunabilirliğini arttıran genel kod yazma biçimidir.

Temiz kodu aslında bir sanat olarak da değerlendirebiliriz. Çünkü gerçekten iyi yazılmış bir kod dikkat edilmesi gereken birçok ince noktayı barındırmaktadır. Bunu yapmak, kodu yazan kişinin koda gösterdiği değerle doğru orantılı olarak artar. Tüm bu incelikler yalnızca kodun kendisiyle de sınırlı kalmaz daha birçok alanda kodun işlevselliğini arttırır. Bu işlevselliğin en büyük sebebi kodun kendini anlatmasında yatmaktadır.

Temiz kod kısaca şu şekilde ifade edilebilir. Kendini anlatan koddur temiz kod. Bizim kodu bir başkasına anlatmamıza gerek kalmadan kodun kendini o kişiye anlatmasıdır.

Kodun Temizi Mi Olur?

İşte bu noktada birçok kişi fikir ayrılığına düşebilir. Ama evet, kodun temizi olur. Öncelikle şunu belirtmekte fayda var. Kişiden kişiye kodun yazılış şekli, kullanılan elemanların tasarımı gibi birçok faktör kodda değişiklik gösterebilir. Ama çoğu açıdan bir kodda olması gerekenler zaman içinde belirlenmiştir. Bunların belirlenmesinde çeşitli etkenler vardır. Sonuçta biz bir kod yazıyoruz ve bu kod aynı zamanda bir üründür. Ve bu ürün başlı başına bir problem gibi ele alınmalıdır. Bizim bu ürünü ortaya koyarken bir problemle karşı karşıya olduğumuzu bilmemiz gerekir. Bu problemi çözmek yalnızca bizi bir adım ileri taşır. Fakat bu yazılım ürününün ilerleyen süreçlerde bakıma, hata düzeltmelerine, büyük veya küçük çaplı geliştirmelere ihtiyaç duyacağını bilmeliyiz. Bizi karşılaştığımız bu adımlarda yazdığımız kodun rahatlatması gereklidir.

Düşünün, tüm fonksiyonları ve kendisinden beklenilen her şeyi muazzam bir şekilde karşılayan bir kodumuz var. Fakat bu kod yazılırken temiz kod etiğine uygun bir şekilde yazılmamış. Peki bu kod bize ne tür hatalarla geri döner? İşte bizim de en çok dikkat etmemiz gereken nokta bu. Kodu yazarken bizden istenen anlık gereksinimler değil, istenebilecek ve ihtiyaç duyulabilecek gereksinimleri de hesaba katmamız gerekir. Harika yazılmış bir kod da olsa zamanla bu kod gelişecek ve gittikçe şişmeye, daha çok işleve sahip olmaya başlayacak. Bu süreçte kodun işleviyle birlikte karmaşıklığı da artacaktır. Hatta bir süre sonra koddaki geliştirme ve düzeltmeler zamanında hazır olmamaya başlayacaktır. En başında harika olan bu kod zamanla üzerine uğraşılmaktan çekinilen bir kod haline gelecektir. Kodu geliştiren insanlar da kodu anlatmak zorunda kalacaktır. Böylece en önemli kaynağımız olan zamanla birlikte daha birçok kaynağı da gereksiz yere kullanacağız ve ürünün maliyetleri de artmış olacaktır.

Clean Code Sanatı

Temiz kod yazmanın inceliklerinden de bahsetmezsek olmaz. Önemini bu kadar vurguladığımız temiz kodun kendi içinde yapılması ve yapılmaması gereken noktalarının neler olduğunu belirtmemiz gerekmektedir. İşte yazılım sürecini, projenin piyasaya sürüldükten sonraki süreci ve kodun kişiler arasındaki aktarımını bu kadar kolaylaştıran temiz kodun püf noktaları şu şekildedir;

Ø Basitlik: Belki de kod yazarken en çok dikkat etmemiz gereken nokta budur. Yazdığımız kodun basit olması gerekmektedir. Mesela gerektiği kadar fonksiyon ve değişken kullanılmalı, karmaşık değişken ve tanımlamalardan kaçınılmalı, ele alınan sorun daima en temeline inilerek ve en basite indirgenmiş haliyle çözüme ulaştırılmalıdır. Unutmayın çok fazla kod yazmak değil yeterli ve gerektiği kadar kod yazmak önemlidir.

Ø Kod Tasarımı: Kodun içerisinde yer alan sınıflar (değişkenler, fonksiyonlar, struct yapıları vb.) bir arada tutulmalı ve anlamsız kod satırlarında bulunmamalıdır. Kodun elemanları arasındaki bağımlılık minimum düzeyde olmalıdır. Gerekirse koddaki her modül yalnızca bir veya iki modülle bağlantılı olmalıdır ve bu bağlantılar bu modülün doğrudan bağlantılı olduğu modüller olmalıdır. Kod içerisinde sabit yapılar yerine yapılandırılabilir unsurlar kullanılmalıdır. (if-else, switch-case vb.)

Ø Tutarlılık: Yazmış olduğumuz kod kendi içinde tutarlı olmalıdır. Kod içerisindeki yerine getirdiğimiz bir şeyi, diğer yerlerde de aynı şekilde yerine getirmeliyiz. Böylece kod içinde nerede hangi işlemi yaptığımızı ve bu işlemi yaparken nasıl bir yapı kullandığımızı kodun çeşitli yerlerinde kolayca ayırt edebiliriz.

Ø Açıklık: Değişkenlerimiz açık ve anlaşılır biçimde tanımlanmalı. Kullandığımız koşulları, bu koşulların içindeki elemanları ve sınıfları bir arada tutmalıyız. Her bir sınıf kendi içinde anlaşılabilir olmalıdır, başka bir sınıfa bağımlılıktan kaçınılmalıdır. Olumsuz koşullar yerine olumlu koşullar tercih edilmelidir. İnsanın günlük hayatta kullanmaya yatkın olduğu şekilde ve konuşma diline yakın yapılar tercih edilmelidir.

Ø İsimlendirme: Kod içerisindeki değişkenler, fonksiyonlar vb. her şey hizmet ettiği amaca göre, açıklayıcı ve net bir biçimde isimlendirilmelidir. Kısa ve anlamlı isimler kullanılmalıdır. Yanlış ve hizmet edilen amaca yönelik yapılmayan isimlendirmeler kodun anlaşılmasını zorlaştırır, okunabilirliğini azaltır.

Ø Yorum Satırları: Yorum satırı kodun kendini anlatamadığı durumlarda bizim onu anlatmamız demektir. Bu da temiz kodun asıl amacına ters düşer. Bu yüzden gereksiz yorum satırı kullanmaktan kaçınmamız gerekmektedir. Kod kendini açıklayabilmelidir. Sınıfları kapsüllerken kullanmak gibi yalnızca belirli başlı alanlarda, kısa ve öz şekilde kullanılmalıdır. Kodun kendinde açıkça belirtilebilecek hiçbir yerde yorum satırı kullanılmamalıdır.

Ø İşlev: Yazdığımız kod hızlı, okunabilir, tekrarlanabilir ve kendi kendine yeten bir kod olmalıdır. Tüm bunlar için kodun yapısının karmaşıklıktan uzak, gereksiz veri içermeyen ve iyi tanımlanmış yapılar barından bir şekilde olması gerekir.

Clean Code Nasıl Olmamalı?

Temiz kod;

· Karmaşık

· Anlaması zor

· Değiştirilmesi zor

· Fazla tekrar içeren

· Kendi içinde fazla bağımlılık içeren

· Tekrar kullanılabilirliği düşük

Olmamalıdır.

Clean Code Yazarken…

Temiz bir kod yazarken dikkatli olmamız gereken bazı noktalar vardır. Bunların olması gereken halleriyle birlikte olmaması gereken hallerini de ele almamız gerekir. Bu şekilde kodun temelinde nasıl bir mimari tasarım olması gerektiğini ve yapılan doğru veya yanlış şeyleri anlamış oluruz. Gelin bu önemli noktaları basitçe örneklendirerek ele alalım.

İsimlendirmenin Önemi:

İsimlendirmenin temelinde anlaşılabilirlik vardır. Kodun içerisinde kullanılan değişkenler, fonksiyonlar, sınıflar gibi tüm elemanların isimleri yaptıkları işlere uygun, kısa, yeterli ve net bir şekilde tanımlı olmalıdır. Yanlış ifade edilmiş değişkenler kodun okunabilirliğini azaltırken bizden sonra bu kodla uğraşacak kişiler varsa onların da kodu anlamaları için ek bir çaba harcamaları gerekir. Kısacası isimlendirme amacına uygun ve yeterli düzeyde kullanılmalıdır.

Anlaşılabilir Olmalıdır:

Doğru;

Örneğin yukarıda gördüğümüz kodda gayet yeterli ve anlaşılabilir isimlendirmeler kullanılarak “x” ve “y” ifadelerinin toplama işlemi gerçekleştirilmiştir. Hem fonksiyon hem de tanımlı değişkenler amacına hizmet eder biçimlerde tanımlanarak iyi bir isimlendirme yapılmıştır.

Yanlış;

Fakat bu koddaki isimlendirmeler yeterli düzeyde yapılmamıştır. Çünkü bu koda bakan bir kişi kodu anlamak için yalnızca yapılan işlemin üzerine düşünerek zaman kaybeder ve yapılan isimlendirmeler değişkenlerin neleri ifade ettiğini o kişiye anlatamaz. Aynı şekilde fonksiyon için yapılmış olan isimlendirme de bu fonksiyonun ne amaca hizmet ettiğini göstermemektedir.

Yeterli Uzunlukta Olmalıdır:

Doğru;

Bu örneğimizde isimlendirme yeterli uzunlukta ve ifade etmek istediği şeyin anlaşılabileceği düzeyde yapılmıştır.

Yanlış;

Bu isimlendirmelerde dikdörtgenin uzun ve kısa kenarlarının uzunluklarıyla birlikte karenin bir kenarının uzunluğu ifade edilmek istenmiştir fakat anlaşılamayacak kadar kısa bir isimlendirme olduğu için kodu anlaşılması zor bir hale getirmektedir.

Yanlış;

Burada isimlendirmeler açık bir biçimde yapılmıştır fakat ifade etmek istediği şeyin gerektirdiğinden daha uzun biçimde yapılmıştır.

Büyük – Küçük Harfe Dikkat Edilmelidir:

Doğru;

Yukarıdaki örnek büyük – küçük harflere dikkat edilerek yapılmış, anlaşılabilir ve yeterli uzunlukta bir isimlendirmedir.

Doğru;

Büyük – küçük harf kullanılarak ya da kullanılmadan yalnızca “_” gibi özel işaretler kullanılarak anlam bütünlüğünü koruyucu şekilde bölünerek de isimlendirmeler yapılabilir.

Yanlış;

Burada yapılan isimlendirme içerisinde büyük – küçük harf ayrımı barındırmamakla birlikte bunun alternatifi olarak kullanılabilecek özel işaretler de barındırmamaktadır ve okunabilirliği düşüktür. Bu sebeple yanlış bir isimlendirmedir.

Yalnızca isimlendirmelerde yapılan bu değişiklikler kodu olduğundan daha karmaşık ya da daha anlaşılır hale getirebilmektedir. Kodun içindeki küçük ya da büyük her türlü karmaşayı önlememiz gerektiğini unutmamalıyız. İsimlendirmeler çoğu zaman halledilebilir bir sorun gibi ya da dikkat etmediğimiz önemsiz şeyler gibi gelseler de kod büyüdükçe daha da problemli bir hale bürünerek bize sorun çıkartabilirler. Bu sebeple isimlendirmeleri yaparken daha özenli davranmamız gerekmektedir.

Koşul Kullanımı:

Koşullar kodun yol ayrımları gibi değerlendirilebilir. Koşullar kodun organizasyonu için vazgeçilmezlerdir. Aslında koşullara koddaki tercihlerimizdir de diyebiliriz. Çünkü koşullar bize kodda komplike işlemleri tek bir çatı altında toplayarak değerlendirip bir değer döndürmemizi ya da bunlar üzerinden koda farklı şekillerde devam etme olanağı sağlar. Koşulların gereksiz ya da yanlış kullanımı kodu oldukça sıkıntıya sokacaktır. Eğer koşulları gereksiz derecede fazla kullanırsak süreçle birlikte boyut açısından gelişecek olan kod yavaşlamaya ve fonksiyonlarını daha güç yerine getirmeye başlar. Eğer koddaki fonksiyonları yanlış kullanacak olursak da kodun gidişatını ve yapılan işlemler sonucu alınan kararların yanlış algılanmasını sağlayarak kodun çıktısını değiştirebilir hatta kodun çalışmamasını bile sağlayabilir.

Argüman Sırası:

Doğru;

Argümanlardaki sıra günlük hayatımızda kullandığımız şekline yakın olmalıdır. Yani dilimizde ifade ettiğimiz şekillere benzer şekilde sıralanmalılardır. Burada “Eğer yaşınız 19’dan büyük veya 19’a eşitse” şeklinde bir koşul ifadesi kullanılmıştır. Bu ifade günlük hayatta kullandığımız şekline yakın bir kullanımdır.

Yanlış;

Burada “19 yaşınızdan küçük veya eşitse” şeklinde bir anlam içeren koşul ifadesi kullanılmıştır bu sebeple günlük hayatımızdan alışık olduğumuz dile farklılık göstermektedir. Tercih etmememiz gereken bir kullanımdır.

İf/else Blok Sırası:

Doğru;

Burada da aynı şekilde “Eğer a = b ifadesi doğruysa işlem 1’i yap, yanlışsa işlem 2’yi yap” ifadesi kullanılmış ve bu ifade günlük hayatımıza daha yakın bir ifade olduğu için kullanımı daha doğrudur.

Yanlış;

Fakat bu kod satırında önce yanlış ifade için işlem yapmamız istenmiş yani “Eğer a = b ifadesi yanlışsa işlem 2’yi yap, doğruysa işlem 1’i yap” şeklinde ifade edilmiş ancak insanlar günlük hayatta pek tercih etmediği bir ifade olduğu için yapılmaması gereken bir şeydir. Çünkü pozitif bir ifadeyle uğraşmayı negatif bir ifadeyle uğraşmaya tercih ederiz.

İç İçe İf Koşulları:

Doğru;

Bu örnekte koşul ifadeleri ayrı ayrı kullanılarak yapılar anlaşılır bir biçimde oluşturulmuştur.

Yanlış;

Fakat bu örnekte ise koşul ifadeleri iç içe geçmiş bir biçimde bulunmaktadır. Bu yapı oldukça anlaşılması güç bir şekildedir ve okunabilirlik açısından başarısız bir kod satırıdır. Bu sebeple yanlış bir kullanımdır.

Üçlü Şart (Ternary) Operatörü:

Bu kullanımda koşul ifadesi üç tane argüman alır. Bu operatör oldukça kısa ve basit bir biçimde yazılabilir. Kullanımı da oldukça kolaydır. Koşul ifadeleri için iyi bir alternatiftir.

Bu şekilde kullanımına rastladığımız bir koşul ifadesini üçlü şart operatörüyle çok daha kısa biçimde yazabiliriz.

  1. Alternatif:

Bu kullanımı aşağıdaki şekilde de yazabiliriz.

2. Alternatif:

Gördüğümüz gibi iki farklı kullanım da ilk başta rastladığımız koşul ifadesini oldukça kısalttı. Eğer üçlü şart operatörünü kullanmasaydık kod daha uzun olacaktı.

Kısa Devre Mantığı:

Kısa devre mantığını boolean operatörler oluşturur. Bunlar “ && ve || ” şeklinde gösterilirler.

a) if( a || b ) ifadesinde a doğru olursa b tarafı hesaplanmaz.

Çıktı;

Eğer || operatörü yerine | operatörü kullanılırsa çıktı da değişir. Bu şekilde ilk ifadede ikinci koşulun değerlendirilmediğini görebileceğiz

Çıktı;

b) if( a && b ) ifadesinde a yanlış olursa b tarafı hesaplanmaz.

Çıktı;

Eğer && operatörü yerine & operatörü kullanılırsa çıktı da değişir. Bu şekilde ilk ifadede ikinci koşulun değerlendirilmediğini görebileceğiz.

Çıktı;

Gördüğümüz gibi eğer “ & ve | ”operatörleri yerine “ && ve || ” kullanırsak ikinci koşullar değerlendirilmiyor. Bu operatörleri ikinci koşulların değerlendirilmesinin öncelikli bir durumda olmadığı zamanlarda kullanabiliriz.

Yani;

“ & “ operatörüyle çalışacağımız zaman ” && “ operatörünü kullanabilir ve yanlış olması muhtemel koşulu sol tarafa koyarak işlemi hızlandırabiliriz.

“ | “operatörüyle çalışacağımız zaman ” || “ operatörünü kullanabilir ve doğru olması muhtemel koşulu sol tarafa koyarak işlemi hızlandırabiliriz.

Eğer ifadenin her iki koşulunun da çalışmasını istiyorsak “ & “ veya ” | “ operatörlerinden yapmak istediğimiz işleme uygun olanını seçip kullanabiliriz.

Döngü Kullanımı:

Döngüler kodda oldukça sık kullanılan ve işimizi oldukça fazla kolaylaştıran ifadelerdir. Kodun uzamasını ve karışık bir hal almasını önler. Ama döngülerin içerisinde de kullanılmaması gereken yapılar vardır.

Do/while Döngüsü:

Bu döngü kullanımı pek önerilmeyen bir yapıdır. Çünkü kafa karıştırıcı ve hata yapmaya neden olabilecek bir yapıya sahiptir. Mümkün oldukça do/while döngüsünü kullanmaktan kaçınmalıyız. Neyse ki tüm do/while döngü yapıları while döngüsü şeklinde yazılabilmektedir. While döngüsünü tercih etmek daha az kafa karıştırıcı ve kullanımı daha kolay bir yapı oluşturmamıza yardımcı olacaktır.

Doğru Tercih;

Burada Covid’in değeri 1’e eşitken “Covid Pozitif” ifadesini yazdırmamız gerektiğini anlamak oldukça kolaydır ve iyi bir döngü kullanımıdır.

Yanlış Tercih;

Fakat bu örnekte ise önce yapmamız gereken şeyi bize söylüyor ve daha sonrasında bu şeyi hangi koşullarda yapmamız gerektiğini belirtiyor. Bu kullanım işimizi oldukça karmaşık bir hale getiriyor ve döngü kurulurken hata yapma olasılığı da büyük oranda artmış oluyor.

Yorum Kullanımı:

Yorum kullanımı bazı zamanlarda gerçekten gerekli olsa bile genel olarak tercih edilmemesi gereken bir şeydir. Çünkü yorum satırı kullanmak temiz kodun anlamına ters düşmektedir. Dediğimiz gibi kodun kendini anlatması gerekirken yorum satırları kullanarak biz onu anlatmış oluyoruz. Yapabiliyorsak hiçbir yerde yorum satırı kullanmadan anlaşılabilecek ölçüde bir kod yazmamız gerekmektedir.

Doğru;

Örnekteki kod oldukça kısa, anlaşılabilir ve okunabilirliği yüksek bir şekilde yazılmıştır.

Yanlış;

Fakat bu kodun anlaşılabilmesi için ek bir yorum satırına ihtiyaç duyulmuştur. Temiz kodun standartlarına uymayan bir kullanımdır.

İstisna;

Tabi kodda yorum satırı bulundurmanın zorunlu bir hale geldiği durumlar da vardır. Bazı zamanlarda kurumsal kodlama standartları yasal sebeplerden ötürü bizi kesin yorumlar yazmaya zorlar. Örneğin telif hakkı (copyright) ve yazarlık (authorship) durumları gereklidir ve her kaynak dosyasının başına böyle bir yorum koymak mantıklıdır.

Neden Clean Code Yazalım Ki?

Gelelim en temel soruya “Neden clean code yazalım ki?”. Temiz bir kod hem bireysel hem de kurumsal projeler için birçok avantaj sağlıyor. Temiz kod yazmanın bize hiçbir zararı olmamakla birlikte sayılamayacak kadar yararını göz ardı etmek biraz saçma olur sanki. Peki neydi bu faydalar? Gelin en temel olanlarını hatırlayalım.

1-) Kodun karmaşıklığını önler.

2-) Okunabilirliği arttırır.

3-) Kodu kısaltır.

4-) Kodun içindeki yapıların sınıflandırılmasını ve ilgili yapıların bir arada tutulmasını (kapsülleme) sağlar.

5-) Projelerin zaman ve maliyetini azaltır.

6-) Kodun bir kişiden başka bir kişiye aktarılmasını sağlayarak üzerine çalışılması kolay bir kod ortaya çıkmış olur.

7-) Hata miktarını azaltır.

8-) Kodun ve üzerine çalışanların organizasyonunu arttırır.

9-) Kodun herkes tarafından anlaşılmasını sağlar.

İşte gördüğümüz gibi genel olarak temiz kodun faydaları bunlar. Bir kodda olması gereken en önemli özellik de o kodu herkesin anlayabilmesidir. İşte bunu ve birçok faydalı özelliği temiz kodla sağlayabilirken neden temiz kod yazmayalım ki?

Kaynaklar;

https://medium.com/@busrauzun/clean-code-kitabindan-notlar-1-temiz-kod-derken-44e6f7a27eb0

https://ufukuzun.wordpress.com/category/clean-code/

https://github.com/JuanCrg90/Clean-Code-Notes

https://gist.github.com/wojteklu/73c6914cc446146b8b533c0988cf8d29

--

--