Einzeilige Anweisungen und bewährte Verfahren

11

Ich habe kürzlich eine Angewohnheit erworben, von der ich weiß, dass viele von Ihnen sie missbilligen, die mir aber letztendlich hilft, die globale Codestruktur im Auge zu behalten und nicht die Struktur einer einzelnen, (manchmal) sich wiederholenden Methode: das Gruppieren einer Zahl von Anweisungen in einer einzelnen Zeile, wie folgt:

textBox1.Text = "Something!"; textBox2.Text = "Another thing!"; textBox3.Text = "Yet another thing!";

im Gegensatz zu

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";

Ich mache das für sich wiederholende Aufgaben, um den gesamten Code "Schönheit" beizubehalten und mir zu helfen, die Programmstruktur einfach zu verfolgen, aber ich gebe zu, dass dies möglicherweise keine gute Praxis ist. Ich benutze es tatsächlich sehr oft, daher würde ich gerne wissen, was Sie darüber denken. Denken Sie auch, dass jeder, der jemals meinen Code pflegen müsste, Probleme mit diesem Ansatz hat?

Benutzer
quelle
5
Dies könnte eine gute Frage für codereview.stackexchange.com sein
1
Ich werde ein Problem haben, wenn ich warten würde. Das erste, was ich tun würde, ist STRG + F für ";" und setzen Sie einen Zeilenumbruch. Aber das bin nur ich :-). Ich mag eine Zeile nur, wenn ich einen Grund habe, beispielsweise aktivierte Eigenschaften einiger Textfelder mit dem Standardwert false zu initialisieren: textBox1.Enabled = textBox2.Enabled = false;
Arun
2
Wenn Sie eine Frage zum Codierungsstil stellen, ist es hilfreich, wenn Sie die Sprache angeben.
Caleb
3
Während es im angegebenen Beispiel möglicherweise nicht auftritt, wie werden Sie einen Haltepunkt in die zweite oder dritte oder ... Anweisung setzen, wenn Sie alle in eine Zeile setzen?
Marjan Venema
1
Außerdem bin ich an die automatisierte Formatierung (Java) gewöhnt, bei der Code ohnehin ein einheitliches Aussehen erhält.
Kwebble

Antworten:

22

Ich denke wirklich, dass die Lesbarkeit sowohl für Sie als auch für jeden anderen, der den Code liest, sehr leiden würde. Es macht alles Sinn, wenn Sie es das erste Mal schreiben, weil es aktiv in Ihrem Kopf ist. Wenn Sie Code scannen, um festzustellen, welche Variablen und Funktionen sich wo befinden, ist dies anders. Sie zerstören Ihre eigene Fähigkeit, Ihren eigenen Code zu scannen. Das ist ein riesiges Nein-Nein und darüber hinaus schlecht, wenn jemand Ihren Code jemals lesen muss.

Denken Sie auch darüber nach, wie Sie Code lesen. Es ist immer von oben nach unten und scrollt nach unten. Ihre Methode passt nicht dazu und führt sogar eines der hässlichsten Probleme beim Lesen von Code ein. horizontal scrollen . Unterschätzen Sie niemals, wie schwer das Lesen von Code erschweren kann. Sie scrollen niemals horizontal, Sie lassen niemals Menschen horizontal scrollen, in fast jedem Kontext ist es extrem unnatürlich.

Wenn Ihr Problem die wiederholte Codeeingabe ist, vergessen Sie Strg-C nicht. In Ihrem Beispielcode ist es möglicherweise effizienter, das alles manuell einzugeben. Wenn Sie jedoch einige Zeilen mehrmals kopieren müssen, scheint es genauso effizient zu sein, Zeile eins plus eine neue Zeile zu kopieren, fügen Sie sie ein x mal und nehmen Sie die Änderungen vor, weniger wahrscheinlich, um auch einen Tippfehler zu machen.

Oh, und Tippfehler! Wenn Sie die Lesbarkeit Ihres Codes auf diese Weise beeinträchtigen, kann es zu einem Albtraum werden, herauszufinden, welche der 50 Variablendeklarationen Sie falsch eingestellt haben. Die meisten Compiler geben jetzt Fehler bei Zeilen- UND Spaltennummern an, aber das Auffinden eines Fehlers in einer Zeile ist VIEL einfacher als das Auffinden einer Spalte.

