Supondo que você tenha funções que utilizam um número crescente de parâmetros opcionais (e uma pseudo linguagem que não permite parâmetros opcionais e um número arbitrário de parâmetros) como este:
function doStuff(Param a)
function doStuff(Param a, Param b)
function doStuff(Param a, Param b, Param c)
Qual é uma boa maneira de unificá-los em uma única chamada? Eu posso imaginar dois desenhos:
Caia em tudo:
function doStuff(Param a)
doStuff(a, defaultB)
function doStuff(Param a, Param b)
doStuff(a, b, defaultC)
function doStuff(Param a, Param b, Param c)
// magic goes here
- The Upside: Pouca duplicação de código, alteração fácil de um único parâmetro padrão.
- A desvantagem: muitas chamadas de função podem tornar o Stacktraces mais difícil de ler ou inútil.
Ou chame diretamente a função 'last':
function doStuff(Param a)
doStuff(a, defaultB, defaultC)
function doStuff(Param a, Param b)
doStuff(a, b, defaultC)
function doStuff(Param a, Param b, Param c)
// magic goes here
- The Upside: Poucas chamadas de função, não se preocupa se uma nova função for adicionada à cadeia.
- A desvantagem: Muita duplicação de código, especialmente os valores padrão.
O que eu não pensei?
design-patterns
Bobby
fonte
fonte
a
eb
ou nenhum), mas o primeiro ainda vence por minimizar a duplicação de bugs. BTW, erro de digitação: a implementação de sobrecarga média deve ser idêntica entre os exemplos.Respostas:
Eu prefiro o primeiro método. A possibilidade de valores padrão duplicados em todo o local pode reduzir drasticamente a manutenção. Eu encontrei esse problema específico na natureza e foi um pesadelo.
fonte
A primeira são apenas duas linhas extras em um stacktrace que não são muito. Em Java, nunca achei difícil ler os rastros de pilha por causa de nomes de métodos semelhantes.
De qualquer forma, usar muitos parâmetros pode ser um mau cheiro para o código: quantos parâmetros são muitos?
fonte
Eu optaria pelo segundo paradigma (chamando diretamente a função "last".). Isso é bom e não constitui duplicação real de código, porque não envolve manipulação de nenhum tipo de estado.
Também ajuda a perceber que o que você está fazendo, fornecendo várias sobrecargas, é simplesmente um truque para fornecer a ilusão de parâmetros opcionais. Quando você vê dessa maneira, torna-se óbvio que o método "last" e apenas o "last" são os que devem executar qualquer trabalho real, portanto, qualquer delegação entre os métodos não-últimos é inútil.
Pessoalmente, não preciso mais me preocupar com esse problema, porque estou usando o C #, que suporta parâmetros opcionais, poupando-me assim de ter que fazer truques como esses para imitá-los.
fonte