“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.”
Martin Fowler
Temiz kod pratiklerinde bu defaki konumuz metot parametreleri (argümanları). Çok sayıda parametre, basit görülen ama karşılaştığımızda çoğu kez rahatsız eden bir sorundur. Sebebleri ise:
- Çok sayıda parametrenin, metodun çok karmaşık veya çok iş yaptigi anlamina gelmesi, implementasyonunda en ufak bir değişiklik durumunda clientları olumsuz etkilemesi
- Yeni parametreler eklendikçe interfacelerin etkilenmesi
- Bazı IDE’ler yardımcı olsa da parametrelerin sırasının kafa karıştırması
- Default değer verebileceğiniz parametrelerin en sonda olması gerekliliği, bu durumda zorunlu bir parametre eklemek istediğinizde işlerin karışacak olması
Örneğin aşağıdaki Java metodu, çeşitli parametrelere göre bir çalışanın ödeyeceği vergiyi hesaplayan bir fonksiyon olsun:
public BigDecimal calculateTax(int age, boolean isMarried, int numberOfDependent, BigDecimal salary, string taxCategory, boolean isExpat, BigDecimal extraIncomings) {
….
}
Gördüğünüz gibi metot sanki kontrolden çıkacak gibi duruyor. Kimse bu metodun client’ı olmayı pek istemez. Single Responsibility Principle yani her metodun tek iş yapması prensibine uyduğundan da pek emin değiliz.
Peki kaç parametreden sonrası çok fazla sayılır?
Bununla ilgili net bir sayı belirtmek mümkün değil. Bob amcaya göre maksimum 3 parametre olmalı. Hedefiniz mümkün olduğunca minimum sayıda parametre olmalıdır.
Parametreleri nasıl azaltabiliriz?
Bir refactor ile parametrelerinizi azaltıp hem kodunuzu daha okunabilir hem de daha kolay test edilebilir hale getirebilirsiniz. Dikkat etmeniz gereken ilk şey, öncesinde içeriğini yani implementasyonunu iyi okuyup hakim olmaktır. Bir diğeri ise tüm kod değişikliklerinin ve refaktörlerin olmazsa olmazı birim testlerinin olmasıdır.
Azaltmak için genelde 2 teknik kullanılır:
- Extract Method Yöntemi: Metodun birden fazla iş yaptığından eminseniz daha küçük parçalara bölerek refactor edebilirsiniz. Böylece parametreleri de bölmüş olursunuz (Single Responsibility).
- Parameter Object Yöntemi: Metodu bölemediğiniz durumlarda, aynı context’e sahip parametreleri objeler altında birleşterebilirsiniz. Yukardaki örneğimizde parametreleri 2 objede toplayabiliriz: Kişisel bilgilerin yer aldığı Person objesi (class) ve finansal bilgilerin yer aldığı Payment objesi.
class Person {
long id;
int age;
boolean isMarried;
int numberOfDependent;
boolean isExpat;
}
class Payment {
long person_id;
BigDecimal salary;
string taxCategory;
BigDecimal extraIncomings;
}
Objelerimizi tamamladıktan sonra artık bunları parametre olarak kullanabiliriz. Bu durumda örnek metodumuz şu hale gelecektir:
public BigDecimal calculateTax(Person person, Payment payment) {
….
}
Buradan bir adım daha ileri giderek sadece Person objesi gönderebilir ve Payment objesini metot içerisinde çekebilirsiniz. Bu tamamen sizin tasarımınıza kalmış.
Önceki yazı:
Sonraki yazı:

Yazılım Geliştirici, Veri Analitiği Uzmanı
Giriştiği her işte tüm resmi anlamaya çalışan ve “neden” sorusunu her daim çekinmeden soran birisidir. Konuşmaktan ziyade dinlemeyi daha çok sever. 15 yıllık yazılım sektöründeki tecrübesi çoğunlukla arkayüz ve altyapı geliştirmeleri ile geçerken, bu yıl veri analitiği ve yapay zeka tarafına da dokunmaya başladı.
Podcastsiz yapamaz. Biraz erbane çalmaya çalışır ama kimse dinlemez. Açık sözlüdür. Sporu ve kitapları ihmal edenleri her fırsatta kınar.