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).
.net
code-quality
readability
maintainability
clean-code
Bret Walker
quelle
quelle
else c = false
für die erste oder machen die Aufgabe eine||=
in der zweiten.c = a==b ? true : false;
Antworten:
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:
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.
quelle
Stellen Sie zunächst fest, dass Ihre beiden Formen nicht gleichwertig sind.
c
wird auf true gesetzt, wenna
es gleich istb
, und wenn nicht, bleibt sein Wert so, wie er bereits ist.c
wird auf true gesetzt, wenna
es gleich istb
, 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:
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.
quelle
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
if
Anweisung 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
a
undb
und es könnte nicht einfacher ausgedrückt werden.Ein weiterer Grund, die zweite Form zu bevorzugen, besteht darin, dass Sie
c
sie in einer einzigen Anweisung deklarieren und zuweisen können, d. H.Das Ändern von Variablen kann leicht zu Fehlern führen, daher würde ich dies vermeiden. Für die Verwendung einer
if
Anweisung muss die Variable vor der Bedingung deklariert und anschließend geändert werden.quelle
Another reason to prefer the second form is that you can declare c and assign it in a single statement
""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.
quelle
Der Zweite. Es hat weniger Wiederholungen (DRY) und ist leichter zu verstehen, was vor sich geht, was
c
für den Wert gilt, oba
und ob gleich sind oder nichtb
.IMHO wäre es noch besser
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.
quelle
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 vona == b
. Daher ist hier, was ich gerne benutze, wenn beidea
und gleichb
sind:Und dann können Sie tun:
this.c = this.NoPeriod
anstelle von:quelle
return this.MyWaveLength = this.HerWaveLength;
oderreturn this.MyWaveLength == this.HerWaveLength;
stattdessen?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!