Bevorzugen Sie eine präzise oder lesbare Darstellung in Ihrem Code? [geschlossen]


21

Sprachverknüpfungen können häufig verwendet werden, um den Code übersichtlicher zu gestalten.

Ternäre und Null-Koaleszenz-Operatoren können beispielsweise die Codemenge reduzieren, was jedoch die Lesbarkeit beeinträchtigt:

In C #:

Person newGuy = new Person();
if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
} else {
    newGuy.Boss = boss;
}

ist funktional äquivalent zu:

Person newGuy = new Person();
newGuy.Boss = boss ?? GetDefaultBoss();

aber offensichtlich viel ausführlicher.

Wo ziehen Sie die Grenze zwischen Prägnanz und Lesbarkeit?


3
Dies ist eine subjektive Frage, jemand, der etwas implementiert hat, würde sagen, dass sein Weg Sinn macht, jemand, der es liest, würde sagen, dass es keinen Sinn macht, und eine andere Person, die es liest, würde sagen, dass ich es verstehe, aber ich bevorzuge einen anderen Weg. Dies ist lediglich eine Präferenz.
Chris

20
Ich denke, die zweite Version ist besser lesbar.
Vaibhav

2
Sie verwechseln Prägnanz mit Knappheit. Prägnanz verbessert die Lesbarkeit. Knappheit lenkt davon ab.
Ferruccio

1
@ ThorbjørnRavnAndersen: Die Zielgruppe für C # -Code sind normalerweise "Entwickler mit C # -Hintergrund". Nach dem, was ich gesehen habe, scheint der Konsens hier auf programmers.se zu sein, dass Sie die Verwendung nützlicher Sprachfunktionen nicht vermeiden sollten, nur weil jemand mit ihnen möglicherweise nicht vertraut ist. (Siehe auch: programmers.stackexchange.com/q/101513/33843. )
Heinzi

1
duplizieren ?: programmers.stackexchange.com/q/58630/15464 .. Oh, dieser ist älter. :)
Steven Jeuris

Antworten:


63

Beide.

Ihr erstes Beispiel ist sicherlich ausführlicher und wohl auch expliziter ... aber es erfordert auch, dass ich statt einer fünf Zeilen scanne. Schlimmer noch, es hebt seinen Zweck hervor - einen Wert zuzuweisen newGuy.Boss.

Ihr zweites Beispiel kann mich eine Sekunde kosten, wenn ich mit dem Null-Koaleszenz-Operator nicht vertraut bin, aber es besteht kein Zweifel an seinem Zweck, und wenn ich eine größere Routine durchsuche, um nach der Quelle eines Werts zu suchen, wird dies der Fall sein Es ist viel einfacher für mich, dies herauszufinden.

Nun kontrastiere dies:

if (boss == null) {
    newGuy.Boss = GetDefaultBoss();
    newGuy.IsTemp = true;
    newGuy.AddTask("orientation");
} else {
    newGuy.Boss = boss;
    newGuy.IsTemp = false;
}

...mit:

newGuy.Boss = boss ?? GetDefaultBoss();
newGuy.IsTemp = boss == null;
if ( boss == null ) newGuy.AddTask("orientation");

Das letztgenannte Beispiel ist wieder viel kürzer, aber jetzt wird sein Zweck dadurch verschleiert, dass Aufgaben, die durch denselben Test ausgelöst wurden, als unterschiedlich erscheinen. Hier halte ich die Ausführlichkeit der ersteren für gerechtfertigt.


3
Hervorragende Antwort! - Es geht weniger um Ausführlichkeit als um den Zweck.
Damovisa

2
@ Damovisa: genau - das Ziel des Codes ist die Kommunikation, und es gibt keinen allgemeinen Grund, warum dies nicht so präzise wie möglich erfolgen sollte (aber nicht mehr).
Shog9

1
Das Erlernen des Null-Koaleszenz-Operators dauert mehr als eine Sekunde - aber wenn Sie es nicht wissen, sollten Sie es lernen!
Casebash

2
Ah "??" wäre schön in Java.

Obwohl das letzte Beispiel im Code kürzer ist, wird es tatsächlich bossdreimal ausgewertet, im Gegensatz zu nur einmal im ausführlichen Beispiel. Dies ist nur ein weiterer Grund, warum kürzerer Code, nur um kürzer zu sein, eine schlechte Idee ist. Ich denke, Prägnanz sollte an zweiter Stelle des primären Ziels stehen, sei es Lesbarkeit / Wartbarkeit (für komplexen Code) oder Leistung (für kritische Abschnitte innerer Schleifen usw.). Mit anderen Worten, optimieren Sie niemals nur aus Gründen der Übersichtlichkeit - es sei denn, Sie möchten Ihren Code über eine 1-Bit / s-Verbindung senden;)
user193130

16

Obwohl beide gute Ziele sind, stehe ich immer auf der Seite der Lesbarkeit, wenn ich gezwungen bin , eines zu wählen.

Ich würde argumentieren, dass Ihr Beispiel sowohl die Lesbarkeit als auch die Kürze verbessert . Beachten Sie jedoch Folgendes:

if( a > b )
{
    foo = bar
}
else
{
    if( c.isThing() ){
        foo = somethingElse;
    }
    else{
        foo = someFurtherThing.GetFoo();
    }
}

