Soll ich Zeilenumbrüche vor oder nach binären Operatoren setzen? [geschlossen]

11

Wenn Sie in Python oder Javascript arbeiten, sollten Sie Binäroperatoren immer am Ende der vorherigen Zeile einfügen, um zu verhindern, dass Zeilenumbrüche Ihren Code vorzeitig beenden. Es hilft Ihnen, Fehler zu erkennen.

Aber in C oder C ++ ist dies kein Problem, also frage ich mich:

Gibt es einen Grund für mich, die zweite Version der ersten vorzuziehen?

return lots_of_text
       + 1;

gegen

return lots_of_text +
       1;

(Hilft einer von ihnen beispielsweise dabei, andere Arten von Fehlern zu vermeiden? Oder wird einer von ihnen als besser lesbar angesehen?)

user541686
quelle
Nein, das sollten Sie in Python nicht tun, vor allem, weil es nicht den Effekt hat, den Sie behaupten. Ein nachfolgender Operator verursacht keine Zeilenfortsetzung. Ein Backslash oder nicht geschlossene Klammern, Klammern oder Klammern.
@delnan: Ich habe (sehr sorgfältig) nie gesagt, dass es eine Zeilenfortsetzung verursacht . Mir ist bewusst, dass Sie noch Gruppierungszeichen einschließen müssen. Ich sagte, es hilft, Fehler zu vermeiden, wenn Ihre Leitung vorzeitig endet, was es auch tut, indem es Ihnen einen Fehler gibt.
user541686
Ich verstehe, aber das macht es auch nicht. Zumindest habe ich das noch nie gesehen (und ich befolge strikt die PEP 8-Regel zum Setzen von Zeilenumbrüchen nach Operatoren), und ich kann mir keinen nicht erfundenen Code vorstellen, der mit dem Zeilenumbruch vor dem Operator, aber nicht nach dem Operator gültig ist. Zum Beispiel Fehler wie in Ihrem ersten Snippet auch Fehler (aufgrund von Einrückungen). Fügt jemand beim Teilen einer Linie keine Einrückungen hinzu?
@delnan: Es ist eigentlich sehr einfach, die Einrückung versehentlich mit Ihrem Texteditor zu vermasseln, z. B. bei der Massenbearbeitung oder bei der Auswahl von Rechtecken. Und wenn / wenn dies während der Wartung passiert, erhalten Sie im ersten Fall keinen Fehler und es rutscht lautlos an Ihnen vorbei, aber im zweiten Fall wird ein netter Fehler angezeigt.
user541686
4
Ich bin mir nicht sicher, warum dies abgelehnt wurde. Es scheint eine vernünftige Frage zum Codierungsstil zu sein.
Stuart Marks

Antworten:

18

Wie Sie den Antworten entnehmen können, besteht in dieser Angelegenheit kein Konsens. Verwenden Sie das , womit Sie sich besser auskennen, es sei denn, Sie arbeiten in einem Team .


Ich bevorzuge das Einfügen einer neuen Zeile vor Operatoren.

Immer wenn ich Zeilen brechen muss, setze ich normalerweise höchstens einen Begriff derselben "Ebene" in eine Zeile:

Newtons Gravitationsgesetz in Python:

force = (
    gravitational_constant
    * mass_1
    * mass_2
    / (distance * distance)
)

Vergleichen Sie dies mit:

force = (
    gravitational_constant *
    mass_1 *
    mass_2 /
    (distance * distance)
)

Ich will wissen, dass ich „divide durch Abstand zum Quadrat“, ich will nicht wissen, dass „mass_2 wird geteilt“, weil das nicht ist , wie ich mathematischen Ausdrücke denken.

Außerdem möchte ich normalerweise zuerst wissen, was ich tue (Operator), bevor ich mich darum kümmere, womit ich Dinge mache (Operanden).

Oder betrachten Sie diese verschlungene SQL-Anweisung:

WHERE
  a = 1
  AND b = 2
  AND c = 3
  AND ( -- or put the OR on one line together with the AND
    d = 3 
    OR e = 1)
  AND x = 5

Auf diese Weise kann ich sehen, wie die einzelnen Bedingungen sehr einfach miteinander verbunden werden können, indem ich einfach von oben nach unten überfliege, ohne jede Zeile bis zum Ende lesen zu müssen, um den Operator zu finden, im Gegensatz zu:

WHERE
  a = 1 AND
  b = 2 AND
  c = 3 AND
  ( 
    d = 3 OR
    e = 1) AND
  x = 5

Ich denke an Ersteres in Bezug auf " Xist wahr", dann ändere ich das, indem ich sage: " UND das ist auch wahr", was sich für mich natürlicher anfühlt als umgekehrt. Außerdem finde ich das erste viel einfacher visuell zu analysieren.

Oder ein PHP-Beispiel:

$text = "lorem ipsum"
      . "dolor sit amet, "
      . "consectetur adipisicing elit, "
      . "sed do eiusmod tempor";

Auch hier kann ich das Lesen nur vertikal überfliegen, um zu sehen, dass ich nur Text verkette, da ich die meiste Zeit das Gefühl habe, dass es mir eigentlich egal ist, was sich in den Zeichenfolgen / Bedingungen befindet.

Natürlich würde ich diesen Stil nicht unbedingt anwenden. Wenn es mir sinnvoller erscheint, die neue Zeile nach einem Operator zu setzen, würde ich dies tun, aber mir fällt derzeit kein Beispiel ein.

