Pergunta

Eu tenho um método existente (ou função em geral) que eu preciso para crescer funcionalidade adicional, mas eu não quero quebrar qualquer uso do método em outras partes do código. Exemplo:

int foo::bar(int x)
{
 // a whole lot of code here
 return 2 * x + 4;
}

é amplamente utilizado na base de código. Agora eu preciso para fazer a 4 em um parâmetro, mas qualquer código que já chama foo :: bar ainda deve receber o que ele espera. Devo estender e renomear o método antigo e envolvê-la em um novo como

int foo::extended_bar(int x, int y)
{
 // ...
 return 2 * x + y;
}

int foo::bar(int x)
{
 return extended_bar(x,4);
}

ou devo declarar um argumento padrão no arquivo de cabeçalho como

int bar(int x, int y=4);

e apenas estender a função

int foo::bar(int x, int y)
{
 // ...
 return 2 * x + y;
}

Quais são as vantagens e desvantagens de cada variante?

Foi útil?

Solução

Eu costumo usar uma função embalagem (via sobrecarga maior parte do tempo) em vez de parâmetros padrão.

A razão é que existem dois níveis de compatibilidade com versões anteriores :

  1. Tendo de nível de origem meios compatibilidade com versões anteriores que você tem que recompilar o código de chamada sem alterações, porque as novas assinaturas de função são compatíveis com os antigos. Este nível pode ser conseguida com ambas; valores padrão e embalagens / sobrecarga.

  2. A nível mais forte é binário de nível compatibilidade com versões anteriores, que funciona até mesmo sem recompilação, por exemplo, quando você não tem acesso ao código de chamada. Imagine que você implantar a função na forma binária, como em uma DLL, etc. Nesse caso, as assinaturas têm a ser exatamente o mesmo para fazer o trabalho, o que não é o caso para os valores padrão - eles vão quebrar este nível de compatibilidade .

Outra vantagem das funções de mensagens publicitárias é - se a sua aplicação tem o registo de qualquer tipo - você pode despejar um aviso na função de idade que se tornará obsoleto em versões futuras e que é recomendável usar o novo

Outras dicas

Quanto mais tempo eu uso C ++, menos eu como parâmetros de função padrão. Eu não posso apontar qualquer razão específica para meu desgosto, mas eu acho que se eu usá-los, eu quase sempre acabam removendo-os mais tarde. Assim, a minha (subjetiva) voto vai para a nova função chamada -. O nome poderia naturalmente ser o mesmo que o do antigo

Eu pessoalmente acredito que os comportamentos implícitos são (uma das) as raízes de todo o mal.

Qualquer coisa que ofusca para um mantenedor ou chamador a identidade do alvo a ser invocado devem ter uma justificação muito forte, especialmente se ele é parte de uma grande API.

Portanto, eu diria fortemente contra a opção com a operação padrão.

Além disso, eu acredito que se uma determinada função pode ser chamado com um número diferente de parâmetros, então há algo inerentemente diferente ambas as versões da função ou que estão fazendo muito. A distinção provavelmente deve estar no nome, e provavelmente deve ser mais significativo do que "_extended"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top