Dlaczego niektóre języki zalecają używanie spacji zamiast tabulatorów? [Zamknięte]

10

Może jestem w tym sam, ale kilka rzeczy mnie denerwuje, jak ludzie wcinający zamiast spacji tabulatory. W jaki sposób pisanie jest SpaceSpaceSpaceSpacełatwiejsze i bardziej intuicyjne niż pisanie Tab? Jasne, szerokość tabulacji jest zmienna, ale znacznie bardziej wskazuje na wcięcie niż spacje. To samo dotyczy cofania; Backspace raz czy cztery razy?

Dlaczego języki takie jak Python zalecają używanie spacji zamiast tabulatorów?

Naftuli Kay
źródło
24
Możesz skonfigurować większość edytorów, aby po naciśnięciu wstawiały spacje zamiast tabulatorów tab. Jeśli nie możesz tego skonfigurować w swoim ulubionym edytorze, potrzebujesz lepszego edytora.
Adam Lear
jedną rzeczą jest to, że wiele edytorów można skonfigurować tak, aby wstawiały 4-8 spacji po naciśnięciu klawisza Tab, więc jest to tylko jedno naciśnięcie klawisza, podobnie jak tabulator.
Echo mówi Przywróć Monikę
2
Nadal nie odpowiada na moje pytanie. Dlaczego spacje zamiast tabulatorów? Oczywiście możesz skonfigurować edytor, aby wstawiał spacje zamiast tabulatorów, ale prawdopodobnie możesz także wstawiać tabulatory ze spacjami. Pytanie brzmi: dlaczego chcesz to zrobić? Jaka jest możliwa korzyść?
Naftuli Kay
4
@Tk Spacje to jednoznaczne zakładki, które można zmieniać
Martin Beckett
3
@ TKKocheran, ponieważ tabulatory robią fajne rzeczy na wyjściu, gdy przypadkowo wstawisz je do łańcucha.
zzzzBov

Odpowiedzi:

15

Konsekwencja przede wszystkim.

Ponadto czasami pojawia się coś, co faktycznie używa białych znaków - jak Python: Powiedz mi, co się stanie, jeśli uruchomię następujący fragment kodu?

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

Odpowiedź: Otrzymasz błąd IndentationError, ponieważ te dwie instrukcje drukowania nie są wcięte na tym samym poziomie - a więc nie są częścią tego samego bloku kodu. (Pierwszy używa tabulatora, drugi wszystkich spacji)

Są też frustrujące przypadki, gdy jeden edytor programisty ma tabulatory ustawione na 8 spacji, a inny ustawia je na 4, a ktoś używa 5 z jakiegoś dziwnego powodu ... Może wyglądać zupełnie normalnie na jednej stacji roboczej, ale wtedy, gdy jest zalogowany do SVN i ktoś inny aktualizują, zobaczą okropny, okropny bałagan.

Są to dwa naprawdę dobre powody, aby zawsze być spójnym, niezależnie od tego, czy są to spacje, czy tabulatory.

Jednak spacje pozwalają na znacznie większą kontrolę nad wcięciem niż tabulatory i nie wymagają żadnej specjalnej konfiguracji w edytorach, aby działała. (Chociaż można to ułatwić - na przykład w vimie, wystarczy set expandtabwstawić spacje za każdym razem, gdy naciśniesz klawisz Tab)

EDYCJA: I dość zabawne, witryna wydaje się znormalizować moje zakładki do spacji, aby przeglądarka mogła poprawnie wyświetlać. Kliknij „edytuj”, aby wyświetlić oryginał z dołączonymi kartami;)

Izkata
źródło
5
Twoje problemy z kartami (szczególnie okropny bałagan SVN) pojawiają się tylko wtedy, gdy używasz opcji tabulacji do spacji w edytorze. Jeśli ty i twój zespół zgodzicie się wyłączyć opcję tabulacji do spacji, tabulator zawsze będzie tabulatorem w dowolnym widoku: to tylko wybór, jak szeroki ma być wyświetlany w edytorze.
HorusKol
@HorusKol Nie, ten okropny bałagan jest spowodowany mieszaniem spacji i tabulatorów. Chyba nie uczyniłem tego wystarczająco oczywistym (patrz samotne zdanie po wierszu „okropny, okropny bałagan”). Tak więc spacje zostały tak dobrane, aby ładnie wyrównywały się z tabulatorami, gdy są ustawione na ekwiwalent 4 spacji, ale kiedy ktoś inny je wyświetli (niezależnie od tego, czy ustawione są tabulatory na spacje), robi się bałagan.
Izkata
4
Rozumiem - cóż, musisz ustalić wytyczne dla swojego zespołu - albo konsekwentnie używaj spacji LUB tabulatorów ... w każdym razie, tabulacje do spacji to zły pomysł na cały;)
HorusKol
21
Dlatego uważam pomysł języków znaczących za spacje za wadę projektową. Rzeczy, których nie widzisz, nigdy nie powinny łamać twojego kodu.
Paul Nathan
Dla przypomnienia, zgadzam się z @PaulNathan
Izkata
11

