Es scheint einen Konflikt darüber zu geben, ob es besser ist, Leerzeichen oder Token wie eckige Klammern zu verwenden, um den Umfang anzuzeigen. Ich habe viele Lob Pythons Lösung für das inkonsistente Einrückungsproblem gesehen, aber viele sind anderer Meinung:
Jede Sprache, die Leerzeichen als Token enthält, muss sterben.
später auf die gleiche Antwort gepostet:
Ich war sozusagen Anti-Whitespace-as-Token, bis ich es tatsächlich versuchte. Es hat wahrscheinlich geholfen, dass mein persönliches Weißraum-Layout ziemlich genau dem entspricht, was jeder in Python-Land verwendet. Vielleicht bin ich ein bisschen minimalistisch, aber wenn Sie trotzdem einrücken wollen, warum sollten Sie sich dann mit den {} s beschäftigen?
Ich sehe einige klare Argumente für jede Seite:
mit Leerzeichen:
- Reduziert inkonsistente Einrückungen im Code
- Löscht den Bildschirm, indem sichtbare Token durch Leerzeichen ersetzt werden, um denselben Zweck zu erfüllen
mit Token:
- viel einfacher, Code auf verschiedenen Ebenen auszuschneiden und einzufügen (Sie müssen den Einzug nicht korrigieren)
- konsistenter. Einige Texteditoren zeigen Leerzeichen anders an.
- derzeit beliebter.
Gibt es Punkte, die ich verpasst habe? Was bevorzugen Sie? Irgendwelche Worte der Weisheit, nachdem Sie lange mit dem einen oder anderen gearbeitet haben?
PS. Ich hasse es, wenn Sprachen nicht für jede Kontrollstruktur das gleiche Token verwenden. VB ist wirklich nervig mit seinen End If
und End While
Aussagen, die meisten anderen Sprachen benutzen nur {} für alles. Aber vielleicht ist das ein Thema für eine andere Frage ...
quelle
Antworten:
Ich denke, viele von uns Programmierern (ich selbst eingeschlossen) neigen dazu, jede Entscheidung zu "logisieren". Das ist in Ordnung, aber nicht jede Frage hat eine logische Antwort. Ich bezweifle zum Beispiel, dass Köche Fragen zu chefoverflow stellen (falls es so etwas gibt), in denen sie nach den Vor- und Nachteilen von Apfelkuchen und Kirschkuchen fragen. Es ist eine Frage, die du lieber magst.
Vor diesem Hintergrund denke ich, dass die einfachste Antwort darin besteht, "Manche mögen Klammern, manche mögen Leerzeichen" zu sagen und es dabei zu belassen.
quelle
Ich denke, jeder, der behauptet, dass Whitespace "dazu beiträgt, inkonsistente Einrückungen im Code zu reduzieren", hat Visual Studio noch nie verwendet. Mit einem einzigen Befehl (ich glaube, die Standardverknüpfung ist Strg + K, D) ist die gesamte Einrückung augenblicklich konsistent¹. Darüber hinaus wird beim Einfügen von Code die Einrückung sofort korrigiert, ohne dass etwas unternommen werden muss. Dies gilt auch, wenn Sie neuen Code schreiben oder etwas in einen
if
oder einen anderen Block einschließen (die Neuformatierung erfolgt während der}
Eingabe von). Wenn Sie nach einer abgeschlossenen Anweisung die Eingabetaste drücken, befindet sich der Cursor außerdem immer auf der richtigen Einzugsebene für die nächste Anweisung, auch wenn die vorherige Anweisung aufgrund eines Einzugs weiter eingerückt wurdeif
oder Ähnliches, was es sehr schwierig macht, versehentlich zu denken, dass eine Aussage noch unter einem liegt,if
wenn es nicht so ist.Der Punkt, den ich versuche, ist nicht, dass Visual Studio großartig ist. Der Punkt, den ich anstrebe, ist, dass die IDE das Beheben von Einrückungen (und andere Formatierungsprobleme) automatisieren kann, aber nur, wenn die Bedeutung des Programms nicht von seiner Formatierung abhängt. Dies gibt dem Programmierer eine größere Möglichkeit, sich auf die eigentliche Programmieraufgabe zu konzentrieren. Eine Syntax wie die von Python ist kontraproduktiv: Es ist nicht möglich, eine IDE zu schreiben, die den Einzug von Python-Code „korrigiert“, da der Einzug selbst einen Teil der Semantik festlegt.
¹ (Ich weiß, dass es einen Sonderfall gibt, den VS nicht formatieren möchte, nämlich Array-Literale, die sich über mehrere Zeilen erstrecken, aber das ist nebensächlich.)
quelle
if
irgendwo eine Zeile hinzufügen . Sie müssen dann fortfahren, um den Einzug manuell zu korrigieren.Persönlich finde ich, dass ich die leere Zeile, die durch ein Token in der eigenen Zeile eingeleitet wird, benötigen muss, um zu erkennen, dass der Code in einem anderen Bereich liegt.
Ich hasse es, wenn Leute in Python gehen:
Während ich mich im Token-Land befinde, hasse ich es, wenn Leute kopieren und einfügen und den Einzug nicht aufräumen ,
oder verwenden Sie keine separate Zeile für das Token .
Ich kann alle drei lesen, aber sie sind nicht so, wie ich es erwartet habe, und ich muss mich anstrengen, um sie zu analysieren, und wie Joel sagt, wenn die Dinge nicht so funktionieren, wie Sie es erwarten, werden Sie frustriert.
quelle
Pro: Soweit ich weiß, gibt es in der Python-Welt keine heiligen Kriege um Einrückungen / geschweifte Klammern. Diese Entscheidung im Namen der Entwickler zu treffen, hat wahrscheinlich einige Schmerzen erspart.
Con: Anonyme Funktionen sind auf eine Zeile beschränkt. Klingt in Ordnung, aber ich schreibe häufig mehrzeilige
lambda
s in Scheme (meistens, um anmap
oderapply
an genau einer Stelle zu füttern , daher wäre es nicht sinnvoll, sie separat zu deklarieren).quelle
lambda n: a = n \\na.sort() \\na[0:3]
würde keinen Syntaxfehler zurückgeben? Mit dem Trick "\" können Sie Ihr einzeiliges Lambda auf mehrere Zeilen verteilen, aber Sie erhalten immer noch nicht mehr als eine tatsächliche Zeile.Das Problem bei einer Whitespace-Sprache waren mehrseitige bedingte Ausdrücke. Das Hinzufügen einer Zeile in der Mitte von Seite zwei und das Verlassen um ein Leerzeichen in der Mitte aller Unordnung kann die Logik Ihres Codes drastisch verändern. Und selbst wenn jemandes Code "korrekt" ist, macht der Versuch, ihn zu lesen, ein schreckliches Ratespiel. Für welches "wenn" ist das "sonst"? Ich kann Klammern viel einfacher zählen als unsichtbare Leerzeichen. Und die Posting-Maschinerie auf dieser Site zerschmettert sie immer wieder in einem einzigen Bereich.
quelle
{} fügt Redundanz hinzu. Zu viel Redundanz ist schlecht, zu wenig ist schlecht. Und manuelles Eingeben ist schlecht, insb. wenn es schwer ist, es zu benutzen.
In Zeiten von schlechter / keiner IDE könnte der Whitespace-Stil etwas besser sein. Aber mit der leistungsstarken IDE sind Zahnspangen besser.
quelle
Ich denke nicht, dass es wirklich ein Vers ist .
Pythone-Entwickler kritisieren Klammern-Programmierer oft so, als würden sie leicht die Einrückung verletzen, weil sie können.
Tatsächlich habe ich immer 100% konsistente Einrückungen verwendet, bevor ich etwas über Python und das Scoping von Einrückungen erfahren habe.
Tatsache ist, dass geschweifte Klammern auch eine korrekte Einrückung im Compiler bewirken könnten und wir das Beste aus beiden Welten hätten. Sehen? Nein gegen überhaupt.
Pythonisten würden argumentieren, dass geschweifte Klammern nutzlos sind, wenn Einrückungen Teil der Syntax sind, nicht jedoch geschweifte Klammern, die die Lesbarkeit verbessern. Ich habe versucht, Python zu programmieren und es ist eine sehr interessante Sprache für mich, aber haben Sie versucht,
if-elif
Ketten mit mehr als 2 oder 3 Einrückungsstufen zu haben? sie sehen nicht mehr so ordentlich aus.PS: Ich habe geschweifte Klammern geschrieben , meine aber allgemein Trennzeichen. Die öffnende Klammer kann als überflüssig angesehen werden, aber eine Sprache könnte so aussehen (ich bin mir sicher, dass es genau solche Sprachen gibt, aber ich kenne sie nicht gut):
PS2: 2019, 4 Jahre nach dieser Antwort. Ich habe Python gelernt und mich total an seine semantische Einrückung gewöhnt und finde es überhaupt nicht schwierig zu lesen. Insbesondere mit Hilfe moderner IDEs, die vertikale Balken zeichnen, um Einrückungsblöcke leichter identifizieren zu können.
quelle