Sobrecarga ou parâmetros opcionais

10

Quando tenho uma função que pode ou não receber um determinado parâmetro, é melhor sobrecarregar a função ou adicionar argumentos opcionais?

Se cada um tem altos e baixos - quando eu usaria cada um?

JNF
fonte
Da perspectiva da otimização, ter parâmetros opcionais é uma opção melhor.
Maneet Puri

Respostas:

12

Se o idioma os suportar adequadamente (por exemplo, segurança de tipo, se aplicável), eu preferiria argumentos opcionais pelos seguintes motivos:

  • Eles transmitem melhor sua intenção, para que ninguém suspeite que a sobrecarga de sua função fará algo diferente (o que provavelmente não deveria).
  • Menos código para manter, mesmo se a sobrecarga de função delegar apenas ao mais abrangente. Se você deseja renomear a função posteriormente, você tem pelo menos 3 locais para fazê-lo (duas definições + uma chamada).
  • O compilador (se houver) pode gerar binários menores.
  • Argumentos opcionais escalam melhor, pelo menos em alguns idiomas. E se você quiser ter três argumentos opcionais com a capacidade de misturar e combinar? Para flexibilidade total, você precisaria de 6 sobrecargas para fazer isso.
  • Se for um método de objeto, várias sobrecargas dificultarão bastante a implementação de substituições nas subclasses.
Benjamin Kloster
fonte
Você não precisaria de 8? Três argumentos opcionais a, be ctem estas possibilidades: nada, a, b, c, ab, ac, bc, abc. É 2^npara diferentes tipos, nãon!
Mark
0

Assumindo um tipo de situação construtora: costumo escolher um padrão de construtor fluente para evitar situações com muitas opções.

Por exemplo. Ordering.natural().onResultOf(function).reverse().compound(Ordering.natural().onResultOf(function2))é um exemplo de como chamar uma interface fluente do construtor implementada no Guava.

É claro que agora você precisa de um objeto separado para manter o estado do construtor, mas reduz a complexidade geral separando o comportamento da construção do comportamento da construção.

Dibbeke
fonte
Isso não responde à pergunta.
Andy