Kiedy widzę długie listy parametrów, moje pierwsze pytanie dotyczy tego, czy ta funkcja lub obiekt robi za dużo. Rozważać:
EverythingInTheWorld earth=new EverythingInTheWorld(firstCustomerId,
lastCustomerId,
orderNumber, productCode, lastFileUpdateDate,
employeeOfTheMonthWinnerForLastMarch,
yearMyHometownWasIncorporated, greatGrandmothersBloodType,
planetName, planetSize, percentWater, ... etc ...);
Oczywiście ten przykład jest celowo śmieszny, ale widziałem wiele prawdziwych programów z przykładami tylko nieco mniej absurdalnymi, w których jedna klasa jest używana do przechowywania wielu ledwo powiązanych lub niepowiązanych rzeczy, najwyraźniej tylko dlatego, że ten sam program wywołujący wymaga obu lub ponieważ programista pomyślał o obu jednocześnie. Czasami prostym rozwiązaniem jest podzielenie klasy na wiele części, z których każda robi swoje.
Nieco bardziej skomplikowane jest sytuacja, gdy klasa naprawdę musi zajmować się wieloma logicznymi rzeczami, takimi jak zamówienie klienta i ogólne informacje o kliencie. W takich przypadkach stwórz klasę dla klienta i klasę na zamówienie i pozwól im rozmawiać ze sobą w razie potrzeby. Więc zamiast:
Order order=new Order(customerName, customerAddress, customerCity,
customerState, customerZip,
orderNumber, orderType, orderDate, deliveryDate);
Moglibyśmy mieć:
Customer customer=new Customer(customerName, customerAddress,
customerCity, customerState, customerZip);
Order order=new Order(customer, orderNumber, orderType, orderDate, deliveryDate);
Chociaż oczywiście wolę funkcje, które przyjmują tylko 1, 2 lub 3 parametry, czasami musimy zaakceptować, że realistycznie rzecz biorąc, ta funkcja zajmuje sporo, a sama liczba nie powoduje tak naprawdę złożoności. Na przykład:
Employee employee=new Employee(employeeId, firstName, lastName,
socialSecurityNumber,
address, city, state, zip);
Tak, jest to kilka pól, ale prawdopodobnie wszystko, co z nimi zrobimy, to zapisać je w rekordzie bazy danych lub wrzucić na ekran lub coś takiego. Nie ma tu zbyt wiele przetwarzania.
Kiedy moje listy parametrów robią się długie, wolę, jeśli mogę nadać polom różne typy danych. Na przykład, gdy widzę funkcję taką jak:
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);
A potem widzę, jak nazywa się to:
updateCustomer("A", "M", 42, 3, 1492, 1969, -7, true, false, false, true, false);
Martwię się. Patrząc na wezwanie, nie jest wcale jasne, co oznaczają te wszystkie tajemnicze liczby, kody i flagi. To tylko prośba o błędy. Programista może łatwo się pomylić co do kolejności parametrów i przypadkowo przełączyć dwa, a jeśli są tego samego typu danych, kompilator po prostu by to zaakceptował. Wolałbym raczej mieć podpis, w którym wszystkie te rzeczy są wyliczeniami, więc wywołanie przechodzi w takich rzeczach, jak Type.ACTIVE zamiast „A” i CreditWatch.NO zamiast „false” itp.