Cuando veo listas de parámetros largas, mi primera pregunta es si esta función u objeto está haciendo demasiado. Considerar:
EverythingInTheWorld earth=new EverythingInTheWorld(firstCustomerId,
lastCustomerId,
orderNumber, productCode, lastFileUpdateDate,
employeeOfTheMonthWinnerForLastMarch,
yearMyHometownWasIncorporated, greatGrandmothersBloodType,
planetName, planetSize, percentWater, ... etc ...);
Por supuesto, este ejemplo es deliberadamente ridículo, pero he visto muchos programas reales con ejemplos solo un poco menos ridículos, donde una clase se usa para contener muchas cosas apenas relacionadas o no relacionadas, aparentemente solo porque el mismo programa de llamada necesita ambos o porque el El programador pensó en ambos al mismo tiempo. A veces, la solución fácil es simplemente dividir la clase en varias partes, cada una de las cuales hace lo suyo.
Un poco más complicado es cuando una clase realmente necesita lidiar con múltiples cosas lógicas, como tanto el pedido de un cliente como la información general sobre el cliente. En estos casos, cree una clase para el cliente y una clase para el pedido, y permítales hablar entre ellos según sea necesario. Entonces en lugar de:
Order order=new Order(customerName, customerAddress, customerCity,
customerState, customerZip,
orderNumber, orderType, orderDate, deliveryDate);
Nosotros podríamos tener:
Customer customer=new Customer(customerName, customerAddress,
customerCity, customerState, customerZip);
Order order=new Order(customer, orderNumber, orderType, orderDate, deliveryDate);
Aunque, por supuesto, prefiero las funciones que toman solo 1, 2 o 3 parámetros, a veces tenemos que aceptar que, de manera realista, esta función requiere mucho y que el número en sí mismo no crea complejidad. Por ejemplo:
Employee employee=new Employee(employeeId, firstName, lastName,
socialSecurityNumber,
address, city, state, zip);
Sí, es un montón de campos, pero probablemente todo lo que vamos a hacer con ellos es guardarlos en un registro de base de datos o lanzarlos en una pantalla o algo así. Realmente no hay mucho procesamiento aquí.
Cuando mis listas de parámetros se hacen largas, prefiero si puedo dar a los campos diferentes tipos de datos. Como cuando veo una función como:
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);
Y luego lo veo llamado con:
updateCustomer("A", "M", 42, 3, 1492, 1969, -7, true, false, false, true, false);
Me preocupo. Mirando la llamada, no está del todo claro qué significan todos estos números, códigos y banderas crípticos. Esto es solo pedir errores. Un programador puede confundirse fácilmente sobre el orden de los parámetros y accidentalmente cambiar dos, y si son del mismo tipo de datos, el compilador simplemente los aceptará. Preferiría tener una firma donde todas estas cosas sean enumeraciones, por lo que una llamada pasa en cosas como Type.ACTIVE en lugar de "A" y CreditWatch.NO en lugar de "false", etc.