Temiz Kod

Zeynel Kandil
Akbank Teknoloji
Published in
4 min readSep 1, 2022

Merhaba. Daha önce hiç onlarca yüzlerce satır kod yazdıktan sonra, tam kodunuzu versiyon kontrol sistemine göndermeden önce, şöyle bir kodunuza bakıp, “Acaba çok mu karışık oldu?” diye kendi kendinize sorduğunuz oldu mu? Eğer bu soruyu siz de kendinize sorduysanız muhtemelen bir şeylerin eksik olduğunu fark etmişsinizdir.

Bugün bu yazımda kodunuzu nasıl daha anlaşılır hale getirebilirsiniz, yazdığınız kodda nasıl bir standart uygulayabilirsiniz sorularının cevabını Robert C. Martin’ in yazdığı dünyaca ünlü Clean Code kitabından edindiğim bilgilere dayanarak cevaplamaya ve örneklendirmeye çalışacağım.

Tabii ki yüzlerce sayfalık bir kitabı tam olarak tek bir yazıda özetlemek çok sağlıklı sonuçlar alacağımız bir yöntem değil. Ayrıca uzatarak sizi sıkmak da istemiyorum. Bu sebeple kitapta beni fikir anlamında en çok etkileyen, en çok heyecanlandıran, “Bunu kesin ben de uygulamalıyım” dediğim yerleri paylaşacağım.

Anlamlı İsimler

Bir kere en başta belirtmekte fayda var. Kitap daha çok kodun okunabilirliği üzerine. Bu sebeple değişken, metod/fonksiyon, sınıf gibi kod bileşenlerinde anlamlı isimler vermenizi öneriyor. Yani değişkenler temp1, temp2, temp3 diye gitmeyecek.

İkincisi if, for, while gibi statement’lar da yazıldığı gibi okunabilir olacak. Yani;

if(durum != true && data == null){
System.out.println(“Hata”);
hata = “Servis Başarısız”;
session = null;
}

Gibi bir kod yerine

if(servisBasarisizsa()){
basarisizDurumuHandleEt();
}
public boolean servisBasarisizsa(){
return (durum != true && data == null)
}
public void basarisizDurumuHandleEt(){
System.out.println(“Hata”);
hata = “Servis Başarısız”;
session = null;
}

Gibi bir kod yazmanız gerekiyor.

Göründüğü üzere if’le yazılan yer bir seferde okunabiliyor. Eğer servis başarısızsa başarısız durumu handle et gibi bir cümle çıkıyor ortaya. Bu da okunabilirliği artırıyor.

Her Metod Bir İş Yapmalı

Evet burada da tahmin edeceğiniz üzere her metodun anlamlı tek bir işlem yapması bunun metod isminde açıkça belirtilmesi gerekmektedir.

Örneğin daha önce yazdığımız şu metod birden fazla anlamlandırılmayan işlem yapmaktadır;

public void basarisizDurumuHandleEt(){
System.out.println(“Hata”);
hata = “Servis Başarısız”;
session = null;
}
  • Konsola hata yazmaktadır
  • Hata Değişkenini setlemektedir
  • Session’ı boşaltmaktadır.
public void basarisizDurumuHandleEt(){
konsolaHataYazdir(“Hata”);
hatayiServisBasarisizaSetle(“Servis Başarısız”;);
sessionBosalt();
}
public void konsolaHataYazdir(string message){
System.out.println(message);
}
public void hatayiServisBasarisizaSetle(String message){
hata = message;
}
public void sessionBosalt(){
session = null;
}

Kitap bu şekilde metodları en küçük anlamlı parçalara kadar bölmemizi ve isimlendirmemizi istiyor.

CQS(Command Query Segregation)

Metodları parçaladıktan sonra yapacağımız şey onları command ve query haline getirmek olacaktır.

Peki nedir command ve query?

Query : Adından da anlaşılacağı üzere bir bilgiyi sorgulayan, yada programcı deyimiyle bir bilgiyi get eden metodlardır. Get işleminin parametresi olmaz. Geri dönüş tipi olur. Durum değiştirmezler. Dolayısıyla query’lerin içinde command olmaz

