Jen mě možná trochu mrzí přístup ke značkovacím jazykům. Lidi, co by si běžně při hádce, jestli dva nebo čtyři znaky, vypíchli oči, se paradoxně při psaní xml nebo html chovají jako totální prasata. Ideálně ať je to všechno na jediném kilometrovém řádku a ani je to netrkne, že je tady asi něco špatně. To upřímně nechápu.
Jinak ten výzkum je v korelaci s tím, co píšou ostatní dříve - je to prostě jen tím, že někdo kdysi navrhnul, že jen mezery (bo v 70-tých letech tiskárny neuměly správně ošetřit tabelátor) a od té doby z toho vzniknul pseudostandard, který bohužel by default mají často i IDE, navíc checkstyle apod. Ve velkých firmách se kvůli ISO quality apod používá něco, co lze snadno prosadit kontrolovat, nic víc v tom není...
Na stranu druhou, někdo chce mít zarovnané i jiné věci než začátky řádků programů. Třeba víceřádkové konstrukce. Není pěkné když se to stane, ale někdy je to nevyhnutelné (member initializer list v C++ se často zalomit prostě musí)
Pak je potřeba buď míchat mezery a tabulátory, což může v budoucnu dělat nepořádek ve formátování v případě že člověk co to upravuje nemá zaplé zvýraznění neviditelných znaků.
Tak tak. Při code review v nástroji který ti ukazuje diffy vedle sebe je opravdu fajn, když je vidět celý řádek bez automatického zalomení nebo horizontálního scrollu. A docílit se toho obecně dá opravdu jen stanovením fixní délky odsazení a dodržováním maximální délky řádku (což je pravidlo které také vede ke zmíněnému zalomení a nutností zarovnat, no…)
Ne. Odsazení je o tom, že má následující řádek mít proti předchozímu nějaké odsazení. Stejné, nižší nebo vyšší. Tam tabelátory fungují výborně.
Víceřádkové konstrukce jsou ale o tom, že chcete, aby daný řádek byl v nějaké konkrétní pozici vůči předchozímu. A tam tabelátor nepomůže, protože po změně jeho vizuální šířky vám to celé uletí jinam.
Příklad:
funkce abc ( a as string, b as string, c as integer ) as string;
Pokud místo mezer použijete tabelátory, tak vám řádky s "b" a "c" budou lítat jak nudle v bandasce. Pod "a" se objeví jen při té jediné správné velikosti.
Ty příklady se zalomením řádku nebo odsazením parametrů funkce ale ukazují jenom to, že je to chybné formátování. Tvrdíte, že se to formátování rozpadne, když změním šířku tabulátoru. OK, to by mohl být problém tabulátorů. Jenže ono se to rozpadne taky v případě, když změním název funkce. A bude to k ničemu taky v případě, kdy ten začátek (název funkce a její atributy) bude dlouhý, takže ta „víceřádková konstrukce“ bude úzká nudle někde u pravého okraje obrazovky.
Pokud chci zalomit řádek, udělám to zase jako odsazení kódu, přece nebudu na dalším řádku hledat, kde vlastně začíná. A pokud chci použít víceřádkovou konstrukci, budu mít zase vše odsazené o jednu nebo dvě úrovně odsazení. Pokud chci mít každý parametr na novém řádku, nebudu přece míchat název funkce s prvním parametrem a návratový typ s posledním. Vždyť bych to pak musel celé „překreslovat“, jakmile bych chtěl přidat parametr na začátek nebo na konec seznamu parametrů.
foo_bar_function(covfefe, bablbam, brekeke, foo = bar, abcd = efgh, xyz = xyz) { print 'Hello World!'; }
funkce abc ( a as string, b as string, c as integer ) as string;
Tohle se dá zarovnávat průběžně při editaci. Není to ono, ale na stranu druhou… Na jednu stranu tady obhájci tabulátorů říkají že jim někdo mezerama nutí svůj pohled na odsazování, ale oni pak tabulátorem rozbíjí zvyklosti někoho jiného při psaní víceřádkových konstrukcí.
Osobně mi vyhovuje jak to dělá Go, i když v něm neprogramuji. Beautifier součástí základních nástrojů, unifikovaný styl kódu pro všechno… A zrovna tohle by se dalo perfektně řešit i s tabulátory, aniž by se projevily jakékoliv nevýhody (krom zmíněného „nevejde se do hezkého porovnání“)
Podle mne i tohle má být dané standardem pro formátování kódu, ne že si to každý vývojář bude dělat podle svého jak je zrovna zvyklý. U parametrů metody je to ještě jednoduché, ale u komplikovanějších builderů, řetězení volání nebo lambd můžete nevhodným odsazováním klidně vyrobit stejný typ pasti, jako třeba jednořádkový if
, který se tváří jako blokový:
if (condition) print 'a'; print 'b'; //ve skutečnosti není součástí „bloku“ if print 'c';
Beautifier součástí základních nástrojů, unifikovaný styl kódu pro všechno…
Souhlasím. I to zalomení dlouhých řádků může být jen otázka zobrazení, IDE (a jiné nástroje zobrazující kód) klidně mohou dlouhé řádky zalamovat automaticky. Všechny používané způsoby (ať odsazování, nebo svislé zarovnání třeba pod závorku) mají jasně daná pravidla, takže by si opět každý mohl zvolit, jakým způsobem chce řádky automaticky zalamovat.
Víceřádkové konstrukce jsou jen další úroveň odsazení.
Kate nemluví o víceřádkových konstrukcích, ale o případech, kde se v náhledu zalomí řádek, protože je moc dlouhý.
Délka řádku je ve znacích, tabulátor je jeden znak
Mícháte dvě různé věci. Délka řádku je v zobrazených znacích, tabulátor je jeden code point, ale od 1 do 8 zobrazených znaků (podle toho, kde je následující zarážka). Obdobně kombinovaná diakritika nezabírá žádné zobrazované znaky, takže pokud projekt povoluje používání ne-ASCII code pointů, na řádek o maximální délce 80 jich klidně můžete nasekat tisíce. Schválně si to někdy zkuste v editoru, který podporuje zobrazení svislé linky na 80 znacích, třeba vim, Emacs nebo Kate.
??? Tohle
MyDialog::MyDialog(QWidget *parent)
: QDialog(parent)
, m_disableUpdates(false)
{
m_ui = new Ui::MyDlg();
....
}
Tady se obejdu bez mezer.
Osobně jsem za tab, protože u mezer se nedá šipkama, backspacem apod. přejít o čtyři znaky vpřed/zpět a občas člověk narazí na to, že zmáčkne v cizím kódu párkrát tab a zjistí, že je něco odsazené o 15 nebo 17 mezer což na první pohled není vidět a nakonec je to často jedno. On mi řekne, že do jeho kódu zanáším taby, které nemá rád z jiného důvodu (např. že jeho oblíbená xyDiff utilita a abcPad je má široké osm znaků).
Aspoň se snažím ctít zásadu, že do cizího kódu nevnáším (vědomě) vlastní formátování.
Tohle, některé další věci jako Jendou uvedené zarovnání obsahu závorky ve funkci… Mně by se osobně také líbily víc taby kvůli možnosti nastavit si šířku odsazení jak chci, bohužel nevýhody které v tom vidím tuhle výhodu přebijí, i když je velká.
Jinak, odsazení 17 mezer snad zvládne jen prase co neodsazuje mezery tabem :D A každý rozumnější textový editor / IDE maže backspacem v odsazení počet mezer jako by to byl tab. Skákat o jednotlivé taby v odsazení… Tam nějak nevidím důvod. Klávesová zkratka pro skok na začátek kódu existuje, zkratka pro skok na začátek řádku taky a pohybovat se ve whitespace oblasti mezi začátkem řádku a kódem… Proč?
Ano, ale pro ten jsem zatím nic neprogramoval. Ale už se mi přihodila kombinace Suního coding style a Volku, který má funkce jako volk_8ic_x2_s32f_multiply_conjugate_32fc, což se do 80 znaků dává fakt těžko.