Domanda

Questa è una programmazione generale, ma se fa la differenza, sto usando goal-c. Supponiamo che ci sia un metodo che restituisce un valore e che esegue anche alcune azioni, ma non ti interessa il valore che restituisce, ma solo le cose che fa. Chiamereste semplicemente il metodo come se fosse vuoto? O posizionare il risultato in una variabile e quindi eliminarlo o dimenticarlo? Esprimi la tua opinione, cosa faresti se tu avessi questa situazione.

È stato utile?

Soluzione

Un esempio comune di ciò è printf, che restituisce un int ... ma raramente si vede questo:

int val = printf("Hello World");

Altri suggerimenti

Sì, basta chiamare il metodo come se fosse vuoto. Probabilmente lo fai sempre senza accorgertene. L'operatore di assegnazione '=' restituisce effettivamente un valore, ma viene usato molto raramente.

Dipende dall'ambiente (lingua, strumenti, standard di codifica, ...).

Ad esempio in C, è perfettamente possibile chiamare una funzione senza usare il suo valore. Con alcune funzioni come printf, che restituisce un int, viene eseguito continuamente.

A volte il mancato utilizzo di un valore provoca un avviso, che è indesiderabile. Assegnare il valore a una variabile e quindi non usarlo provocherà semplicemente un altro avvertimento su una variabile non utilizzata. In questo caso, la soluzione è di annullare il risultato annullando il prefisso con (void), ad es.

(void) my_function_returning_a_value_i_want_to_ignore().

Ci sono due problemi separati qui, in realtà:

  1. Dovresti preoccuparti del valore restituito?
  2. Dovresti assegnarlo a una variabile che non utilizzerai?

La risposta a # 2 è un clamoroso "NO". - a meno che, ovviamente, tu non stia lavorando con una lingua in cui sarebbe illegale (mi viene in mente il primo Turbo Pascal). Non ha assolutamente senso definire una variabile solo per eliminarla.

La prima parte non è così semplice. In genere, viene restituito un motivo per cui viene restituito un valore: per le funzioni idempotent il risultato è il solo scopo della funzione; per i non idempotenti di solito rappresenta una sorta di codice di ritorno che indica se l'operazione è stata completata normalmente. Ci sono eccezioni, ovviamente - come concatenamento di metodi .

Se questo è comune in .Net (per esempio), probabilmente c'è un problema con la rottura del codice CQS .

Quando chiamo una funzione che restituisce un valore che ignoro, di solito è perché lo sto facendo in un test per verificare il comportamento. Ecco un esempio in 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());
    }

Non mi interessa davvero il tipo restituito, voglio solo verificare che sia stato chiamato un metodo su un oggetto falso.

In C è molto comune, ma ci sono posti dove è ok farlo e altri posti dove non lo è. Le versioni successive di GCC hanno un attributo della funzione in modo da poter ricevere un avviso quando viene utilizzata una funzione senza verificare il valore restituito:

  

L'attributo warn_unused_result provoca l'emissione di un avviso se un chiamante della funzione con questo attributo non utilizza il suo valore restituito. Ciò è utile per le funzioni in cui non verificare il risultato è un problema di sicurezza o sempre un bug, come realloc.

     int fn () __attribute__ ((warn_unused_result));
     int foo ()
     {
       if (fn () < 0) return -1;
       fn ();
       return 0;
     }
     

genera un avviso sulla riga 5.

L'ultima volta che l'ho usato non c'era modo di disattivare l'avviso generato, il che causa problemi durante la compilazione di codice di terze parti che non si desidera modificare. Inoltre, ovviamente non c'è modo di verificare se l'utente fa effettivamente qualcosa di sensato con il valore restituito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top