Cosa è più gestibile: assegnazione booleana tramite if / else o espressione booleana?


11

Quale sarebbe considerato più mantenibile?

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

o

 c = (a == b);

Ho provato a cercare in 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 che lo renda più mantenibile. Il secondo ha sicuramente più senso e riduce il codice, ma non sono sicuro che sia sostenibile per gli sviluppatori C # (mi aspetto di vedere questo linguaggio più in Python, ad esempio).


3
I due non sono equivalenti. Hai bisogno di a else c = falseper il primo o di assegnare il compito ||=a nel secondo.

17
Penso che il fatto che tu abbia dovuto apportare due modifiche al primo modulo risponda alla tua domanda!
James,

7
Sono d'accordo con @James. La seconda forma, sebbene non così dettagliata, è molto semplice da comprendere e non lascia ambiguità sul suo significato. Non ci sono trucchi o scorciatoie da prendere, è solo breve perché il concetto è semplice. Il fatto che tu abbia codificato il primo con un bug e che tu abbia dovuto modificarlo per risolverlo, e non è ancora perfetto (uso incoerente delle parentesi graffe), è la prova positiva che non è così semplice come pensi.
Eric King,

5
Wow, gli sviluppatori di C # considerano davvero accettabile la prima forma? Questo ... riduce seriamente la mia fiducia in loro. Nella mia esperienza, l'uso della prima forma suggerisce fortemente un completo fraintendimento delle espressioni booleane.
Andres F.

2
Giusto per mantenere le cose interessanti, ecco un'altra opzione:c = a==b ? true : false;
FrustratedWithFormsDesigner

Risposte:


14

La seconda opzione è migliore.

C'è un motivo preciso per diffidare delle 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);essere un esempio di trucco intelligente. È una rappresentazione semplice di un concetto semplice. Il più diretto possibile.

Una corretta, "mantenibile" formattazione del primo esempio (senza le parentesi mancanti e una linea costrutto, che io faccio considerare un collegamento intelligente) produrrebbe questo codice:

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

Nella mia esperienza, scrivere una semplice logica booleana in modo così dettagliato e soggetto a errori è un segno di codice "iffy". Mi farei meravigliare di come la logica più complessa venga gestita in questa base di codice.


15

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

if (a == b) c = true;

csarà impostato su true se aè uguale a b, e in caso contrario, il suo valore rimarrà qualunque esso sia già.

c = (a == b);

csarà impostato su true se aè uguale a b, e in caso contrario, sarà 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 dei due è più leggibile, più gestibile e meno probabilità di introdurre bug se qualcosa viene cambiato. Stick con la seconda forma.


Assolutamente giusto - ho aggiornato la mia domanda.
Bret Walker,

Considero la seconda forma eccessivamente lunga e complicata - se vuoi quell'effetto, usa un compito booleano.
Ripristina Monica - M. Schröder l'

11

Non sarei d'accordo sul fatto che il tuo primo modulo sia più leggibile - non è certamente idiomatico C # avere due istruzioni su una sola riga, e non è consigliabile avere ifun'istruzione senza usare le parentesi graffe.

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

Un altro motivo per preferire il secondo modulo è che puoi dichiararlo ce assegnarlo in una singola istruzione, ad es

bool c = (a == b);

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


Ho letto le due dichiarazioni su una riga come pseudo codice
Jimmy Hoffa,

1
+1 per " Another reason to prefer the second form is that you can declare c and assign it in a single statement"
Andres F.

0

"più mantenibile" potrebbe essere molto soggettivo.

Di solito preferisco la leggibilità e l'intenzione rispetto alla riduzione del codice. Penso che tu salvi 8 caratteri digitati usando il modulo ridotto.

Portare la lingua e la cultura intorno alla lingua è una caratteristica della "leggibilità" secondo me.

Ci sono momenti in cui le prestazioni possono essere la causa della riduzione del codice per ottimizzare il codice byte risultante, ma ciò dovrebbe essere fatto con attenzione dopo un po 'di profilazione.


Soggettivo: Duh. Riduzione del codice: può anche (se non esagerare) migliorare la chiarezza e comunicare meglio l'intento. Prestazioni: non preoccupano affatto (l'ottimizzazione a volte è vitale, ma questo non è qualcosa che non rientra nell'ottimizzazione, perché praticamente non importa mai, probabilmente nemmeno se stai scrivendo kernel o driver).

4
La prima forma aveva almeno 1 bug che doveva essere corretto, nascosto nella sua verbosità. La seconda forma era semplice e precisa e non aveva bug. Non ho niente da aggiungere. In ogni caso, lo scopo principale non era digitare meno caratteri! E questa domanda non riguardava affatto le prestazioni, il che è irrilevante in questo caso.
Andres F.

@delnan esattamente il mio punto, Duh. la riduzione del codice di qualcuno è la chiarezza di qualcun altro. Non ho citato l'ottimizzazione come preoccupazione principale ... L'ho usato come esempio. La tua ragione per aggiungere trucchi intelligenti o andare fuori dalla norma dovrebbe essere bilanciata da qualunque cosa tu / cultura / impresa consideri leggibile.
Johnnie,

1
Scrivere un'espressione booleana pulita non è un trucco intelligente!
Andres F.

Immagino che darei più merito al tuo commento se in realtà affrontassi lo spirito della domanda e non un'analogia insensata usata per sostenere un concetto di base.
Johnnie,

0

Il secondo. Ha meno ripetizione (DRY) ed è più facile da capire cosa sta succedendo, che ctiene al valore o meno aed essere bsono uguali.

IMHO, anche meglio sarebbe

c = a == b

Proprio come scriverei

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

Il codice ovviamente e banalmente superfluo non è una virtù. È ingombra.


-4

Sottotitoli, per favore, elaborate cosa non va nella mia risposta rivista.

Sì, c = (a == b);può essere difficile da leggere (peggio ancora, StyleCop si lamenta della parentesi non necessaria), ma mi piace ancora la semplicità di a == b. Pertanto, ecco cosa mi piace usare quando entrambi ae bsono uguali:

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

E poi puoi fare: this.c = this.NoPeriodinvece di:

this.c = this.MyWavelength == this.HerWaveLength;

1
così intendevi return this.MyWaveLength = this.HerWaveLength;o return this.MyWaveLength == this.HerWaveLength;invece?
Jesse C. Slicer,

5
Che cosa!? c = (a == b);non è soggetto a errori. Il primo modulo nella domanda originale è molto più soggetto a errori , come dimostrato dall'OP stesso che deve modificare la sua domanda per correggere i bug!
Andres F.

Immagino che la tua soluzione suggerita abbia un bug = vs. ==
Ondra

@Ondra Morský, grazie ... il compilatore me lo avrebbe preso.
Giobbe

6
Non ho familiarità con StyleCop, ma se ti dice che le parentesi non necessarie sono cattive, dovresti disattivarlo. Le parentesi non necessarie non sono necessarie per il compilatore, ma possono essere molto, molto belle per gli occhi umani. Se hai scritto c = a == b; il compilatore può capirlo bene, ma è più difficile per un essere umano.
Michael Shaw,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.