Was sind die Vor- und Nachteile einer Sprache, bei der Leerzeichen im Vergleich zu {} verwendet werden, um den Umfang anzugeben? [geschlossen]

16

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 Ifund End WhileAussagen, die meisten anderen Sprachen benutzen nur {} für alles. Aber vielleicht ist das ein Thema für eine andere Frage ...

Gordon Gustafson
quelle
2
Ich würde nicht sagen, dass es "viel einfacher zu schneiden und einzufügen" ist. Es ist nur wenig einfacher.
Kugel
1
Solange Sie die Codeblöcke klein und organisiert halten, sollten die Token eigentlich keine Rolle spielen. Übrigens, lieben Sie das "Holy-War" -Tag, lol
Scott,
"Einige Texteditoren zeigen Leerzeichen anders an.": ?? "Derzeit beliebter.": Popularität hängt oft nicht mit der Qualität einer Idee zusammen.
Giorgio
Ich liebe die Whitespace-Syntax und ich habe es geliebt, in CoffeeScript und Haskell zu programmieren (ja, ich weiß, dass es schwierig ist). Ich habe eine Menge in JavaScript und C programmiert und kann einfach nicht zu} zurückkehren. Am besten ist es jedoch, wenn Lisp-s-Ausdrücke durch Box-Divs ersetzt werden
:)

Antworten:

15

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.

Jason Baker
quelle
6
Übrigens: cooking.stackexchange.com
Jon Purdy
Außerdem könnte etwas, das für einige ein Profi ist, für andere ein Nachteil sein.
Larry Coleman
Hervorragender Punkt. Persönlich denke ich, dass sie zusammenarbeiten, und solange klar ist, werde ich mich nicht (viel) beschweren.
Michael K
7
Ich stimme Ihrer Analogie nicht zu. Es gibt ziemlich objektive Gründe zu der Annahme, dass die von Leerzeichen abhängige Syntax die Produktivität der Programmierer beeinträchtigt, selbst bei den Programmierern, die sie lieben. Es ist ein bisschen so, als würde man sagen, dass die Leute den Geschmack von Zyanid einfach nicht mögen - jeder „logisiert“ nur, wenn er sagt, dass es giftig ist. Es ist egal, wie sehr du es liebst, es wird dich immer noch töten.
Timwi
4
PS Das Wort, das Sie tatsächlich suchen, ist rationalisieren . Außerdem neigt jeder zur Rationalisierung, nicht nur Programmierer.
Timwi
10

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 ifoder 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 wurdeifoder Ähnliches, was es sehr schwierig macht, versehentlich zu denken, dass eine Aussage noch unter einem liegt, ifwenn 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.)

Timwi
quelle
8
Python-Einrückung muss nicht repariert werden, da sie nicht beschädigt wird (ohne dass es jemand merkt!). Es ist auch nicht möglich, Purify (ein Programm, das das Erkennen von Speicherlecks unterstützt) für C # zu schreiben. Dies bedeutet jedoch nicht, dass die C ++ - Speicherverwaltung überlegen ist.
dbkk
2
@Dean: Warum denken so viele Leute, dass sie Resharper für alles brauchen? Was Sie beschreiben, ist bereits in Visual Studio ohne Resharper.
Timwi
2
@dbkk: Ihre Einrückung wird unterbrochen, sobald Sie ifirgendwo eine Zeile hinzufügen . Sie müssen dann fortfahren, um den Einzug manuell zu korrigieren.
Timwi
2
Sie haben wahrscheinlich noch nicht in einem Team gearbeitet, in dem Einrückungen faul, inkonsistent usw. waren, und von deren Behebung abgeraten wurde, weil sie Codeunterschiede unmöglich machen.
Kevin
2
@ Kevin: Richtig, habe ich nicht und ehrlich gesagt würde ich nicht wollen. Ich würde darauf bestehen, alles auf einmal zu reparieren, was nur ein unlesbares Diff verursacht, das nur unbedeutende Whitespaces beeinflusst und alle zukünftigen Diffs repariert. Alles andere wäre kontraproduktiv und schädlich für das Projekt.
Timwi
2

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:

