Tabulátory majú svoje nesporné výhody, okrem toho čo ste spomenuli Vy, tak napríklad aj to že zaberajú na disku menej miesta. Použitie tabulátorov som v minulosti považoval za najlepšie možné riešenie. Ale postupne som zisťoval že to nie je až také ružové...
V praxi sa naráža na niekoľko dôvodov:
- Veľa developerov - s roznymi návykmi. Coding guidelines nebývajú 100% jednoznačné, code review tiež nebýva pravidlom, a vďaka stupňom voľnosti sa štýl developerov sa mierne odlišuje
- Nedostatočne dobré nástroje na automatické formátovanie (súvisí aj s nejednoznačnosťou v predchádzajúcej otázke) - kto sa niekedy snažil nastaviť clang-format podľa toho aby ho prispôsobil svojmu štýlu tak mi asi dá za pravdu.
- Rôzne editory - neraz niekto tesne pred comitom ešte rýchlo niečo zmení v notepade, ale omylom dá medzery namiesto tabulátorov (napr. z dôvodu copy-paste zo stackoverflow :-) ), neskontroluje si diff v dobrom nastroji, tak další developer, ktorý uvidí jeho kód bude nadávať.
Nepoznám ani jedného developera, ktorý by sa niekoľkokrát v živote nestretol s problémom že otvorili zdroják v nejakom editore a tam bolo rozbité z dovodu kombinácie medzier a tabulátorov.
Prakticky si viem predstaviť že by mohli ľudia spolupracovať tak že by povinne museli spustiť clang-format (alebo niečo podobné) pred commitom a pred mergom by sa to ešte automatizovane skontrolovalo. Na to je potrebné mať jednoznačné pravidlá ohľadom tabulátorov a medzier a to aj v komentároch...
Príklady, ktoré v prípade použitia tabulátorov budú rozbité:
funkcia (param1,
param2,
...,
paramN)
/** * Toto je binarny strom * (X) * / \ * (Y) (Z) */
Myslím si že najvačší problém je práve kombinácia medzier a tabulátorov.
- Tabulátory sa dajú jednoducho zakázať. medzery nie (alebo len veľmi ťažko, napr. že zakážem dve medzery za sebou čo ma bude limitovať napr. pri komentároch)...
- Nástroje na automatické formátovanie majú svoje limity.
Já se při použití tab/space řídím jednoduchým pravidlem: Když chci odsadit dám tab, když posunout dám mezeru. Takže
ten prvni priklad ([--] - tab, _ - mezera)
[--]function(param,
[--]_________param2,
[--]_________paramN)
[--]{
[--][--]...
[--]}
[--]/** [--]_*_Toto je binarny strom [--]_*_____(X) [--]_*____/___\ [--]_*___(Y)__(Z) [--]_*/
Není to tak složité aby to programátor (který by měl mít trochu logické myšlení) nezvládl.