phant0m
quelle
Fehlende Klammern zum ersten Beispiel hinzugefügt.
Kevin Cline
1
+1: genau richtig; Mathematik wird immer so gesetzt, dass Fortsetzungszeilen mit einem Operator beginnen.
Kevin Cline
+1 aus den gleichen Gründen, die Sie beschreiben, aber Ihr PHP-Beispiel erscheint mir ziemlich seltsam. Sollten diese Konkate nicht einfach sein ., nicht .=?
Izkata
@ Izkata oh ja, du bist natürlich richtig. Vielen Dank. kevin: Die Klammern waren korrekt;) Ich habe sie gerade ausgerichtet mitforce
phant0m
11

Ich breche fast immer Zeilen vor binären Operatoren, um den Lesern des Codes klar zu machen, dass dies die Fortsetzung eines Ausdrucks und nicht die nächste Anweisung ist. Dies ist wichtig, wenn die nächste Anweisung normalerweise eingerückt wird. Betrachten Sie beispielsweise eine if- Anweisung mit einem komplexen bedingten Ausdruck:

if (first_part_of_condition &&
    second_part_of_condition) {
    statement_within_then_part;
}

Der zweite Teil des bedingten Ausdrucks kann leicht mit der ersten Aussage des damaligen Teils verwechselt werden. Dies kann ziemlich verwirrend sein, wenn der erste Teil der Bedingung lang ist und das && weit rechts endet. Vergleichen Sie dies mit der Alternative:

if (first_part_of_condition
    && second_part_of_condition) {
    statement_within_then_part;
}

Das sieht etwas seltsam aus, macht aber deutlich, dass der zweite Teil der Bedingung nicht der Anfang einer Aussage ist.

Ich mache das auch in anderen Kontexten, aber die if-Anweisung ist die wichtigste, da der Einzug mehrdeutig ist. Natürlich könnte man die Einrückung oder die Platzierung der Klammer ändern, aber das sieht auch seltsam aus.

Das linke Ende der Zeile ist für ein schnelles Leseverständnis wichtiger. Wenn Sie also den Operator am linken Ende platzieren, ist dies ein deutlicherer Hinweis darauf, dass dies ein fortgesetzter Ausdruck und keine Aussage ist.

Stuart Marks
quelle
Interessanter Gedanke, aber ich finde das immer noch ziemlich verwirrend (besonders wenn er fertig ist +und -auch als unäre Präfixoperatoren verstanden werden könnte). Die übliche Lösung, um die fortlaufenden Linien hervorzuheben, besteht darin, sie stärker einzurücken (dh um zwei Ebenen).
Konrad Rudolph
"Der zweite Teil des bedingten Ausdrucks kann leicht mit der ersten Anweisung des damaligen Teils verwechselt werden.": Dies geschieht nicht, wenn Sie "{" und "}" vertikal ausrichten (gleiche Spalte), um den Anfang und das Ende zu bilden des Blocks fallen deutlicher auf.
Giorgio
8

Ich würde immer die erste verwenden. Sie möchten, dass klar ist, was Sie mit dieser 1 dort machen. Wenn ich das sehen würde und darüber eine Textwand wäre 1, hätte ich keine Ahnung, was in Bezug auf die Verwendung dieser 1 vor sich geht.

Das '+' neben 1 macht deutlich, dass ich zumindest etwas mit der fraglichen 1 mache, anstatt ohne ersichtlichen Grund "Ich bin alles in deinem Code-Typ ..." zu sagen.

Weltingenieur
quelle
abgeordnet ...........
James
7

Ich bin der Meinung, dass es das Leseverständnis enorm erleichtert, wenn eine Zeile anzeigt, dass die Anweisung in der nächsten Zeile fortgesetzt wird, indem der binäre Operator am Ende steht und die Anweisung somit unvollständig wird. Das fehlende Semikolon reicht mir nicht aus, um das sofort zu verstehen.

Dies mag einfach eine Frage der Gewohnheit sein, aber wenn Sie nicht ausschließlich in Sprachen arbeiten, die das Semikolon erfordern (was ich angesichts der Verbreitung von Shell-Skripten, Makefiles und Sprachen wie Python ziemlich unrealistisch finde), werden Sie diese Gewohnheit wahrscheinlich auch nicht haben.

EDIT: Giorgio macht einen ausgezeichneten Punkt in den Kommentaren: Diese Verwendung spiegelt die übliche Interpunktion sowohl in Mathematik als auch in natürlichen Sprachen wider. Du würdest schreiben

Ich sinke,
deshalb bin ich geschwommen

Du würdest nicht schreiben

Ich sinke
, deshalb bin ich geschwommen

Konrad Rudolph
quelle
3
+1: Ich neige auch dazu, das + am Ende der Zeile als Komma zu lesen, das zwei Elemente in einer Liste von Operanden trennt. Aus diesem Grund ziehe ich es vor, das + am Ende einer Zeile zu setzen, wie ich es mit einem Komma tun würde (ich würde niemals eine Zeile mit einem Komma beginnen).
Giorgio
@Giorgio Dieser Punkt ist so hervorragend, dass ich ihn für meine Antwort gestohlen habe. Ich hoffe, du kannst mir verzeihen.
Konrad Rudolph
Gehen Sie voran: Ich fühle mich geehrt. ;-)
Giorgio
7
Code ist kein Englisch, und ich denke, es ist eine falsche Analogie, englische Syntaxregeln zu verwenden, um Codierungskonventionen zu rechtfertigen. Ich mag den nachgestellten Operatorstil nicht, aber ich gebe zu, dass Konrad einen guten Standpunkt zu Sprachen wie Python hat.
M. Dudley
3
Beim mathematischen Satz steht der Zeilenumbruch immer vor einem Operator, niemals danach. Im prosaischen Beispiel ist der Operator "daher". In der englischen Prosa sind Kommas im Wesentlichen Atemzeichen.
Kevin Cline