Un'istruzione di Else dovrebbe essere utilizzata solo per un commento?

4

Ho trovato quanto segue in alcuni esempi di codice:

if (urlStr)
{
    NSImage *iconImage = [[NSWorkspace sharedWorkspace] iconForFile:urlStr];
    node.nodeIcon = iconImage;
}
else
{
    // it's a separator, don't bother with the icon
}

Questo stile di usare un'istruzione else solo per un commento è una buona pratica per la produzione o è utile solo per il codice usato come esempio?

    
posta Steve Moser 28.04.2016 - 04:12
fonte

6 risposte

6

Per il programmatore che lo legge, penso che sia abbastanza chiaro. Sono abituato a leggere "se le condizioni fanno qualcos'altro fare altre cose", quindi posso analizzarlo abbastanza facilmente. Il blocco else sembra un punto davvero logico per un commento che spiega perché non vogliamo fare nulla in quella condizione.

Ma avrà un impatto significativo se avremo il blocco vuoto lì? La chiarezza migliorata per gli umani vale il costo? Penso che sia una domanda specifica per la lingua (o piuttosto per il compilatore / interprete).

L'unica volta in cui posso pensare che questo potrebbe avere un impatto negativo è se si tratta di un collo di bottiglia che deve essere ultra-ottimizzato.

Anche in quei casi, potrebbe non fare alcuna differenza. Ecco un esempio di come vorrei verificare, per C.

a volte non fa alcuna differenza con il codice compilato

short.c

int main() {
  if(1) {
    printf("Hello World");
  }
}

long.c

int main() {
  if(1) {
    printf("Hello World");
  } else {
    // not possible
  }
}

Poi ho compilato entrambi con l'opzione -S per compilare senza assemblare. Ho confrontato i file di assieme e erano identici.

a volte fa la differenza con il codice compilato

Ho quindi aggiornato i file e sostituito if(1) con int foo = 1; if(foo) e ho ripetuto il processo. (Lo so, il blocco non è ancora raggiungibile - quindi se il compilatore lo considera ancora irraggiungibile non ho provato nulla, ma se il compilatore lo considera così raggiungibile allora so di aver ingannato il compilatore e ho dimostrato il mio punto). In questo caso, i file compilati non erano identici: il compilatore non ignorava il blocco else vuoto quando pensava che fosse raggiungibile.

short.s

  ## call to printf, etc. (i.e. the if block)...
LBB0_2:
  ## rest of code...

long.s

  ## call to printf, etc. (i.e. the if block)...
  jmp LBB0_3 ## ! there is always a jump statement
LBB0_2:
  jmp LBB0_3
LBB0_3:
  ## rest of code...

Quindi in questa versione quasi raggiungibile, quando è incluso il blocco else vuoto, c'è un'istruzione jump extra alla fine del blocco if. Quindi se le prestazioni sono un problema chiave qui, quindi aggiungere il blocco vuoto non è una buona idea.

conclusione

In base alla lingua, il blocco else potrebbe modificare il codice compilato e influire sulle prestazioni. Dovresti controllare la lingua che stai utilizzando, e se ha un impatto sulle prestazioni nella tua lingua, decidi se le prestazioni sono più importanti della leggibilità in questa sezione di codice.

    
risposta data 28.04.2016 - 05:19
fonte
3

No, avere una clausola else solo per fare un commento non è generalmente una buona idea, solleva il codice con linee inutili e rallenta la lettura del programmatore.

Quando un programmatore legge il codice che il suo pensiero può essere: Guarda, c'è una clausola else , quindi quando urlStr non è impostata, qualcos'altro mig ... oh, non importa, è solo un segnaposto.

Cambiando il codice in:

bool isSeparator(string urlStr)
{
    return urlStr != null;
}

if (!isSeparator(urlStr))
{
    NSImage *iconImage = [[NSWorkspace sharedWorkspace] iconForFile:urlStr];
    node.nodeIcon = iconImage;
}

Ottenete la stessa cosa senza bisogno del blocco else e del commento.

    
risposta data 28.04.2016 - 09:10
fonte
3

No, è una pessima idea. Rende il tuo codice più complesso senza alcun beneficio. Se vuoi dichiarare esplicitamente la condizione else fallo con un commento sopra if :

// When the urlStr is false then it is a separator and no action is needed on the icon
if (urlStr)
{
    NSImage *iconImage = [[NSWorkspace sharedWorkspace] iconForFile:urlStr];
    node.nodeIcon = iconImage;
}
    
risposta data 28.04.2016 - 09:46
fonte
0

A volte può avere senso quando vuoi documentare che hai pensato che ci fosse un altro caso, ma volutamente fai notare che va bene non fare nulla in esso.

if (file.open()) {
   readStuffFrom(file);
} else {
   // file not found - but we can ignore this for now because REASONS
}
    
risposta data 28.04.2016 - 09:59
fonte
-1

Anche se non voterei contro il caso else nel codice di qualcun altro, personalmente preferirei il seguente modulo con la logica per evitare il codice aggiuntivo non operativo:

if (urlStr)
{
    // it's not a separator, so we set an icon
    NSImage *iconImage = [[NSWorkspace sharedWorkspace] iconForFile:urlStr];
    node.nodeIcon = iconImage;
}
    
risposta data 28.04.2016 - 12:08
fonte
-4

Controversia che non funzionerà bene come commento: c'è una ragione convincente per cui non puoi scrivere questo?

if (urlStr)
{
    NSImage *iconImage = [[NSWorkspace sharedWorkspace] iconForFile:urlStr];
    node.nodeIcon = iconImage;
}
// else it's a separator, don't bother with the icon
    
risposta data 28.04.2016 - 08:53
fonte

Leggi altre domande sui tag