To dobra dyskusja na temat wcięć i białych znaków w Pythonie; z artykułu:

[I] t może być dobrym pomysłem, aby całkowicie unikać kart, ponieważ semantyka kart nie jest bardzo dobrze zdefiniowana w świecie komputerów i mogą być wyświetlane zupełnie inaczej w różnych typach systemów i edytorów. Ponadto karty często ulegają zniszczeniu lub nieprawidłowej konwersji podczas operacji kopiowania i wklejania lub gdy fragment kodu źródłowego jest wstawiany do strony internetowej lub innego rodzaju kodu znaczników.

Co do argumentu dotyczącego naciskania klawisza spacji lub klawisza Backspace 2 lub więcej razy, ponieważ większość edytorów kodu źródłowego wstawi konfigurowalną liczbę spacji za jednym naciśnięciem klawisza Tab i podobnie bez wcięcia, nie ma więcej klawiszy naciskanych, gdy za pomocą spacji do wcięcia.

Dla siebie wolę spacje, ponieważ kod jest zawsze wyświetlany z taką samą ilością wcięć, niezależnie od tego, czy przeglądam go w IDE less, czy Notatniku; tzn. spacje są bardziej przenośne.

Mike Partridge
źródło
3
re: „czy oglądam to w IDE, czy mniej, czy Notatniku, tj. spacje są bardziej przenośne” - to najlepszy argument na spacje, jakie kiedykolwiek słyszałem. Sam jestem facetem z kartami, ale czasami nie podobało mi się wyświetlanie kodu z odstępami między kartami renderowanego w nieoczekiwany sposób.
Aerik
2

W Pythonie wcięcia kontrolują przebieg programu i dlatego są niezbędne.
Jeśli weźmiesz kod sformatowany za pomocą kart i skopiujesz go, aby karty zostały zmienione lub utracone, struktura kodu zostanie zniszczona. Spacje to zawsze spacje = znacznie bezpieczniejsze.

Jeśli martwi Cię zużycie paska spacji, edytor można prawdopodobnie ustawić tak, aby automatycznie konwertował tabulacje na spacje.

Martin Beckett
źródło
Bardziej martwi mnie marnowanie czasu na pisanie na klawiaturze lub cofanie cztery razy w porównaniu do jednego naciśnięcia klawisza, aby zrobić jedno i drugie.
Naftuli Kay
Tak, ale Python jest taki dziwny. Nigdy nie spotkałem niczego innego, co obchodziłoby kosmos.
Aerik 22.11.11
@TKKocheran Oh, to twoja prawdziwa troska? Nie wiem, jak to zrobili, ale vim w mojej pracy jest skonfigurowany tak, że backspace wraca do ostatniego tabstopu, na wielu
spacjach
Czy możesz .vimrcdla mnie
rzucić
1
@ TKKocheran Znalazłem - to jest po prostu set softtabstop=4, a zarówno TAB, jak i BACKSPACE użyją 4 spacji jako tabulacji. (Cóż, do każdego tabstopu, traktując szerokość jako 4 spacje)
Izkata
2

Zawsze należy używać spacji, ponieważ same tabulatory nie są wystarczająco elastyczne dla wielu stylów, a łączenie tabulatorów i spacji (prawie) zawsze powoduje absolutny bałagan.

Na przykład jednego stylu, który zwykle wymaga spacji, rozważ coś takiego:

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

O ile nie chcesz zmienić nazwy wszystkich swoich funkcji, aby były dokładną wielokrotnością rozmiaru tabulacji (minus jedna w nawiasie), same karty po prostu tego nie zrobią.

