Когда я вижу длинные списки параметров, мой первый вопрос: не слишком ли много делает эта функция или объект. Рассматривать:
EverythingInTheWorld earth=new EverythingInTheWorld(firstCustomerId,
lastCustomerId,
orderNumber, productCode, lastFileUpdateDate,
employeeOfTheMonthWinnerForLastMarch,
yearMyHometownWasIncorporated, greatGrandmothersBloodType,
planetName, planetSize, percentWater, ... etc ...);
Конечно, этот пример умышленно смешон, но я видел множество реальных программ с примерами, лишь немного менее нелепыми, где один класс используется для хранения множества едва связанных или несвязанных вещей, по-видимому, только потому, что одной и той же вызывающей программе нужны оба или потому, что программист думал об обоих одновременно. Иногда простое решение - просто разбить класс на несколько частей, каждая из которых выполняет свои функции.
Чуть сложнее, когда классу действительно нужно иметь дело с несколькими логическими вещами, такими как заказ клиента и общая информация о клиенте. В этих случаях создайте класс для клиента и класс для заказа и позвольте им разговаривать друг с другом по мере необходимости. Так что вместо:
Order order=new Order(customerName, customerAddress, customerCity,
customerState, customerZip,
orderNumber, orderType, orderDate, deliveryDate);
У нас могло быть:
Customer customer=new Customer(customerName, customerAddress,
customerCity, customerState, customerZip);
Order order=new Order(customer, orderNumber, orderType, orderDate, deliveryDate);
Хотя, конечно, я предпочитаю функции, которые принимают всего 1, 2 или 3 параметра, иногда мы должны признать, что на самом деле эта функция занимает много, и что количество само по себе не создает сложности. Например:
Employee employee=new Employee(employeeId, firstName, lastName,
socialSecurityNumber,
address, city, state, zip);
Да, это набор полей, но, вероятно, все, что мы собираемся с ними делать, - это сохранять их в запись базы данных или выводить на экран или что-то в этом роде. Здесь действительно не так много обработки.
Когда мои списки параметров становятся длинными, я предпочитаю, чтобы я мог дать полям разные типы данных. Например, когда я вижу такую функцию, как:
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);
И затем я вижу, что он вызван:
updateCustomer("A", "M", 42, 3, 1492, 1969, -7, true, false, false, true, false);
Я забеспокоился. Глядя на звонок, совсем не понятно, что означают все эти загадочные числа, коды и флаги. Это просто просьба об ошибках. Программист может легко запутаться в порядке следования параметров и случайно переключить два, и если они одного типа данных, компилятор просто примет его. Я бы предпочел иметь подпись, в которой все эти вещи являются перечислениями, поэтому вызов передает такие вещи, как Type.ACTIVE вместо «A» и CreditWatch.NO вместо «false» и т. Д.