Was ist wartbarer - boolesche Zuweisung über if / else oder booleschen Ausdruck?

11

Welches wäre wartbarer?

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

oder

 c = (a == b);

Ich habe versucht, in Code Complete zu suchen, kann aber keine Antwort finden.

Ich denke, das erste ist besser lesbar (man kann es buchstäblich laut vorlesen), was es meiner Meinung nach auch wartbarer macht. Die zweite ist sicherlich sinnvoller und reduziert den Code, aber ich bin nicht sicher, ob sie für C # -Entwickler so wartbar ist (ich würde erwarten, dass diese Redewendung beispielsweise in Python mehr zu sehen ist).

Bret Walker
quelle
3
Die beiden sind nicht gleichwertig. Sie benötigen eine else c = falsefür die erste oder machen die Aufgabe eine ||=in der zweiten.
17
Ich denke, die Tatsache, dass Sie zwei Änderungen am ersten Formular vornehmen mussten, beantwortet Ihre Frage!
James
7
Ich stimme @James zu. Die zweite Form ist zwar nicht so ausführlich, aber sehr einfach zu verstehen und lässt keine Unklarheit hinsichtlich ihrer Bedeutung. Es werden keine Tricks oder Abkürzungen verwendet, es ist nur kurz, weil das Konzept einfach ist. Die Tatsache, dass Sie den ersten mit einem Fehler codiert haben und ihn bearbeiten mussten, um ihn zu beheben, und dass er immer noch nicht perfekt ist (inkonsistente Verwendung von Klammern), ist ein Beweis dafür, dass er nicht so einfach ist, wie Sie denken.
Eric King
5
Wow, halten C # -Entwickler die erste Form wirklich für akzeptabel? Dies ... verringert mein Vertrauen in sie ernsthaft. Nach meiner Erfahrung deutet die Verwendung der ersten Form stark auf ein völliges Missverständnis der booleschen Ausdrücke hin.
Andres F.
2
Um die Dinge interessant zu halten, ist hier eine andere Option:c = a==b ? true : false;
FrustratedWithFormsDesigner

Antworten:

14

Die zweite Option ist besser.

Es gibt einen bestimmten Grund, sich vor cleveren Programmierverknüpfungen in Acht zu nehmen, die die Wartbarkeit beeinträchtigen, indem sie die Absicht des Codes verschleiern. Ich beschuldige Sie also nicht, die Frage gestellt zu haben.

Ich halte es jedoch nicht für c = (a == b);ein Beispiel für einen cleveren Trick. Es ist eine einfache Darstellung eines einfachen Konzepts. So einfach wie möglich.

Eine richtige „wartbar“ Formatierung Ihres ersten Beispiel (ohne die fehlenden Klammern und einzeilige Konstrukt, das ich tun eine geschickte Verknüpfung betrachten) würde diesen Code ergeben:

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

Nach meiner Erfahrung ist das Schreiben einer einfachen booleschen Logik auf solch eine ausführliche, fehleranfällige Weise ein Zeichen für "fragwürdigen" Code. Ich würde mich fragen, wie komplexere Logik in dieser Codebasis behandelt wird.

Eric King
quelle
15

Stellen Sie zunächst fest, dass Ihre beiden Formen nicht gleichwertig sind.

if (a == b) c = true;

cwird auf true gesetzt, wenn aes gleich ist b, und wenn nicht, bleibt sein Wert so, wie er bereits ist.

c = (a == b);

cwird auf true gesetzt, wenn aes gleich ist b, und wenn nicht, wird es auf false gesetzt.

Wenn Sie das Äquivalent des zweiten Formulars im Stil des ersten Formulars wünschen, müssen Sie es wie folgt schreiben:

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

Jetzt ist klar, welche der beiden Methoden besser lesbar, wartbarer und weniger fehleranfällig ist, wenn etwas geändert wird. Bleib bei der zweiten Form.

Mason Wheeler
quelle
Absolut richtig - ich habe meine Frage aktualisiert.
Bret Walker
Ich halte die zweite Form für zu lang und kompliziert. Wenn Sie diesen Effekt wünschen, verwenden Sie eine boolesche Zuweisung.
Monica wieder herstellen - M. Schröder
11

Ich würde nicht zustimmen, dass Ihr erstes Formular besser lesbar ist - es ist sicherlich kein idiomatisches C #, zwei Anweisungen in einer einzigen Zeile zu haben, und es wird nicht empfohlen, eine ifAnweisung ohne geschweifte Klammern zu haben.

Zweitens sehe ich nicht, dass die zweite Form weniger wartbar ist - es gibt nichts zu warten. Es ist eine einfache Aussage über die Beziehung zwischen aund bund es könnte nicht einfacher ausgedrückt werden.

Ein weiterer Grund, die zweite Form zu bevorzugen, besteht darin, dass Sie csie in einer einzigen Anweisung deklarieren und zuweisen können, d. H.

bool c = (a == b);

