Porque é mais para escrever e ler mais
A razão mais simples é que as pessoas gostam de digitar menos e codificar essa informação significa mais digitação. Ao lê-lo, toda vez que eu tenho que ler a coisa toda, mesmo que eu esteja familiarizado com a ordem dos argumentos. Mesmo que não esteja familiarizado com a ordem dos argumentos ...
Muitos desenvolvedores usam IDEs
Os IDEs geralmente fornecem um mecanismo para ver a documentação de um determinado método ao passar o mouse ou por meio de um atalho de teclado. Por causa disso, os nomes dos parâmetros estão sempre à mão.
A codificação dos argumentos introduz duplicação e acoplamento
Os nomes dos parâmetros já devem documentar o que são. Escrevendo os nomes no nome do método, também estamos duplicando essa informação na assinatura do método. Também criamos um acoplamento entre o nome do método e os parâmetros. Digamos que expected
e actual
sejam confusos para nossos usuários. Ir de assertEquals(expected, actual)
a assertEquals(planned, real)
não requer a alteração do código do cliente usando a função. Ir de assertExpectedEqualsActual(expected, actual)
a assertPlannedEqualsReal(planned, real)
significa uma alteração significativa na API. Ou nós não mudamos o nome do método, o que rapidamente se torna confuso.
Use tipos em vez de argumentos ambíguos
O problema real é que temos argumentos ambíguos que são facilmente alternados porque são do mesmo tipo. Em vez disso, podemos usar nosso sistema de tipos e nosso compilador para impor a ordem correta:
class Expected<T> {
private T value;
Expected(T value) { this.value = value; }
static Expected<T> is(T value) { return new Expected<T>(value); }
}
class Actual<T> {
private T value;
Actual(T value) { this.value = value; }
static Actual<T> is(T value) { return new Actual<T>(value); }
}
static assertEquals(Expected<T> expected, Actual<T> actual) { /* ... */ }
// How it is used
assertEquals(Expected.is(10), Actual.is(x));
Isso pode ser aplicado no nível do compilador e garante que você não possa obtê-los de volta. Aproximando-se de um ângulo diferente, isso é essencialmente o que a biblioteca Hamcrest faz para testes.