Quando vedo lunghi elenchi di parametri, la mia prima domanda è se questa funzione o oggetto stia facendo troppo. Tener conto di:
EverythingInTheWorld earth=new EverythingInTheWorld(firstCustomerId,
lastCustomerId,
orderNumber, productCode, lastFileUpdateDate,
employeeOfTheMonthWinnerForLastMarch,
yearMyHometownWasIncorporated, greatGrandmothersBloodType,
planetName, planetSize, percentWater, ... etc ...);
Ovviamente questo esempio è volutamente ridicolo, ma ho visto molti programmi reali con esempi solo leggermente meno ridicoli, dove una classe è usata per contenere molte cose a malapena correlate o non correlate, apparentemente solo perché lo stesso programma chiamante ha bisogno di entrambe o perché il il programmatore pensava a entrambi allo stesso tempo. A volte la soluzione più semplice è suddividere la classe in più parti, ognuna delle quali fa le proprie cose.
Un po 'più complicato è quando una classe ha davvero bisogno di gestire più cose logiche, come sia un ordine del cliente che informazioni generali sul cliente. In questi casi, crea una classe per il cliente e una classe per l'ordine e lascia che si parlino tra loro se necessario. Quindi invece di:
Order order=new Order(customerName, customerAddress, customerCity,
customerState, customerZip,
orderNumber, orderType, orderDate, deliveryDate);
Potremmo avere:
Customer customer=new Customer(customerName, customerAddress,
customerCity, customerState, customerZip);
Order order=new Order(customer, orderNumber, orderType, orderDate, deliveryDate);
Anche se ovviamente preferisco le funzioni che richiedono solo 1 o 2 o 3 parametri, a volte dobbiamo accettare che, realisticamente, questa funzione richiede un mucchio e che il numero di per sé non crea davvero complessità. Per esempio:
Employee employee=new Employee(employeeId, firstName, lastName,
socialSecurityNumber,
address, city, state, zip);
Sì, sono un mucchio di campi, ma probabilmente tutto ciò che faremo con loro è salvarli in un record di database o lanciarli su uno schermo o qualcosa del genere. Non c'è davvero molta elaborazione qui.
Quando i miei elenchi di parametri diventano lunghi, preferisco di gran lunga dare ai campi diversi tipi di dati. Come quando vedo una funzione come:
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);
E poi lo vedo chiamato con:
updateCustomer("A", "M", 42, 3, 1492, 1969, -7, true, false, false, true, false);
Mi preoccupo. Guardando la chiamata, non è affatto chiaro cosa significano tutti questi numeri, codici e bandiere criptici. Questo è solo chiedere errori. Un programmatore potrebbe facilmente confondersi sull'ordine dei parametri e scambiarne due accidentalmente, e se sono lo stesso tipo di dati, il compilatore lo accetterebbe. Preferirei di gran lunga una firma in cui tutte queste cose sono enumerazioni, quindi una chiamata passa in cose come Type.ACTIVE invece di "A" e CreditWatch.NO invece di "false", ecc.