Когда я вижу длинные списки параметров, мой первый вопрос - делает ли эта функция или объект слишком много. Рассмотрим:
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» и т. Д.