Che è più gestibile - assegnazione booleana tramite if / else o espressione booleana?

11

Quale sarebbe considerato più manutenibile?

if (a == b) c = true; else c = false;

o

 c = (a == b);

Ho provato a cercare nel codice completo, ma non riesco a trovare una risposta.

Penso che il primo sia più leggibile (puoi letteralmente leggerlo ad alta voce), che penso anche lo renda più mantenibile. Il secondo ha sicuramente più senso e riduce il codice, ma non sono sicuro che sia mantenibile per gli sviluppatori C # (mi aspetto di vedere questo idioma più, per esempio, Python).

    
posta Bret Walker 30.11.2012 - 22:23
fonte

6 risposte

14

La seconda opzione è migliore.

C'è una ragione precisa per diffidare di scorciatoie di programmazione intelligenti che danneggiano la manutenibilità oscurando l'intento del codice. Quindi, non ti biasimo per aver fatto la domanda.

Tuttavia, non considero c = (a == b); come un esempio di trucco intelligente. È una rappresentazione semplice di un concetto semplice. Più semplice che puoi ottenere.

Una formattazione corretta, "manutenibile" del tuo primo esempio (senza le parentesi mancanti e il costrutto di una riga, che io faccio consideri una scorciatoia intelligente) produrrebbe questo codice:

if (a == b)
{
    c = true; 
}
else 
{
    c = false;
}

Nella mia esperienza, scrivere una logica booleana semplice in un modo verboso e incline agli errori è un segno di codice "iffy". Mi farebbe pensare a come la logica più complessa venga gestita in questo code-base.

    
risposta data 30.11.2012 - 23:16
fonte
15

Innanzitutto, renditi conto che le tue due forme non sono equivalenti.

if (a == b) c = true;

c sarà impostato su true se a è uguale a b , e se no, il suo valore rimarrà quello che già è.

c = (a == b);

c verrà impostato su true se a è uguale a b , e in caso contrario, verrà impostato su false.

Se vuoi l'equivalente del secondo modulo, nello stile del primo modulo, devi scriverlo in questo modo:

if (a == b) {
  c = true;
} else c = false;

Ora è chiaro quale delle due è più leggibile, più gestibile e meno probabile che introduca bug se qualcosa viene modificato. Rimani con il secondo modulo.

    
risposta data 30.11.2012 - 22:33
fonte
11

Non sono d'accordo sul fatto che la tua prima forma sia più leggibile - non è certo C # idiota avere due istruzioni su una singola riga, e non è consigliabile avere un'istruzione if senza usare le parentesi.

In secondo luogo, non vedo come la seconda forma sia meno gestibile - non c'è nulla da mantenere. È una semplice dichiarazione della relazione tra a e b e non potrebbe essere espressa più semplicemente.

Un altro motivo per preferire il secondo modulo è che puoi dichiarare c e assegnarlo in una singola istruzione i.e.

bool c = (a == b);

La modifica delle variabili può facilmente portare ad errori, quindi eviterei di farlo. L'utilizzo di un'istruzione if richiede che la variabile sia dichiarata prima del condizionale e quindi modificata.

    
risposta data 30.11.2012 - 23:06
fonte
0

"più gestibile" potrebbe essere molto soggettivo.

Di solito preferisco la leggibilità e l'intento sulla riduzione del codice. Penso che tu abbia salvato 8 caratteri digitati usando il modulo ridotto.

Prendere la lingua e la cultura intorno alla lingua è una caratteristica della "leggibilità" a mio parere.

Ci sono momenti in cui le prestazioni possono causare la riduzione del codice per ottimizzare il codice byte risultante, ma questo dovrebbe essere fatto con attenzione dopo qualche profilazione.

    
risposta data 30.11.2012 - 22:33
fonte
0

Il secondo. Ha meno ripetizioni (DRY) ed è più facile capire cosa sta succedendo, che c tiene al valore se a e b sono uguali.

IMHO, ancora meglio sarebbe

c = a == b

Proprio come scriverei

  • 1 + 2 + 3 invece di ((1 + 2) + 3)
  • 5 + 3 * 7 invece di (5 + (3 * 7))

Ovviamente e il codice inutilmente banale non è una virtù. È ingombra.

    
risposta data 17.06.2015 - 20:12
fonte
-4

Elettori discendenti, ti preghiamo di approfondire cosa c'è di sbagliato nella mia risposta rivista

Sì, c = (a == b); può essere difficile da leggere (peggio ancora, StyleCop lamenta la parentesi non necessaria), ma mi piace ancora la semplicità di a == b . Pertanto, ecco cosa mi piace utilizzare quando sia a che b sono uguali:

private static bool NoPeriod
{
    get
    {
        return this.MyWaveLength == this.HerWaveLength;
    }
}

E quindi puoi fare: this.c = this.NoPeriod invece di:

this.c = this.MyWavelength == this.HerWaveLength;
    
risposta data 30.11.2012 - 22:55
fonte