if something
    do something
    do somethingelse

    cleanup
else
    do the other thing

Während ich mich im Token-Land befinde, hasse ich es, wenn Leute kopieren und einfügen und den Einzug nicht aufräumen ,

if something
{
I have been too lazy
      {
            to clean up
            }
what I pasted
}

oder verwenden Sie keine separate Zeile für das Token .

if something {
    I find this confusing
}
else {
especially when combined with the previous 
do something
}

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.

Dominique McDonnell
quelle
2

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 lambdas in Scheme (meistens, um an mapoder applyan genau einer Stelle zu füttern , daher wäre es nicht sinnvoll, sie separat zu deklarieren).

Inaimathi
quelle
Eine Lektüre wert: Jeder rückt die ganze Zeit in allen Sprachen
richtig ein
In Python werden mehrzeilige Ausdrücke unterstützt - setzen Sie einfach \ an das Ende einer Zeile.
dbkk
7
Um fair zu sein, das Fehlen von mehrzeiligen Lambdas ist eine Einschränkung von Python, nicht von Leerzeichen im Allgemeinen. Wenn Sie in meiner durch Leerzeichen getrennten Sprache ein Lambda einführen und ein eingerückter Block folgt, wird der Block als Lambda-Körper verwendet.
Hinweis für sich selbst - denken Sie an einen Namen
@ Hinweis - Ok, ja, fair. Python ist nur die einzige durch Leerzeichen begrenzte Sprache, mit der ich Erfahrung habe. @dbkk Sie sagen also, das 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.
Inaimathi
Haskell und CoffeeScript verwenden Leerzeichen, haben jedoch keine einzeilige Lambda-Beschränkung.
aoeu256,
2

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.

IMHO "{{{{{" is more reliable than "     ".
Andy Canfield
quelle
9
Wenn Sie mehrseitige bedingte Ausdrücke verwenden, treten andere Probleme auf. Tu es einfach nicht. Tatsächlich wird der Code selbst bei geschweiften Klammern zu einem unlesbaren Durcheinander. Dies ist ein weiterer Vorteil von Leerraum-Einrückungen: Sie verhindern, dass Sie solch schrecklichen Code schreiben.
Konrad Rudolph
1
Im Ernst, eine bedingte mehrere Seiten lang?
Winston Ewert
2

{} 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.

user470365
quelle
1
Sie machen einen guten Punkt über Redundanz, denke ich. Ich habe eine Weile über Parser-Recovery für Compiler nachgedacht (nach Clangs sehr interessanten Versuchen, Fix-Its für den Code herauszugeben), und was hier wirklich hilft, ist, dass es Redundanz gibt. Daher denke ich, dass keine Redundanz, obwohl sie in einer perfekten Welt großartig ist, für die Programmierung in der realen Welt schädlich ist. Wenn normalerweise redundante Informationsquellen nicht übereinstimmen, kann es sein, dass ein Tippfehler gemacht wurde. Ohne Redundanz bleibt dieser potenzielle Fehler unentdeckt! Davon abgesehen bevorzuge ich keine geschweiften Klammern;)
Matthieu M.
"Noise" war das Wort, das Erik Meijer in seinen Haskell-Videos verwendete.
user16764
Was passiert, wenn Sie einen Block löschen und vergessen, das} oder das {aus Versehen zu löschen, wenn Sie das Gegenteil tun? Redundanz geht gegen DRY IMO.
aoeu256,
2

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-elifKetten 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):

if condition:
    statement
    other_statement()
end

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.

Petruza
quelle
Ich mag diese Syntax, weil sie einen guten Kompromiss darstellt und Klammern vermeidet. Aber es ist teuer für einzeilige Anweisungen, bei denen wir zB in C die geschweiften Klammern komplett weglassen können :(
Jo So
Anstelle von verschachteltem if ... elif können Sie versuchen, Wörterbücher zu verwenden, und / oder weiterhin verschachtelte Funktionen zurückzugeben ...
aoeu256
@aoeu256 total nicht der Punkt der Frage und meine Antwort auch nicht.
Petruza