Warum empfehlen einige Sprachen die Verwendung von Leerzeichen anstelle von Tabulatoren? [geschlossen]

10

Vielleicht bin ich damit allein, aber nur wenige Dinge nerven mich wie Leute, die Leerzeichen anstelle von Tabulatoren verwenden. Wie ist das Tippen SpaceSpaceSpaceSpaceeinfacher und intuitiver als das Tippen Tab? Sicher, die Tabulatorbreite ist variabel, aber sie zeigt viel mehr den Einrückungsraum als Leerzeichen an. Das Gleiche gilt für den Rückraum. Rücktaste ein- oder viermal?

Warum empfehlen Sprachen wie Python die Verwendung von Leerzeichen über Tabulatoren?

Naftuli Kay
quelle
24
Sie können die meisten Editoren so konfigurieren, dass beim Drücken Leerzeichen anstelle von Tabulatoren eingefügt werden tab. Wenn Sie dies in Ihrem bevorzugten Editor nicht konfigurieren können, benötigen Sie einen besseren Editor.
Adam Lear
Zum einen können viele Editoren so eingerichtet werden, dass beim Drücken der Tabulatortaste 4 bis 8 Leerzeichen eingefügt werden. Es handelt sich also nur um einen Tastendruck, genau wie beim Tabulator.
Echo sagt Reinstate Monica
2
Es beantwortet meine Frage immer noch nicht. Warum Leerzeichen statt Tabulatoren? Natürlich können Sie Ihren Editor so konfigurieren, dass Leerzeichen anstelle von Tabulatoren eingefügt werden, aber Sie können vermutlich auch Tabulatoren mit Leerzeichen einfügen. Die Frage ist, warum Sie dies tun möchten? Welcher mögliche Nutzen ergibt sich?
Naftuli Kay
4
@ Tk Leerzeichen sind eindeutige Tabs können geändert werden
Martin Beckett
3
@TKKocheran, weil Tabs Ihre Ausgabe funky machen, wenn Sie sie versehentlich in eine Zeichenfolge einfügen.
zzzzBov

Antworten:

15

Vor allem Konsistenz.

Gelegentlich kommt auch etwas hinzu, das tatsächlich das Leerzeichen verwendet - wie Python: Sagen Sie mir, was passiert, wenn ich das folgende Codefragment ausführe?

def foo():
    print "a"
    print "b"

Antwort: Sie erhalten einen IndentationError, da diese beiden print-Anweisungen nicht auf derselben Ebene eingerückt sind und daher nicht Teil desselben Codeblocks sind. (Der erste verwendet eine Registerkarte, der zweite alle Leerzeichen)

Dann gibt es die frustrierenden Fälle, in denen der Editor eines Entwicklers Tabulatoren auf 8 Leerzeichen und ein anderer auf 4 Leerzeichen gesetzt hat und jemand aus irgendeinem Grund 5 verwendet ... Es mag auf einer Workstation völlig normal aussehen, aber dann, wenn es eingecheckt ist SVN und jemand anderes aktualisieren, sie werden ein schreckliches, schreckliches Durcheinander sehen.

Das sind also zwei wirklich gute Gründe, immer konsistent zu sein, egal ob Leerzeichen oder Tabulatoren.

Leerzeichen ermöglichen jedoch weitaus mehr Kontrolle über den Einzug als Registerkarten und erfordern keine spezielle Konfiguration in den Editoren, damit dies funktioniert. (Obwohl es einfacher gemacht werden kann - zum Beispiel in vim, verwenden Sie einfach set expandtab, um Leerzeichen einzufügen, wenn Sie die Tabulatortaste drücken.)

BEARBEITEN: Und amüsanterweise scheint die Site meine Tabs in Leerzeichen normalisiert zu haben, damit der Browser sie korrekt anzeigen kann. Klicken Sie auf "Bearbeiten", um das Original anzuzeigen, einschließlich der Registerkarten;)

Izkata
quelle
5
Ihre Probleme mit Registerkarten (insbesondere das schreckliche SVN-Durcheinander) treten nur auf, wenn Sie die Option "Tabulatoren zu Leerzeichen" in Ihrem Editor verwenden. Wenn Sie und Ihr Team damit einverstanden sind, die Option "Tabs to Space" zu deaktivieren, ist eine Registerkarte in jeder Ansicht immer eine Registerkarte. Sie können dann nur auswählen, wie breit sie in Ihrem Editor angezeigt werden soll.
HorusKol
@HorusKol Nein, das schreckliche Durcheinander ist, dass Leerzeichen und Tabulatoren gemischt wurden. Ich glaube, ich habe das nicht deutlich genug gemacht (siehe den einsamen Satz nach der Zeile "schreckliches, schreckliches Durcheinander"). Die Leerzeichen wurden so gestaltet, dass sie gut mit den Registerkarten übereinstimmen, wenn sie auf 4 Leerzeichen äquivalent eingestellt sind. Wenn jedoch jemand anderes sie anzeigt (unabhängig davon, ob Tabulatoren zu Leerzeichen festgelegt sind oder nicht), kommt es zu einem Durcheinander.
Izkata
4
Ich verstehe - nun, Sie müssen eine Richtlinie für Ihr Team festlegen - entweder konsequent Leerzeichen oder Tabulatoren verwenden ... so oder so, Tabulatoren-zu-Leerzeichen sind eine schlechte Idee;)
HorusKol
21
Aus diesem Grund betrachte ich die Idee von Leerzeichen-bedeutungsvollen Sprachen als Designfehler. Dinge, die Sie nicht sehen können, sollten Ihren Code niemals beschädigen.
Paul Nathan
Nur zur Veranschaulichung, ich stimme @PaulNathan
Izkata
11

