Wenn ich lange Parameterlisten sehe, ist meine erste Frage, ob diese Funktion oder dieses Objekt zu viel tut. Erwägen:
EverythingInTheWorld earth=new EverythingInTheWorld(firstCustomerId,
lastCustomerId,
orderNumber, productCode, lastFileUpdateDate,
employeeOfTheMonthWinnerForLastMarch,
yearMyHometownWasIncorporated, greatGrandmothersBloodType,
planetName, planetSize, percentWater, ... etc ...);
Natürlich ist dieses Beispiel absichtlich lächerlich, aber ich habe viele echte Programme mit Beispielen gesehen, die nur etwas weniger lächerlich sind, wobei eine Klasse verwendet wird, um viele kaum verwandte oder nicht verwandte Dinge zu speichern, anscheinend nur, weil dasselbe aufrufende Programm beides benötigt oder weil das Der Programmierer dachte zufällig an beide gleichzeitig. Manchmal besteht die einfache Lösung darin, die Klasse in mehrere Teile zu zerlegen, von denen jedes sein eigenes Ding macht.
Nur etwas komplizierter ist es, wenn eine Klasse sich wirklich mit mehreren logischen Dingen befassen muss, wie z. B. einer Kundenbestellung und allgemeinen Informationen über den Kunden. Erstellen Sie in diesen Fällen eine Klasse für den Kunden und eine Klasse für die Bestellung und lassen Sie sie bei Bedarf miteinander sprechen. Also statt:
Order order=new Order(customerName, customerAddress, customerCity,
customerState, customerZip,
orderNumber, orderType, orderDate, deliveryDate);
Wir könnten haben:
Customer customer=new Customer(customerName, customerAddress,
customerCity, customerState, customerZip);
Order order=new Order(customer, orderNumber, orderType, orderDate, deliveryDate);
Während ich natürlich Funktionen bevorzuge, die nur 1 oder 2 oder 3 Parameter annehmen, müssen wir manchmal akzeptieren, dass diese Funktion realistisch gesehen eine Menge braucht und dass die Anzahl von ihnen nicht wirklich Komplexität erzeugt. Beispielsweise:
Employee employee=new Employee(employeeId, firstName, lastName,
socialSecurityNumber,
address, city, state, zip);
Ja, es sind ein paar Felder, aber wahrscheinlich werden wir sie nur in einem Datenbankeintrag speichern oder auf einen Bildschirm oder ähnliches werfen. Hier wird nicht wirklich viel verarbeitet.
Wenn meine Parameterlisten lang werden, bevorzuge ich es sehr, wenn ich den Feldern unterschiedliche Datentypen zuweisen kann. Wie wenn ich eine Funktion sehe wie:
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);
Und dann sehe ich es genannt mit:
updateCustomer("A", "M", 42, 3, 1492, 1969, -7, true, false, false, true, false);
Ich mache mir Sorgen. Wenn man sich den Anruf ansieht, ist überhaupt nicht klar, was all diese kryptischen Nummern, Codes und Flags bedeuten. Dies fragt nur nach Fehlern. Ein Programmierer kann leicht über die Reihenfolge der Parameter verwirrt werden und versehentlich zwei wechseln. Wenn sie denselben Datentyp haben, akzeptiert der Compiler dies einfach. Ich hätte viel lieber eine Signatur, in der all diese Dinge Aufzählungen sind, also leitet ein Anruf Dinge wie Type.ACTIVE anstelle von "A" und CreditWatch.NO anstelle von "false" usw. ein.