Коли я бачу довгі списки параметрів, моє перше питання - чи робить ця функція чи об’єкт занадто багато. Поміркуйте:
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" тощо.