Uzun parametre listeleri gördüğümde ilk sorum bu işlevin veya nesnenin çok fazla şey yapıp yapmadığıdır. Düşünmek:
EverythingInTheWorld earth=new EverythingInTheWorld(firstCustomerId,
lastCustomerId,
orderNumber, productCode, lastFileUpdateDate,
employeeOfTheMonthWinnerForLastMarch,
yearMyHometownWasIncorporated, greatGrandmothersBloodType,
planetName, planetSize, percentWater, ... etc ...);
Elbette bu örnek kasıtlı olarak saçma, ancak örnekleri çok az daha az gülünç olan çok sayıda gerçek program gördüm, burada bir sınıf pek çok az ilişkili veya alakasız şeyi tutmak için kullanılır, görünüşe göre aynı çağrı programı ikisine birden ihtiyaç duyduğu için veya programcı her ikisini de aynı anda düşünüyordu. Bazen kolay çözüm, sınıfı her biri kendi işini yapan birden çok parçaya bölmektir.
Biraz daha karmaşık olan, bir sınıfın hem müşteri siparişi hem de müşteri hakkında genel bilgiler gibi birden fazla mantıksal şeyle gerçekten uğraşması gerektiğidir. Bu durumlarda, müşteri için bir sınıf ve sipariş için bir sınıf oluşturun ve gerektiğinde birbirleriyle konuşmalarına izin verin. Yani bunun yerine:
Order order=new Order(customerName, customerAddress, customerCity,
customerState, customerZip,
orderNumber, orderType, orderDate, deliveryDate);
Sahip olabilirdik:
Customer customer=new Customer(customerName, customerAddress,
customerCity, customerState, customerZip);
Order order=new Order(customer, orderNumber, orderType, orderDate, deliveryDate);
Elbette sadece 1 veya 2 veya 3 parametre alan fonksiyonları tercih etsem de, bazen gerçekçi olarak bu fonksiyonun bir sürü aldığını ve sayısının gerçekten karmaşıklık yaratmadığını kabul etmemiz gerekir. Örneğin:
Employee employee=new Employee(employeeId, firstName, lastName,
socialSecurityNumber,
address, city, state, zip);
Evet, bu bir sürü alan, ama muhtemelen onlarla yapacağımız tek şey onları bir veritabanı kaydına kaydetmek veya bir ekrana ya da benzeri bir yere atmaktır. Burada gerçekten çok fazla işlem yok.
Parametre listelerim uzadığında, alanlara farklı veri türleri verebilmeyi tercih ederim. Şunun gibi bir işlev gördüğümde olduğu gibi:
void updateCustomer(String type, String status,
int lastOrderNumber, int pastDue, int deliveryCode, int birthYear,
int addressCode,
boolean newCustomer, boolean taxExempt, boolean creditWatch,
boolean foo, boolean bar);
Ve sonra çağrıldığını görüyorum:
updateCustomer("A", "M", 42, 3, 1492, 1969, -7, true, false, false, true, false);
Endişeleniyorum. Çağrıya bakıldığında, tüm bu şifreli sayıların, kodların ve bayrakların ne anlama geldiği hiç de net değil. Bu sadece hata istemektir. Bir programcı, parametrelerin sırası konusunda kolayca kafa karıştırabilir ve yanlışlıkla ikisini değiştirebilir ve eğer bunlar aynı veri türündeyse, derleyici bunu kabul ederdi. Tüm bunların numaralandırıldığı bir imzayı tercih ederim, bu yüzden bir çağrı "A" yerine Type.ACTIVE ve "false" yerine CreditWatch.NO gibi şeylerde geçer.