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.

Foi útil?

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:

  1. valor deve se preocupa mais voltou?
  2. 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.

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