Temiz Kod (Clean Code) Nedir ve Nasıl Yazılır?

İşlevler tek bir şey yapmalıdır. Bunu iyi yapmalıdırlar. Sadece bunu yapmalıdırlar.

Temiz kod basit ve doğrudandır. Temiz kod, iyi yazılmış bir nesir gibi okunur.

Herhangi bir aptal, bir bilgisayarın anlayacağı kodu yazabilir. İyi programcılar, insanların anlayacağı kodu yazar.

Temiz kod, her zaman birisinin gerçekten umursadığı biri tarafından yazılmış gibi görünür.

Kod, yazıldığından çok daha fazla okunur.

Kamp alanını bulduğunuzdan daha temiz bırakın.

Hızlı gitmenin, tek yolu, iyi gitmektir.

Tamamen kendiniz yeniden yazmadığınız koda güvenemezsiniz.

Programlar, insanların okuyabilmesi için yazılmalı, makinelerin çalıştırması ise sadece bir tesadüf olmalıdır.

Test etmek, hataların varlığını göstermek için çok etkili bir yol olabilir, ancak yokluklarını göstermek için tamamen yetersizdir.

Karmaşıklığın başlıca nedeni, yazılım satıcılarının kullanıcıların istediği neredeyse her özelliği sorgusuz sualsiz kabul etmeleridir.

Basitlik, verimliliğin ruhudur.

İçindekiler

Temiz Kod (Clean Code) Nasıl Yazılır?

Temiz Kod (Clean Code) Nasıl Yazılır?

Evet yukarıda okuduğunuz tüm sözler aslında temiz kod yazmanın ne kadar önemli ne kadar can alıcı olduğunun kanıtıdır aslında. Bu sözlerin siz yazılımcı dostlarıma ilham olması, aşağıda yazdıklarımın ise faydalı olması dileğiyle… İyi okumalar!

Temiz kodlama, ilk etapta makine için ve daha sonra kendiniz ve iş arkadaşlarınız için kod yazmanız anlamına gelir.

Yazımıza başlamadan önce bir de uluslararası kod standartlarından 10 tanesine örnek vereyim. Aslında temel mantık her zaman aynı.

Uluslararası Kod Standartları

1. Kendi Kendini Açıklayan Kod (Self-Documenting Code)

Kodun kendisi, ne yaptığına dair net bir açıklama sağlamalıdır. Bu, değişken isimleri, fonksiyon isimleri ve sınıf isimlerinin anlamlı ve açık olmasını içerir.

2. Tek Sorumluluk İlkesi (Single Responsibility Principle)

Her sınıf veya fonksiyon, yalnızca bir sorumluluğa sahip olmalıdır. Bu, bir nesnenin veya fonksiyonun yalnızca bir sebep yüzünden değişmesi gerektiği anlamına gelir.

3. Açık-Kapalı İlkesi (Open/Closed Principle)

Sınıflar, fonksiyonlar veya modüller genişlemeye açık, ancak değişime kapalı olmalıdır. Bu, mevcut kodu değiştirmek yerine yeni işlevsellik eklemek için genişletilebilir olması gerektiği anlamına gelir.

4. Liskov Yerine Geçme İlkesi (Liskov Substitution Principle)

Bir türetilmiş sınıf, temel sınıfın yerine kullanılabilir olmalıdır. Bu, türetilmiş sınıfın temel sınıfın tüm özelliklerini ve davranışlarını koruması gerektiği anlamına gelir.

5. Arayüz Ayrım İlkesi (Interface Segregation Principle)

Kullanıcıların ihtiyaç duymadıkları işlevleri içeren büyük arayüzler yerine, daha spesifik ve küçük arayüzler oluşturulmalıdır.

6. Bağımlılık Ters Çevirme İlkesi (Dependency Inversion Principle)

Yüksek seviyeli modüller, düşük seviyeli modüllere bağlı olmamalıdır. Bunun yerine, her iki modül de soyutlamalara bağlı olmalıdır. Ayrıca, soyutlamalar detaylara bağlı olmamalıdır; detaylar soyutlamalara bağlı olmalıdır.

7. Tekrar Etme (DRY – Don’t Repeat Yourself)

Kodda aynı veya benzer işlevselliği birden fazla kez yazmak yerine, bu işlevselliği tek bir yerde tanımlayın ve yeniden kullanın.

8. YAGNI (You Aren’t Gonna Need It)

Öngörülmeyen ihtiyaçları karşılamak için gereksiz işlevsellik eklemeyin. Yalnızca gerçekten ihtiyacınız olan kodu yazın.

9. KISS (Keep It Simple, Stupid)

