Como encadear corretamente funções sobrecarregadas?

8

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?

Bobby
fonte
1
"new function is added" (que significa "new param"?) não parece mais difícil no primeiro exemplo. O que é um pouco mais difícil no primeiro exemplo é abandonar uma opção (assim, para que o usuário especifique ambos ae bou 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.
O CodeReview é para revisar o código real, já que você está apresentando o psuedocode, ele não está no tópico.
Winston Ewert

Respostas:

6

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.

John Kraft
fonte
2

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?

palacsint
fonte
Ah, assuma um número arbitrário de métodos / parâmetros.
Bobby
0

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.

Mike Nakis
fonte