Ben Brocka
quelle
2
a) Lesen / Scannen von Code - Die meisten Leute lesen beim Scannen von Code die ersten Zeichen der Zeile und fahren dann fort, es sei denn, es ist "interessant". Dann lesen sie ein paar mehr. Compilerfehler: Meistens interpretiere ich den Compilerfehler als "Problem mit Zeile <x>". Nur wenn ich es nicht sofort herausfinden kann (selten), lese ich den Fehler tatsächlich.
Mattnz
19

Eine Anweisung pro Zeile erleichtert es auch zu erkennen, was sich in einem Side-by-Side-Diff geändert hat.

Hugo
quelle
2
Dies ist wahrscheinlich der Hauptgrund dafür, dass fast alle Zusammenführungswerkzeuge das Isolieren und Verschieben von Zeilen anstelle von Teilzeichenfolgen von Zeilen erleichtern, wenn jemand diesen Code zusammenführen muss.
Anon
@anon Guter Punkt auch über Merge-Tools; Eine Anweisung pro Zeile bedeutet weniger Zusammenführungskonflikte zum Bereinigen.
Hugo
10

Während das Beispiel dies nicht zeigt, gibt es ein weiteres Problem beim Gruppieren mehrerer Anweisungen in einer Zeile. Was ist, wenn eine der fünf Anweisungen in einer einzelnen Zeile eine Ausnahme auslöst?

Ihre Stapelverfolgung sagt "EBlah in Zeile N" ... und jetzt haben Sie keine Ahnung, welche dieser fünf Anweisungen die Ausnahme ausgelöst hat.

(Dasselbe passiert mit einer übermäßig langen Aussage jeglicher Art.)

