Quando vejo longas listas de parâmetros, minha primeira pergunta é se esta função ou objeto está fazendo muito. Considerar:
EverythingInTheWorld earth=new EverythingInTheWorld(firstCustomerId,
lastCustomerId,
orderNumber, productCode, lastFileUpdateDate,
employeeOfTheMonthWinnerForLastMarch,
yearMyHometownWasIncorporated, greatGrandmothersBloodType,
planetName, planetSize, percentWater, ... etc ...);
Claro que este exemplo é deliberadamente ridículo, mas eu vi muitos programas reais com exemplos apenas um pouco menos ridículos, onde uma classe é usada para conter muitas coisas mal relacionadas ou não relacionadas, aparentemente apenas porque o mesmo programa de chamada precisa de ambos ou porque o o programador pensou em ambos ao mesmo tempo. Às vezes, a solução fácil é apenas dividir a classe em várias partes, cada uma delas fazendo sua própria função.
Um pouco mais complicado é quando uma classe realmente precisa lidar com várias coisas lógicas, como um pedido do cliente e informações gerais sobre o cliente. Nesses casos, crie uma classe para o cliente e uma classe para o pedido, e deixe que conversem entre si quando necessário. Então, em vez de:
Order order=new Order(customerName, customerAddress, customerCity,
customerState, customerZip,
orderNumber, orderType, orderDate, deliveryDate);
Poderíamos ter:
Customer customer=new Customer(customerName, customerAddress,
customerCity, customerState, customerZip);
Order order=new Order(customer, orderNumber, orderType, orderDate, deliveryDate);
Embora eu prefira funções que usem apenas 1 ou 2 ou 3 parâmetros, às vezes temos que aceitar que, realisticamente, essa função exige muito e que o número por si só não cria complexidade. Por exemplo:
Employee employee=new Employee(employeeId, firstName, lastName,
socialSecurityNumber,
address, city, state, zip);
Sim, é um monte de campos, mas provavelmente tudo o que vamos fazer com eles é salvá-los em um registro de banco de dados ou jogá-los em uma tela ou algo parecido. Não há realmente muito processamento aqui.
Quando minhas listas de parâmetros ficam longas, prefiro dar aos campos diferentes tipos de dados. Como quando vejo uma função 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);
E então eu vejo que é chamado com:
updateCustomer("A", "M", 42, 3, 1492, 1969, -7, true, false, false, true, false);
Eu fico preocupado. Olhando para a chamada, não está claro o que todos esses números, códigos e sinalizadores crípticos significam. Isso é apenas pedir erros. Um programador pode facilmente ficar confuso sobre a ordem dos parâmetros e acidentalmente trocar dois, e se eles forem do mesmo tipo de dados, o compilador simplesmente os aceitaria. Eu prefiro ter uma assinatura onde todas essas coisas são enums, então uma chamada passa em coisas como Type.ACTIVE em vez de "A" e CreditWatch.NO em vez de "false", etc.