Programação geral - chamando um método não vazio, mas não usando o valor
-
22-07-2019 - |
Pergunta
Esta é a programação geral, mas se ele faz a diferença, eu estou usando Objective-C. Suponha que há um método que retorna um valor, e também realiza algumas ações, mas você não se preocupam com o valor que ele retorna, apenas as coisas que ele faz. Será que você acabou de chamar o método como se fosse vazio? Ou colocar o resultado em uma variável e, em seguida, excluí-lo ou esquecê-la? Afirmar a sua opinião, o que você faria se você tivesse esta situação.
Solução
Um exemplo comum disso é printf, que retorna um int ... mas você raramente vê isso:
int val = printf("Hello World");
Outras dicas
É só chamar o método como se fosse vazio. Você provavelmente fazê-lo o tempo todo sem perceber. O operador de atribuição '=' realmente retorna um valor, mas é muito raramente utilizado.
Depende do ambiente (a língua, as ferramentas, o padrão de codificação, ...).
Por exemplo, em C, é perfeitamente possível chamar uma função sem usar o seu valor. Com algumas funções como printf, que retorna um int, é feito o tempo todo.
Às vezes não usar um valor fará com que um aviso, o que é indesejável. Atribuindo o valor de uma variável e, em seguida, não usá-lo só vai causar um outro aviso sobre uma variável não utilizada. Para este caso, a solução é converter o resultado de anular prefixando a chamada com (void), por exemplo.
(void) my_function_returning_a_value_i_want_to_ignore().
Existem duas questões distintas aqui, na verdade:
- valor deve se preocupa mais voltou?
- Se você atribuí-la a uma variável que você não vai usar?
A resposta a # 2 é um sonoro "NÃO" - a não ser, é claro, você está trabalhando com uma linguagem onde isso seria ilegal (início Turbo Pascal vem à mente). Não há absolutamente nenhum ponto na definição de uma variável apenas para jogá-lo fora.
A primeira parte não é tão fácil. Geralmente, há um valor razão é devolvido - para idempotent funções o resultado é único propósito de função; para não-idempotent que normalmente representa algum tipo de significar código de retorno se a operação foi concluída normalmente. Há exceções, é claro -. Como método de encadeamento
Se isso é comum em .Net (por exemplo), há provavelmente um problema com o código quebrando CQS .
Quando eu chamar uma função que retorna um valor que eu ignoro, normalmente é porque eu estou fazendo isso em um teste para verificar o comportamento. Aqui está um exemplo em C #:
[Fact]
public void StatService_should_call_StatValueRepository_for_GetPercentageValues()
{
var statValueRepository = new Mock<IStatValueRepository>();
new StatService(null, statValueRepository.Object).GetValuesOf<PercentageStatValue>();
statValueRepository.Verify(x => x.GetStatValues());
}
Eu realmente não se preocupam com o tipo de retorno, eu só quero verificar se um método foi chamado em um objeto falso.
Em C é muito comum, mas há lugares onde é ok para fazê-lo e em outros lugares onde ele realmente não é. Versões posteriores do GCC têm um atributo função para que você possa receber um aviso quando uma função é usado sem verificar o valor de retorno:
O atributo
warn_unused_result
provoca um aviso a ser emitido se um chamador da função com esse atributo não usar seu valor de retorno. Isso é útil para funções onde não verificar o resultado é tanto um problema de segurança ou sempre um bug, como realloc.int fn () __attribute__ ((warn_unused_result)); int foo () { if (fn () < 0) return -1; fn (); return 0; }
resulta em advertência na linha 5.
A última vez que usei esse não havia nenhuma maneira de desligar o aviso gerado, o que causa problemas quando você está compilando código 3-parte que você não deseja modificar. Além disso, há, naturalmente, nenhuma maneira de verificar se o usuário realmente faz algo sensato com o valor retornado.