Kod mümkün olduğunca basit ve anlaşılır olmalıdır. Gereksiz karmaşıklıklardan kaçının.

10. Kodun Test Edilebilirliği (Testability)

Kod, kolayca test edilebilir olmalıdır. Bu, birim testleri ve entegrasyon testleri için uygun yapılar kullanmayı içerir.

Kodunuz insanlar için kolayca anlaşılabilir olmalıdır. Okuduğunuz her rutin beklediğiniz gibi çıktığında temiz kod üzerinde çalıştığınızı bilirsiniz. Haydi şimdi JavaScript üzerinden anlatacağım Clean Code prensibi üzerine konuşalım.

JavaScript Üzerinden Clean Code Prensipleri

Değişkenlerimi Nasıl Adlandırmalıyım?

Sizden sonra gelecek kişilerin tanımladığınız değişken isimlerini anlamalarını sağlamayı iyi bir miras bırakmak gibi düşünebilirsiniz. Bunu yaparken yazdığınız değişken isminin uzun olmasından da çekinmeyin. Bu konuda tasarruf etmenize hiç gerek yok. Hem bu şekilde ileride kodunuza geri döndüğünüzde veya kodu aratmak istediğinizde, erişim yolunu kolay bir şekilde açmış olursunuz.

Değişkenleri tanımlarken her zaman evrensel olarak düşünmelisiniz. Değişken isimlerini yazarken Türkçe dilini değil, evrensel yazım dili olan İngilizceyi tercih etmelisiniz. İngilizce değişken isimleri kullanmak, kodlama standartlarını ve en iyi uygulamaları takip etmenizi kolaylaştırır. Çoğu açık kaynak projesi ve profesyonel proje İngilizce değişken isimleri kullanır.

Gördüğünüz gibi, İngilizce değişken isimleri kullanarak yazılan kod, evrensel olarak daha kolay anlaşılabilir ve farklı dillerdeki geliştiriciler için daha erişilebilir olur.

JavaScript Üzerinden Clean Code Prensipleri (1)
Fonksiyonlarımızı Nasıl Yazmalıyız?

Bu bölümü tamamen örneklerle ve örnekleri de en yalın haliyle anlatmaya çalışacağım. Fonksiyonları anlamaktan ziyade fonksiyonların nasıl yazıldığını anlamanız en önemlisidir.

JavaScript Üzerinden Clean Code Prensipleri (2)
Clean Code Prensipleri
Clean Code Prensipleri
Clean Code Prensipleri
Clean Code Prensipleri
Clean Code Prensipleri

İlk örneğimizde basit bir login işlemi yapmaya çalışıyoruz.

Değişken Adlarıyla Temiz Kod ve Kötü Kod Arasındaki Farklar

Temiz kod ve kötü kod arasındaki farkları yazımızın başlangıcında anlattığım değişken adları ile inceleyelim;

1. Fonksiyon Adları:

Kötü: u ve p gibi anlamsız parametre isimleri kullanılmıştır.

Temiz: username ve password gibi anlamlı parametre isimleri kullanılmıştır.

2. Girdi Kontrolü:

Kötü: Girdi kontrolü ana fonksiyon içinde yapılmış ve kod karmaşıklığı artırılmıştır.

Temiz: isValidInput fonksiyonu ile girdi kontrolü ayrı bir fonksiyona taşınarak kodun okunabilirliği artırılmıştır.

3. Şifre Kontrolü:

Kötü: Şifre kontrolü ana fonksiyon içinde yapılmış ve kod karmaşıklığı artırılmıştır.

Temiz: isPasswordCorrect fonksiyonu ile şifre kontrolü ayrı bir fonksiyona taşınarak kodun modülerliği sağlanmıştır.

4. Loglama:

Kötü: Loglama ana fonksiyon içinde yapılmış ve tarih formatlama işlemleri kodu karmaşık hale getirmiştir.

Temiz: logMessage fonksiyonu ile loglama işlemi ayrı bir fonksiyona taşınarak kodun anlaşılabilirliği artırılmıştır.

5. Kodun Okunabilirliği ve Bakımı:

Kötü: Tek bir fonksiyon içinde çok fazla işlem yapılmış, bu da kodun bakımını zorlaştırmıştır.

Temiz: Fonksiyonlar tek bir sorumluluğa sahiptir ve ayrı fonksiyonlar kullanılarak kod modüler hale getirilmiştir. Bu, kodun bakımını ve genişletilmesini kolaylaştırır.