Command : Sistemin durumunu değiştiren her türlü metod command’dır. Örneğin bir değişkenin değerini değiştirmek, yada session’ ı boşaltmak ya da konsola yazı yazdırmak command’ a örnektir. Command’ların geri dönüş tipi void’dir. Çünkü bir durumu değiştirmektir amaçları. Geriye değer döndürmek gibi bir işleri yoktur. Genellikle bir tane parametre alırlar. Command’ ların içinde query olması command özelliğini bozmaz.

Yukarıda yaptığımız örneklerden alıntı yapacak olursak, aşağıdaki kod bir query’ dir.

public boolean servisBasarisizsa(){
return (durum != true && data == null)
}

Yine aşağıdaki kod bir command’ dır.

public void konsolaHataYazdir(string message){
System.out.println(message);
}

Burada geri dönüş tiplerine ve parametrelere dikkat ederseniz iyi olur. Buraya kadar her şey güzel gitti. Asıl can alıcı nokta burada başlıyor, CQS’ i öğrendik. Peki nasıl uygulayacağız? Her command metodu tek bir parametreye indirgenemez. Ya da her get metodu parametresiz olamaz. Haklısınız.

Command’ dan örnek verecek olursak, Yazılım hayatımda şöyle kodlara çok rastlıyorum;

public class Mapper(){
public Model getModel(){
var model = new Model();
durumuSetle (model, 0);
bakiyeyiSetle (model, 0);
return model;
}
public void durumuSetle (model, value){
model.durum = value;
}
public void bakiyeyiSetle (model, value){
model.bakiye = value
}
}

Gördüğünüz gibi durumSetle ve bakiyeyiSetle metodları birer command metod ama iki parametre almışlar. Kitabımızın bu gibi durumlarda bize önerisi bu metodları yeni bir sınıf içine alarak, model değişkenini bu sınıfta, sınıf değişkeni yapmaktır. Yani şöyle;

public class Setleyici{
private readonly model;
public Setleyici (model){
this.model = model;
}
public void durumuSetle (value){
this.model.durum = value;
}
public void bakiyeyiSetle (value){
this.model.bakiye = value
}
}public class Mapper(){
public Model getModel(){
var model = new Model();
setleyici = new Setleyici(model);
setleyici.durumuSetle (0);
setleyici.bakiyeyiSetle (0);
return model;
}
}

Gördüğünüz üzere durumuSetle ve bakiyeyiSetle metodları artık command desenine uyuyor.

Burada konu hakkında detay bilenlerin sadece bir itirazı olabilir. O da getModel metodu bir query metod ama içinde command’ lar var. Query metodlar state değiştirmezdi, hani sadece get ederdi denebilir.

Doğru bu sebeple Mapper sınıfını düzenlemeliyiz

public class Mapper(){
private readonly Model model;
private readonly Setleyici;
public Mapper(){
this.model = new Model()
this.setleyici = new Setleyici(model);
this.sifirla();
}
public Model getModel(){
return this.model;
}
public void sifirla(){
this.setleyici.durumuSetle (0);
this.setleyici.bakiyeyiSetle (0);
}
}

Gördüğünüz üzere tanımlamalar constructor da, get işlemi sadece get yapıyor, command’ lar tek parametre almış ve kod okunabilir durumda.

Sonuç

İsimlendirme ve her metodun tek bir işlem yapmasını basit olarak görecek olursak, Temiz kod kitabında uygulaması en çok zorlayıcı ve aynı zamanda en çok etkili olan yöntem CQS’ tir. Zorlayıcı dedim çünkü bu yöntemi uygulamaya çalıştıktan sonra göreceksiniz ki, bu bir sanat gibi bir şey. Her metod ilk bakışta bu command yada query desenine uymayabiliyor. Parçalayabilmek için iyi görmek gerekiyor. Özellikle static metodlar oldukça zorlayıcı.

--

--