Frank Shearar
quelle
2
Das gleiche Konzept gilt für das Debuggen, bei dem die Granularität wiederum typischerweise eine Zeilennummer ist.
David Hammen
2
Oh mein ja, das kann ein Problem sein. Ein „Favorit“ ist, wenn Sie einen Nullzeiger in etwas wie foo.bar[grill.boo].flip.flap[flop].mickey(minnie).marshmallow(Java / C # -Syntax) verlieren . Das Durchsuchen dieser Art von Chaos ist immer besser mit zusätzlichen Zeilen (und temporären Variablen… und einem 2D6-Hinweis für den ursprünglichen Entwickler).
Donal Fellows
7

One-Statement-per-Line ist ein weit verbreiteter Codierungsstil. Infolgedessen werden die meisten Entwickler, die sich Ihren Code in Zukunft ansehen, wahrscheinlich zusammenzucken, wenn sie mehrere Anweisungen pro Zeile sehen. Wenn Sie es gewohnt sind, etwas so zu sehen, kann es verwirrend sein, es anders zu sehen.

Aus diesem Grund rate ich davon ab, außer in seltenen Fällen.

Igby Largeman
quelle
4

Ich habe dies vor 25 Jahren zum letzten Mal getan, indem ich interpretierte Sprachen auf kleinen Mikros mit niedrigen Taktraten verwendet habe, wobei jeder Leerzeichen- oder Wagenrücklauf eine Leistungssteigerung zur Folge hatte.

Ich zucke jetzt bei dem Gedanken daran zusammen (obwohl es aus einem guten Grund getan wurde).

Leider ist ein solcher Code schwer zu lesen und daher schwer zu pflegen.

schnell_now
quelle
1
Sie schreiben es also richtig und entfernen dann Leerzeichen und andere Vorbereitungen für Ihre "Maschinenkopie". Genau wie heutzutage Javascript zu minimieren.
CaffGeek
1
Ja - ich habe 1986 ein Programm geschrieben, um auch solchen Quellcode wieder aufzubereiten. Eine andere Sache, die ich hoffentlich nie wieder tun muss.
schnell_now
1

Syntaktisch ist daran wirklich nichts auszusetzen. Es hängt wirklich vom Codierungsstil Ihres Teams ab.

Da der größte Teil des Codes, den ich gesehen habe (einschließlich des Codes, der sich in den Standard-C ++ - Headern befindet), auf diese Weise erstellt wurde, würde ich Ihre erste Methode verwenden.

textBox1.Text = "Something!";
textBox2.Text = "Another thing!";
textBox3.Text = "Yet another thing!";
Neugieriger George
quelle
0

Dies ist ein wirklich ungewöhnlicher Codierungsstil.

Ich würde Ihnen empfehlen, stattdessen leere Zeilen zu verwenden, um logische Teile des Codes abzugrenzen.

svick
quelle
0

Wenn Sie zu weit nach rechts gehen, können genauso viele Probleme auftreten wie bei mehreren Zeilen.

Ich musste mich mit einigen SQL-Anweisungen mit Dutzenden von Feldern befassen. Normalerweise würde ich eine pro Zeile einfügen, aber in einigen Fällen habe ich 3 oder 4 zu einer Zeile zusammengefasst. Dies scheint eine gute Idee während der Entwicklung zu sein, wenn Sie mehrmals nach oben und unten scrollen müssen.

Ich bedauere, zu diesem Code zurückgekehrt zu sein. Zusätzliche Zeilen zu haben, scheint einfach kein so großes Problem zu sein, deshalb räume ich es normalerweise auf.

JeffO
quelle
0

Denken Sie auch, dass jeder, der jemals meinen Code pflegen müsste, Probleme mit diesem Ansatz hat?

Nachdem er eine Minute lang die Hände auf den Kopf gelegt hat, verwendet er die bevorzugten IDE Regex-Funktionen, um den gesamten unlesbaren Code automatisch in eine Anweisung pro Zeile zu unterteilen.

Ein kurzer Blick auf das Beispiel, das Sie gezeigt haben, reicht aus, um zu verstehen, wie viel lesbarer der zweite Ansatz ist.

Es ist viel einfacher, dem vertikalen Seitenfluss zu folgen, ohne dass sich Ihre Augen für immer horizontal bewegen müssen.

Schauen Sie sich Ihr Beispiel an: Sie wissen sofort, dass sich der Code ausschließlich auf die TextEigenschaften verschiedener textBoxObjekte bezieht und diese Zeichenfolgen als Werte enthalten. Ziemlich einfach.

Jose Faeti
quelle
0

Ich persönlich würde einen solchen Stil nicht verwenden. Zusammenfassen

Vorteile

  • weniger Codezeilen zum Scrollen
  • kann verwendet werden, um Code semantisch zu gruppieren, um auszudrücken: "viele Aufgaben". ABER Sie können einen solchen Block jederzeit in eine Funktion umgestalten, wenn Sie dies zu sehr stört.

Nachteile

  • schwer zu lesen, es ist im Allgemeinen einfacher, Code horizontal zu lesen (Überfliegen, keine Augenbewegung, ...)
  • Diff wird leicht zu einem Albtraum, einschließlich der Verschmelzung
  • schwieriger zu ändern (kopieren & einfügen, auskommentieren, ...)
  • Das Debuggen kann in vielen IDEs ein Problem sein, da sie in Zeilen anstatt in einzelnen Ausdrücken arbeiten.
Beschädigen
quelle
Einige der "Nachteile" können manchmal Vorteile sein. Angenommen, ein Code enthält acht aufeinanderfolgende Operationen des Formulars if (x > maxX) {x=maxX; peggedAny = true;}. Wenn jede solche Operation leicht in eine einzelne Zeile passt, hätte ich lieber acht solche Zeilen als Dutzende von Zeilen, die die Anweisungen aufteilen. Wenn solche Vergleiche an genügend Stellen verwendet peggedAny |= pegValueMinMax(ref x, minX, maxX);würden, wären möglicherweise vier Aussagen des Formulars besser, aber jemand, der dies liest, müsste lesen, um pegValueMinMaxzu sehen, was es tut.
Supercat
Wenn sich ein kleines Stück einer Linie ändert, betrachtet ein "Diff" dies als eine Änderung der gesamten Linie. Wenn sich die Leitung funktional als Einheit verhalten sollte, wäre das eine gute Sache. Wenn eine semantische Operation auf mehrere Zeilen aufgeteilt wird, können Änderungen an einigen Zeilen die Operation auf eine Weise beeinflussen, die nicht ersichtlich wäre.
Supercat