Dies ist eine gute Diskussion über Einrückungen und Leerzeichen in Python. aus dem Artikel:

[I] t kann eine gute Idee sein, Tabs insgesamt zu vermeiden, da die Semantik von Tabs in der Computerwelt nicht sehr genau definiert ist und sie auf verschiedenen Arten von Systemen und Editoren völlig unterschiedlich angezeigt werden können. Außerdem werden Registerkarten beim Kopieren und Einfügen oder beim Einfügen eines Quellcodes in eine Webseite oder einen anderen Markup-Code häufig zerstört oder falsch konvertiert.

In Bezug auf Ihr Argument zum zweimaligen oder mehrmaligen Drücken der Leertaste oder der Rücktaste, da die meisten Quellcode-Editoren eine konfigurierbare Anzahl von Leerzeichen mit einem einzigen Druck auf die Tabulatortaste einfügen und in ähnlicher Weise die Einrückung aufheben, werden keine Tasten mehr gedrückt, wenn Verwenden von Leerzeichen zum Einrücken.

Für mich selbst bevorzuge ich Leerzeichen, da der Code immer mit der gleichen Einrückung angezeigt wird, unabhängig davon, ob ich ihn in einer IDE oder in einem lessEditor anzeige. dh Räume sind tragbarer.

Mike Partridge
quelle
3
Betreff: "Ob ich es in einer IDE oder weniger oder im Editor ansehe; dh Leerzeichen sind portabler" - dies ist das beste Argument für Leerzeichen, die ich je gehört habe. Ich bin selbst ein "Tabs" -Typ, habe es aber gelegentlich nicht gemocht, Tab-Abstand-Code auf unerwartete Weise gerendert zu sehen.
Aerik
2

In Python steuert die Einrückung den Programmablauf und ist daher von entscheidender Bedeutung.
Wenn Sie mit Registerkarten formatierten Code nehmen und ihn so kopieren, dass die Registerkarten geändert werden oder verloren gehen, wird die Struktur des Codes zerstört. Räume sind immer Räume = viel sicherer.

Wenn Sie sich durch die Abnutzung Ihrer Leertaste Sorgen machen, kann Ihr Editor wahrscheinlich so eingestellt werden, dass Tabulatoren automatisch in Leerzeichen konvertiert werden.

Martin Beckett
quelle
Ich bin mehr besorgt über die verschwendete Zeit, die ich viermal mit dem Eingeben von Leerzeichen oder Rücktasten verbracht habe, als mit einem Tastendruck, um beides zu tun.
Naftuli Kay
Ja, aber Python ist so komisch. Ich bin noch nie auf etwas anderes gestoßen, das sich um Räume kümmert.
Aerik
@TKKocheran Oh, das ist dein echtes Anliegen? Ich weiß nicht, wie sie es gemacht haben, aber vim bei meiner Arbeit ist so eingerichtet, dass die Rücktaste über mehrere Leerzeichen hinweg völlig transparent zum letzten Tabstop zurückkehrt
Izkata
Könnten Sie .vimrcfür mich fallen lassen :)
Naftuli Kay
1
@TKKocheran Gefunden - es ist nur so set softtabstop=4, und sowohl TAB als auch BACKSPACE verwenden 4 Leerzeichen als Tabulator. (Nun, zu jedem Tabstop, die Breite als 4 Leerzeichen behandeln)
Izkata
2

Leerzeichen sollten immer verwendet werden, da Tabulatoren allein für viele Stile nicht flexibel genug sind und das Vermischen von Tabulatoren und Leerzeichen (fast) immer zu einem absoluten Durcheinander führt.

Betrachten Sie als Beispiel für einen Stil, der im Allgemeinen Leerzeichen benötigt , Folgendes:

call_some_function(parameter1,
                   parameter2,
                   parameter3,
                   parameter4,
                   parameter5,
                   parameter6,
                   parameter7);

Wenn Sie nicht bereit sind, alle Ihre Funktionen so umzubenennen, dass sie ein genaues Vielfaches der Registerkartengröße (minus eins in Klammern) sind, reicht dies allein nicht aus.

Beim Mischen von Tabulatoren und Leerzeichen tritt fast sofort ein ernstes Problem auf: Tabulatoren werden nicht auf dieselbe Weise konsistent erweitert. Einige Softwareprogramme behandeln eine Registerkarte als äquivalent zu einer bestimmten Anzahl von Leerzeichen. Andere Software erweitert eine Registerkarte modulo um eine bestimmte Anzahl von Leerzeichen - z. B. beginnt ein Element nach einer Registerkarte immer mit einer Spaltennummer, die ein Vielfaches von (z. B.) 8 ist.