Jeśli chodzi o mieszanie tabulatorów i spacji, prawie natychmiast natrafisz na poważny problem: tabulatory nie są konsekwentnie rozwijane w ten sam sposób. Niektóre oprogramowanie traktuje kartę jako odpowiednik określonej liczby spacji. Inne oprogramowanie rozszerzy tabulację o określoną liczbę spacji - np. Pozycja po tabulacji zawsze zaczyna się od numeru kolumny, który jest wielokrotnością (powiedzmy) 8.

Nawet jeśli możesz się upewnić, że spacje nie zmieszają się z kartami, nadal masz problem: tabulatory również źle działają z czcionkami o zmiennej szerokości. Ten problem pojawia się, gdy (na przykład) chcesz dopasować końcowe komentarze:

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

W tej chwili wszystkie są idealnie ustawione. Jednak oglądane czcionką o zmiennej szerokości rzeczy stają się brzydkie. W przypadku spacji komentarze mogą (często będą) być nieco źle dopasowane. Jednak w przypadku kart przesunięcie często staje się dość radykalne:

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

Nagle niewielka różnica szerokości między „i” a „m” lub „x” w naszej czcionce o zmiennej szerokości została powiększona do całego tabulatora.

Najważniejsze jest to, że prawie każda zmiana w sposobie wyświetlania kodu za pomocą kart, bez względu na to, jak pozornie trywialna, może i zwykle spowoduje nieczytelny bałagan.

Aby odpowiedzieć na inne pytania: inni już to zauważyli, ale nie wyobrażam sobie, aby ktokolwiek w edytorze programowym (lub wiele innych rzeczy) faktycznie używał spacji do wstawiania spacji, więc twoje pytanie dotyczące: „pisania spacespacespacespace” nieistotne, ponieważ i tak nikt tego nie robi. Podobnie z odstępami wstecznymi: trudno jest wyobrazić sobie edytor, który wymagałby BkSpcczterokrotnego naciśnięcia, aby przejść do poprzedniego tabulatora, więc (ponownie) pytanie nie ma znaczenia.

Podsumowując: zakładki są w porządku, jeśli ty (i tylko ty) kiedykolwiek spojrzysz na swój kod, i robisz to tylko za pomocą jednego edytora, którego nigdy nie konfigurujesz (wcale!) Te warunki są jednak tak blisko, że niemożliwe egzekwuj, że jest tylko jedna rozsądna odpowiedź: nigdy nie używaj tabulatorów.

Jerry Coffin
źródło
1
Widzę, że mówisz „proporcjonalne czcionki łamią zarówno spacje, jak i tabulatory, ale gorsze łamią tabulatory, więc używaj spacji”. Dlaczego nie skorzystać z elastycznych tabstopsów? nickgravgaard.com/elastictabstops
amara
@sparkleshy: To fajny pomysł, ale nie ma znaczenia dla prawdziwego kodu i nie będzie dostępny, dopóki wszyscy (lub przynajmniej zdecydowana większość) prawdziwych edytorów już go nie uwzględni.
Jerry Coffin
... Wiem: '(- no cóż, trochę. Nadal możesz używać edytora, który jest wspierany spacjami (podobnie jak klawisz tabulacji, jeśli używasz spacji), ale udaje, że są elastycznymi tabulatorami; to sprawia, że ​​zarządzanie spacjami łatwiej
amara
2
Jeśli programujesz czcionki proporcjonalne, to masz o wiele więcej problemów niż tylko tabulatory, o które musisz się martwić ...
Brian Knoblauch,
1
@BrianKnoblauch: Jako ktoś, kto używa czcionki eurofurence, muszę się nie zgodzić. Jedynymi rzeczami, które sprawiają mi problemy, są przestrzenie. Ma to również oczywiście związek z moim stylem wcięcia, który nigdy nie powinien różnić się więcej niż jedną tabulacją między wierszami. Zakładając, że kiedykolwiek dostanę elastyczne tabstopy, mój kod będzie wyglądał jeszcze lepiej.
Mag
2

Dużym problemem jest niespójność szerokości „tab”, czasami są one renderowane jako cztery spacje, a czasem osiem. W wielu edytorach możesz ustawić, aby zawierały od 1 do 9 spacji.

Tak więc zmienia to prosty edytor WYSWYG w To, co widzisz, jest tym, co MOGĄ uzyskać inni.

Jest to szczególny problem dla Pythona, ale jest także problemem w każdym z języków „nawiasów klamrowych”, ponieważ wcięcia są używane do przekazywania znaczenia czytelnikom, a pomieszane karty utrudniają odczytanie kodu.

James Anderson
źródło