Non specificare un ritorno in una funzione, buono o cattivo?

4

Ho codificato in questo modo molte volte, e non ho mai riscontrato un problema, ma il compilatore avverte sempre quando si aspetta un ritorno e non ce n'è.

Ad esempio, guarda questo:

-(NSString *)outputStringForInteger:(NSInteger)int
{
    if (int == 0)
    {
        return @"Number is Zero";
    }
    else
    {
        return @"Number is not Zero";
    }
    //no "failsafe" or other explicit return
}

Se la funzione non arriverà mai all'ultima riga, è importante avere ancora un'opzione di sicurezza, o voi ragazzi avete appena a che fare con gli avvertimenti del compilatore?

    
posta Justin 01.11.2010 - 19:35
fonte

7 risposte

22

Ottieni un compilatore migliore. Quelli che uso si lamentano di avere un codice che non verrà mai eseguito se si inserisce il ritorno "failsafe". Questo è un avvertimento molto migliore di quello che apparentemente stai vedendo.

    
risposta data 01.11.2010 - 19:41
fonte
6

Non sei sicuro di quale lingua sei, quindi userò Java per il mio esempio.

String outputStringForInteger(int i) {
   String returnString = "Number is not Zero";

   if (i == 0)
      returnString = "Number is Zero";

   return returnString;
}

Questo fornirà un valore di ritorno "predefinito", oltre ad essere più leggibile (IMO).

    
risposta data 01.11.2010 - 19:52
fonte
4

In C:

String outputStringForInteger(int i) {
   return (i == 0) ? "Number is Zero" : "Number is not Zero";
}

Se insisti che l'operatore ternario è un'invenzione del Diavolo, come alcuni fanno:

String outputStringForInteger(int i) {
   String returnString;

   if (i == 0) {
      returnString = "Number is Zero";
   } else {
      returnString = "Number is not Zero";
   }
   return returnString;
}
    
risposta data 01.11.2010 - 20:38
fonte
2

Preferisco non avere più ritorni in una funzione.

    
risposta data 01.11.2010 - 20:09
fonte
1

In D, tranne in alcuni casi banali in cui il compilatore può dimostrare staticamente che la fine della funzione è irraggiungibile senza che venga eseguita un'istruzione return o che venga lanciata un'eccezione, deve inserire dichiarazione di ritorno, un'istruzione throw o una assert(0) alla fine della funzione. In altre lingue penso che di solito sia una buona pratica, anche se non necessariamente in casi come il tuo esempio, in cui un lettore può banalmente e staticamente dire che la fine della funzione è irraggiungibile e un compilatore decente dovrebbe essere in grado di dimostrarlo.

Non dovresti avere un valore di ritorno predefinito che ritieni sia irraggiungibile. Se viene utilizzato, il tuo codice è per definizione in uno stato in cui non hai mai voluto che fosse inserito. Un assert(0) trasmette le tue intenzioni sia al lettore che al compilatore molto meglio.

    
risposta data 01.11.2010 - 21:08
fonte
1

Finché tu hai coperto tutti i possibili percorsi di codice, stai bene.

Se il compilatore si lamenta, ci sono due possibilità:
1) Pensi di aver coperto tutto e non l'hai fatto.
2) Il tuo compilatore è cerebralmente morto.

Detto questo, è molto probabile che sia possibile ristrutturare il codice per placare il compilatore e coprire ancora i percorsi del codice. (ad esempio, elimina il resto nel tuo esempio)

    
risposta data 02.11.2010 - 16:34
fonte
1

Che ne dici di questo (Java - non conosco la lingua dell'OP)?

String outputStringForInteger(int i)
{

   if (i == 0)
      return "Number is Zero";

   return "Number is not Zero";
}
    
risposta data 02.11.2010 - 16:52
fonte

Leggi altre domande sui tag