Fonksiyonları incelediğimizde, açıklayıcı tanımların ve açıklamaların ne kadar önemli olduğunu anlıyoruz.  Yazdığınız kod mirasınızdır ve mirasınız her zaman anlamlı olmalıdır. Bu yüzden her fonksiyonun ne işe yaradığını ve ne için kullanıldığını kesinlikle belirtmeliyiz. Emin olun zaman geçtikçe yazdığınız yüzlerce hatta binlerce fonksiyon olacak. Geriye döndüğünüzde hangi fonksiyonu neden yazdığınızı siz bile unutabilirsiniz, bir de sizden sonra geleni düşünün…

Fonksiyonlara verilen parametrelerin sınırlamalarını dikkate almak temiz kod yazmada önemli bir ilkedir. Parametre sınırlamaları fonksiyonların doğru ve güvenilir bir şekilde çalışmasını sağlar ve hata olasılığını azaltır. Bu kuralı izleyerek, fonksiyonların aldığı parametrelerin geçerliliğini kontrol etmek, fonksiyonların güvenilirliğini ve okunabilirliğini artırır.

Clean Code Prensipleri

6. Geçerlilik Kontrolü:

Kötü: calculateTotalPrice fonksiyonu parametrelerin geçerliliğini kontrol etmez ve geçersiz değerler işleme alınabilir.

Temiz: calculateTotalPrice fonksiyonu parametrelerin türünü ve değerlerini kontrol eder, böylece yalnızca geçerli ve uygun değerler işleme alınır.

7. Hata Mesajları:

Kötü: Geçersiz parametrelerle çağrıldığında yanlış sonuçlar döner ve hata mesajı vermez.

Temiz: Geçersiz parametrelerle çağrıldığında, uygun hata mesajları döner ve böylece kullanıcıya veya geliştiriciye sorunun ne olduğu hakkında bilgi verir.

8. Okunabilirlik ve Güvenilirlik:

Kötü: Fonksiyon herhangi bir parametre ile çağrılabilir ve beklenmedik sonuçlar doğurabilir.

Temiz: Fonksiyon yalnızca geçerli parametrelerle çalışır ve beklenmedik sonuçları önler, bu da kodun güvenilirliğini ve bakımını artırır.

Bu örnekte, fonksiyon çok fazla parametre alır ve bu durum kodun karmaşıklığını artırır:

Clean Code Prensipleri
Clean Code Prensipleri

8. Parametre Sayısı:

Kötü: createUser fonksiyonu çok fazla parametre alır. Bu, fonksiyon çağrısını ve fonksiyonun kendisini okumayı zorlaştırır.

Temiz: createUser fonksiyonu tek bir nesne alır. Bu, fonksiyon çağrısını ve fonksiyonun kendisini okumayı kolaylaştırır.

9. Okunabilirlik:

Kötü: Fonksiyonun aldığı parametreler arasında kaybolmak kolaydır ve hangi parametrenin ne anlama geldiğini anlamak zor olabilir.

Temiz: Kullanıcı bilgilerini bir nesne olarak geçmek, parametrelerin anlamını daha belirgin hale getirir ve okunabilirliğini artırır.

10. Genişletilebilirlik:

Kötü: Yeni bir bilgi eklemek gerektiğinde fonksiyon imzasını değiştirmek gerekir, bu da kodun bakımını zorlaştırır.

Temiz: Yeni bir bilgi eklemek gerektiğinde sadece nesneye yeni bir özellik eklemek yeterlidir, bu da kodun bakımını kolaylaştırır.

11. Fonksiyon İmzası:

Kötü: Fonksiyon imzası çok uzun ve karmaşıktır.

Temiz: Fonksiyon imzası kısa ve anlaşılırdır.

 

Temiz kod yazma prensipleri, yazılım geliştirme sürecinde önemli bir rol oynar. Kodun sadece işlevselliğini sağlamakla kalmayıp, aynı zamanda okunabilir, anlaşılabilir ve bakımının kolay olmasını sağlayarak geliştirici ekibinin verimliliğini artırır. İyi tanımlanmış değişken isimleri, modüler fonksiyonlar ve geçerlilik kontrolleri, kodunuzun uzun vadeli sağlamlığını ve genişletilebilirliğini garanti altına alır. Sonuç olarak, temiz kod yazmak hem şu anda hem de gelecekte projenizin başarısını ve sürdürülebilirliğini destekleyen önemli bir unsurdur.

Size bu yazımda daha çok prensipleri anlatmaya çalıştım. Temiz kodun ne kadar önemli olduğunu vurgulamak adına da bu konunun ne kadar çok kişi tarafından kaleme alındığını, yazının en başındaki sözlerle belirttim.  Bu sözleri prensipler ile göz önünde bulundurmanızı öneririm.

Facebook
Twitter
LinkedIn