im Gegensatz zu

foo = a > b ? bar ?? whatever.something : c.isThing() ? somethingElse : someFurtherThing.GetFoo();

Letzteres ist prägnant, aber schwer durchzulesen. Ersteres ist ausführlich, aber der Fluss der Logik ist klar.

Letztendlich dient die Kürze nur dem Zweck, mehr auf den Bildschirm zu passen. Die Lesbarkeit erleichtert das Debuggen und sollte daher generell bevorzugt werden.


11
Durch eine ordnungsgemäße Formatierung kann die Lesbarkeit des zweiten Beispiels leicht verbessert werden. Dies ist ein unfairer Vergleich. Bei dieser Formatierung bin ich mir nicht sicher, ob es so schlimm ist.
Steven Jeuris

Die Codebeispiele sind nicht gleichbedeutend: Das erste fehlt ?? whatever.something.
John B. Lambe

11

Ich würde generell sagen, dass die Lesbarkeit niemals aus Gründen der Übersichtlichkeit geopfert wird, aber die Lesbarkeit niemals aufgrund mangelnder Kenntnisse eines anderen Programmierers zu diesem Thema beurteilt wird.

Prägnanz und Lesbarkeit sind keine Gegensätze. Wie diese Antwort ist manchmal kürzer besser lesbar.


4
+1 für das Fehlen von Kenntnissen eines anderen Programmierers. Im angegebenen Beispiel ist die zweite Option nur dann weniger lesbar, wenn Sie nicht mit dem Nullkoaleszenzoperator vertraut sind. Ich würde meinen Code niemals unter der Annahme schreiben, dass meine Mitarbeiter die Sprachsyntax nicht kennen. Auch wenn sie nicht wussten, was es ??bedeutet, wenn ich es benutze und sie es dann lernen, haben wir beide davon profitiert. Und es ist nicht schwer, "?? operator" auf msdn.com einzugeben
Tim Goodman

4

Ich würde sagen, ich bevorzuge Lesbarkeit, obwohl das manchmal die Verwendung von prägnantem Code bedeutet. (Dh ternär für relativ einfache Bedingungen innerhalb eines größeren Bedingungsblocks.)

Grundsätzlich sollten Sie es nicht tun, wenn es unnötig schwer zu verstehen ist.


3

Die Lesbarkeit steht an erster Stelle, wenn sie im Widerspruch zur Prägnanz steht, da Code häufiger geändert wird als ursprünglich geschrieben. Auf der anderen Seite:

  1. Syntaktisches Rauschen und Boilerplate-Code verschleiern häufig die Absichten und beeinträchtigen somit die Lesbarkeit. Manchmal ist der prägnantere Code auch besser lesbar. Denken Sie beispielsweise an Lambda-Funktionen oder Delegaten / First-Class-Funktionen im Vergleich zu Klassen mit nur einer Methode, die eine Schnittstelle mit nur einer Methode implementieren.

  2. Die Lesbarkeit sollte danach beurteilt werden, wie einfach der Code zu lesen ist, und zwar für einen einigermaßen erfahrenen Programmierer, der die Sprache und ihre einzigartigen / erweiterten Funktionen ziemlich gut kennt, und nicht für einen kaum kompetenten Code-Affen, der nur den kleinsten gemeinsamen Nenner kennt.


2

Ein Aspekt, von dem ich glaube, dass er noch nicht erwähnt wurde: Was sind Ihre Ziele?

Wenn Ihnen nur die Arbeitsplatzsicherheit am Herzen liegt, sollten Sie bei allen anderen Aspekten auf Prägnanz und Kompaktheit achten. Überspringen Sie auch das Kommentieren Ihres Codes.

Wenn Sie in der Lage sein möchten, Ihren Code einfach an andere weiterzugeben, während Sie an einem coolen neuen Projekt arbeiten, sollten Sie auf Lesbarkeit, Klarheit und viele solide Kommentare achten.

Hinweis: Bei den obigen Angaben handelt es sich nicht um Sie persönlich, @Damovisa; Es ist für jeden, der zwischen den beiden Positionen wählt.


Das klingt nach Arbeitssicherheit, aber wenn Sie Programmierer werden möchten, ist es Arbeitssicherheit bei der falschen Firma ...;)
Alois Mahdal

2

Es gibt eine Sache, die die ausführliche Version als Vorteil hat.

Es hat mehr Zeilen und die meisten Debugger sind zeilenorientiert ! Es ist sehr schwierig, einen Haltepunkt in der Mitte eines Ausdrucks zu setzen, aber normalerweise ist es trivial einfach, ihn in einer Blockanweisung zu setzen.

Mit anderen Worten, welche möchten Sie in Ihrem Editor sehen, wenn Ihr Debugger wann aktiv werden soll boss == null?

(Das heißt ich mag den ?? - Operator)


0

Die Lesbarkeit sollte an erster Stelle stehen. Langfristig verbringen die meisten Menschen die meiste Zeit damit, vorhandenen Code zu ändern oder zu erweitern. Die Lesbarkeit ist ein großer Teil der Wartbarkeit.

Das heißt, Prägnanz ist etwas, das zur Lesbarkeit beitragen kann. In Ihrer Frage ist beispielsweise das zweite Snippet lesbarer und übersichtlicher.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.