Selbst wenn Sie sicherstellen können, dass keine Leerzeichen mit Ihren Registerkarten gemischt werden, haben Sie dennoch ein Problem: Registerkarten werden auch mit Schriftarten mit variabler Breite schlecht abgespielt. Dieses Problem tritt auf, wenn Sie (zum Beispiel) ausgerichtete nachfolgende Kommentare wünschen:

a.m = 9;   // this is the slope
a.i = 4;   // this is the intensity
a.x = 1;   // this is the x-intercept

So wie sie jetzt stehen, sind alle perfekt aufeinander abgestimmt. Bei einer Schriftart mit variabler Breite wird es jedoch hässlich. Bei Leerzeichen können die Kommentare (häufig) leicht falsch ausgerichtet werden. Bei Registerkarten wird die Fehlausrichtung jedoch häufig recht radikal:

a.m = 9;          // this is the slope
a.i = 4;  // this is the intensity
a.x = 1;          // this is the x-intercept

Plötzlich wurde der kleine Unterschied in der Breite zwischen dem 'i' und dem 'm' oder 'x' in unserer Schriftart mit variabler Breite auf einen ganzen Tabulator vergrößert.

Das Fazit ist, dass fast jede Änderung in der Art und Weise, wie Sie Code mit Registerkarten anzeigen, egal wie trivial sie erscheint, zu einem unlesbaren Durcheinander führen kann und wird.

Um Ihre anderen Fragen zu beantworten: Andere haben bereits darauf hingewiesen, aber ich kann mir nicht vorstellen, dass jemand in einem Programmiereditor (oder vieles andere) tatsächlich die Leertaste verwendet, um die Leerzeichen einzufügen. Ihre Frage spacespacespacespacelautet also : "Tippen " irrelevant, weil das sowieso niemand tut. Ebenso bei Rückständen: Es ist schwer vorstellbar, dass ein Editor BkSpcviermal gedrückt werden muss , um zu einem vorherigen Tabulator zu gelangen. Daher ist die Frage (erneut) irrelevant.

Fazit: Registerkarten sind in Ordnung, wenn Sie (und nur Sie) jemals Ihren Code betrachten, und Sie tun dies immer nur mit einem einzigen Editor, den Sie (überhaupt!) Niemals neu konfigurieren. Diese Bedingungen sind jedoch nahezu unmöglich Erzwingen Sie, dass es nur eine vernünftige Antwort gibt: Verwenden Sie niemals Tabulatoren.

Jerry Sarg
quelle
1
Ich sehe Sie sagen "Proportional-Schriftarten brechen sowohl Leerzeichen als auch Tabulatoren, aber sie brechen Tabulatoren schlechter, verwenden Sie also Leerzeichen". Warum nicht elastische Tabstops verwenden? nickgravgaard.com/elastictabstops
amara
@sparkleshy: Es ist eine nette Idee, macht aber keinen Unterschied zu echtem Code und wird es erst tun, wenn alle (oder zumindest die überwiegende Mehrheit) echte Editoren ihn bereits enthalten.
Jerry Coffin
... Ich weiß: '(- na ja, irgendwie. Sie können immer noch einen Editor verwenden, der durch Leerzeichen unterstützt wird (wie die Tabulatortaste, wenn Sie Leerzeichen verwenden), aber so tut, als wären sie elastische Tabstops. Dadurch werden die Leerzeichen verwaltet einfacher.
Amara
2
Wenn Sie in Schriftarten mit proportionaler Breite programmieren, haben Sie viel mehr Probleme als nur Registerkarten, über die Sie sich Sorgen machen müssen ...
Brian Knoblauch
1
@BrianKnoblauch: Als jemand, der die Schriftart Eurofurence verwendet, muss ich nicht zustimmen. Die einzigen Dinge, die mir jemals Probleme bereiten, sind Räume. Es hat natürlich auch mit meinem Einrückungsstil zu tun, der sich niemals um mehr als eine Registerkarte zwischen den Zeilen unterscheiden soll. Vorausgesetzt, ich bekomme jemals elastische Tabstops, sieht mein Code noch besser aus.
Magus
2

Das große Problem ist die Inkonsistenz der "Tab" -Breite, manchmal werden sie als vier Leerzeichen gerendert, manchmal als acht. In vielen Editoren können Sie sie auf 1 bis 9 Leerzeichen einstellen.

Dies macht einen einfachen WYSWYG-Editor zu einem Was Sie sehen, ist das, was jemand anderes bekommen könnte.

Es ist ein besonderes Problem für Python, aber es ist auch ein Problem in einer der "geschweiften Klammern" -Sprachen, da Einrückungen verwendet werden, um menschlichen Lesern Bedeutung zu vermitteln, und durcheinandergebrachte Registerkarten das Lesen des Codes erschweren.

James Anderson
quelle