Das Ändern von Variablen kann leicht zu Fehlern führen, daher würde ich dies vermeiden. Für die Verwendung einer ifAnweisung muss die Variable vor der Bedingung deklariert und anschließend geändert werden.

Lee
quelle
Ich las die zwei Aussagen in einer Zeile als Pseudocode
Jimmy Hoffa
1
+1 für " Another reason to prefer the second form is that you can declare c and assign it in a single statement"
Andres F.
0

"wartbarer" könnte sehr subjektiv sein.

Normalerweise bevorzuge ich Lesbarkeit und Absicht gegenüber Code-Reduktion. Ich denke, Sie speichern 8 eingegebene Zeichen, indem Sie das reduzierte Formular verwenden.

Die Sprache und Kultur um die Sprache herum zu nehmen, ist meiner Meinung nach ein Merkmal der „Lesbarkeit“.

Es gibt Zeiten, in denen die Leistung dazu führen kann, dass der Code reduziert wird, um den resultierenden Bytecode zu optimieren. Dies sollte jedoch nach einigen Profilen sorgfältig durchgeführt werden.

Johnnie
quelle
Subjektiv: Duh. Code-Reduzierung: Kann auch (wenn nicht übertrieben) die Klarheit verbessern und Absichten besser kommunizieren. Leistung: Keine Rolle (Optimierung ist manchmal von entscheidender Bedeutung, fällt jedoch nicht unter die Optimierung, da dies praktisch nie von Bedeutung ist - wahrscheinlich auch nicht, wenn Sie Kernel oder Treiber schreiben).
4
Die erste Form hatte mindestens 1 Fehler, der korrigiert werden musste, versteckt in seiner Ausführlichkeit. Die zweite Form war einfach und auf den Punkt und hatte keinen Fehler. Ich ruhe meinen Fall aus. In jedem Fall bestand der Hauptzweck nicht darin, weniger Zeichen einzugeben! Und bei dieser Frage ging es überhaupt nicht um Leistung, was in diesem Fall irrelevant ist.
Andres F.
@ Delnan genau mein Punkt, Duh. Die Code-Reduzierung eines anderen ist die Klarheit eines anderen. Ich habe die Optimierung nicht als Hauptanliegen angeführt ... Ich habe sie als Beispiel verwendet. Ihr Grund, clevere Tricks hinzuzufügen oder über die Norm hinauszugehen, sollte durch das ausgeglichen sein, was Sie / Kultur / Unternehmen als lesbar betrachten.
Johnnie
1
Einen sauberen booleschen Ausdruck zu schreiben ist kein kluger Trick!
Andres F.
Ich denke, ich würde Ihrem Kommentar mehr Wert beimessen, wenn Sie sich tatsächlich mit dem Geist der Frage befassen und nicht mit einer verrückten Analogie, die verwendet wird, um ein zugrunde liegendes Konzept zu stützen.
Johnnie
0

Der Zweite. Es hat weniger Wiederholungen (DRY) und ist leichter zu verstehen, was vor sich geht, was cfür den Wert gilt, ob aund ob gleich sind oder nicht b.

IMHO wäre es noch besser

c = a == b

So wie ich schreiben würde

  • 1 + 2 + 3 Anstatt von ((1 + 2) + 3)
  • 5 + 3 * 7 Anstatt von (5 + (3 * 7))

Offensichtlich und trivial unnötiger Code ist keine Tugend. Es ist überladen.

Paul Draper
quelle
-4

Nachwähler, bitte erläutern Sie, was mit meiner überarbeiteten Antwort nicht stimmt.

Ja, c = (a == b);kann schwer zu lesen sein (noch schlimmer, StyleCop beschwert sich über die unnötige Klammer), aber ich mag immer noch die Einfachheit von a == b. Daher ist hier, was ich gerne benutze, wenn beide aund gleich bsind:

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

Und dann können Sie tun: this.c = this.NoPeriodanstelle von:

this.c = this.MyWavelength == this.HerWaveLength;
Job
quelle
1
Also meintest du return this.MyWaveLength = this.HerWaveLength;oder return this.MyWaveLength == this.HerWaveLength;stattdessen?
Jesse C. Slicer
5
Was!? c = (a == b);ist nicht fehleranfällig. Das erste Formular in der ursprünglichen Frage ist weitaus fehleranfälliger , wie das OP selbst zeigt, das seine Frage bearbeiten muss, um Fehler zu beheben!
Andres F.
Ich denke, Ihre vorgeschlagene Lösung hat einen Fehler = vs. ==
Ondra
@Ondra Morský, danke ... der Compiler hätte das für mich abgefangen.
Job
6
Ich bin mit StyleCop nicht vertraut, aber wenn es Ihnen sagt, dass unnötige Klammern schlecht sind, sollten Sie es deaktivieren. Unnötige Klammern sind für den Compiler nicht erforderlich, können aber für das menschliche Auge sehr, sehr schön sein. Wenn Sie geschrieben haben c = a == b; Der Compiler kann es gut herausfinden, aber für einen Menschen ist es schwieriger.
Michael Shaw