Tento blog je v současné době uzavřen.
Pokračování blogu na bloguje.cz jsem zrušil. Pokud budu někdy pokračovat, bude to spíš tady.
Tenhle způsob zápisu kódu PHP používá, odhaduju, víc než 95 % programátorů. Článek na tom nic nezmění, ale je dobré o věcech přemýšlet. A třeba někdo nezná jedno malé tajemství...
Prohlédněte si příklad s dvěma různými zápisy. Liší se jen vizuálně, oba dva dělají to samé.
if ($x<0) { neco_udelej(); jeste_neco_udelej(); }
if ($x<0) { neco_udelej(); jeste_neco_udelej(); }
Ten první je zápis podle konvence K&R, ten druhý podle konvence BSD/Allman.
Že skoro všichni dnes píšou podle K&R, je moc užitečné, když na projektu spolupracuje víc lidí, ale nemusí to znamenat, že konvence sama je ideální. Je dobré o tom chvilku přemýšlet.
Zápis tímto způsobem šetří řádky, protože otevírací závorka není na samostatném řádku. To bylo velmi důležité, protože když tenhle způsob zápisu vznikl, vešlo se při editaci na obrazovku 20–24 řádků kódu. Programátor tedy viděl víc kódu najednou.
Jsou tři argumenty, proč šetření řádky pro zápis kódu PHP dnes není až tak důležité.
Na obrazovku se vejde víc. To je ovšem poměrně slabé. Editory dnes pojmou klidně 50 a víc řádků na obrazovku, ale pořád je to omezené číslo. Úspora tedy může být vítaná pořád.
Program se skládá z víc menších kousků. I dřív existovaly knihovny užitečných funkcí, které se do kódu vkládaly, ale dnes je díky internetu sdílení kódu nesrovnatelně vyšší. Sdílený kód udělá tu nejotravnější práci a nemusí se ladit. Stáhnete si třeba šablonovací systém, rozdělíte svou prezentaci na aplikační skript, výstupní šablonu a soubor se styly – ve výsledku máte několik souborů zpravidla nejvýše o desítkách řádků. To se pak brutálně šetřit místem opravdu nemusí.
Jsou i jiné způsoby, jak šetřit řádky. Budete se divit, ale tohle (slibované malé tajemství) se v PHP smí:
if ($x<0) {$pole_chyb[]=5; break;}
Skalní vyznavači příkazů na samostatných řádcích se osypou, protože to je pro ně nepřehledné. Ale proč? Je to jeden krátký řádek, to se do zorného pole pohodlně vejde. Když před něj napíšu řádek s komentářem a za ním řádek vynechám, pořád to bude o řádek méně než u K&R. Podle mě se to bezvadně hodí třeba na jednoduchou kontrolu a ošetření chybových stavů.
A když ne složený příkaz, proč ne aspoň jediný příkaz, bez složených závorek:
if ($x<0) $pole_chyb[]=5;
if (!podminka() || !jina_podminka() || !jeste_jina_podminka()) neco_udelej(); jeste_neco_udelej(); }
Musíte projet očima až na konec prvního řádku, abyste zjistili, že chybí otevírací závorka. Kdyby správně měla stát na začátku dalšího řádku, zkontrolujete správné párování závorek mnohem rychleji, prohlížíte totiž jen nahoru–dolů. Trochu sice může pomoct, když máte editor zvýrazňující celé řádky obsahující odpovídající závorky, ale to ty řádky musíte projíždět kursorem. Oči jsou rychlejší.
Nehledě k tomu, že orientace pomocí párování závorek pomáhá rychle se vyznat v komplikovaném zanoření, který kus bloku k čemu patří (typicky které else patří k jakému if). Zastánci konvence K&R můžou namítnout, že se to dá poznat pomocí správného odsazování bloku vpravo, což je jistě pravda. Ale má to zase háček. Když používáte obě závorky na začátcích řádků, stačí vám pro přehlednost menší odsazení, třeba jen dva tři znaky. Pokud je odsazení vpravo jedinou metodou, jak udržet přehled, potřebujete odsadit víc, čtyři nebo i osm znaků. A rázem je pryč výhoda úspory – ušetříte sice řádky, ale ohromně plýtváte sloupci, příkazy vám vpravo dřív vyjedou z obrazovky.
Je dobré používat nějaký stálý styl zápisu programového kódu. A je lepší mít ten styl promyšlený a zdůvodněný, proč je pro vás dobrý. Je-li pro vás vědomě dobrý styl K&R, paráda. Není-li, přemýšlejte o jiném, třeba BSD/Allman.
Související: Odsazování (na PHP triky)
Vložit vlastní komentář – Návrat k článku – RSS komentářů tohoto článku
[1] 6. 9. 2006, 08:30 – VfB (Odkaz)
já jsem sice v PHP lama ale taky šetřím místem kde to jde a jelikož mám nejlepší editor na světě, který je to každý Ví(M), tak stačí stisknout klávesu s procenty a která zázvorka patří ke které, chybějící syntaxi překlepy v názvech tagů a podobné prkotiny (které ale někdy dovedou potrápit) většinou bezpečně signalizuje "špatné" obarvení kód
[2] 6. 9. 2006, 09:08 – JersyWoo (Odkaz)
Také používám K&R závorkovou syntaxi, ale logicky z jiného původu. Když si opticky odstraníš závorky a orientuješ se jen podle odsazení (používám tab o velikosti dvou space) kódu, tak ti obsah fukce(podmínky...dosaďte si další vhodné) odsadí hned pod začátkem a je to logicky přehlednější. V ucelených blocích se mi lépe orientuje, než když jsou rozsekány mezerami(prázdnými řádky).
[3] 6. 9. 2006, 09:28 – PIF (Odkaz)
ten argument "dojít" na konec řádku pro zjištění že chybí { a i ty argumenty kvůli úspoře řádků.... No nevím nevím, ale todle mě má překecat? :))) Prakticky dnes už každý nepíše v notepadu, aby ho takové problémy (a podobné, která závorka kde patří) mohly vyvádět z míry.
Souhlasím s JersyWoo, jakési prázdné řádky používám pro oddělení nějaký větších funkčních bloků.
Prakticky, je to naprosto jedno, jak kdo co použije, jen se snažím říct, že důvody pro BSD konvenci mi nepřijdou nijak zázračné, nebo pomáhající, skutečně je pravdou, že jen natahují kod.
[4] 6. 9. 2006, 09:41 – endlife (Odkaz)
Taky mám v editoru (PSPad) zvýraznění související závorky a je pro mě příjemnější odřádkovat si podmínky - v šesti podmínkách na jednom řádku udělám spíš chybu, než v závorce, kterou mi navíc jako chybějící hned nahlásí PHP... Takže nějak takto (nevyvracím výhody Vašeho způsobu psaní, jen popisuju můj):
if (!podminka()
|| !jina_podminka()
|| !jeste_jina_podminka()) {
neco_udelej();
jeste_neco_udelej();
}
A co se týče ukázky
if ($x<0) $pole_chyb[]=5;
tato je zrovna specifická, ale když už to chci zkrátit, tak bych nepoužil pro mě(!) nepřehledný řádek příkazů, ale spíše ternární operátor a vyšlo by mi místo i na obsah else na jednom řádku:
$pole_chyb[] = ($x < 0) ? 5 : 1;
vydá za (při minimalistickém zápisu)
if ($x<0) $pole_chyb[]=5;
else $pole_chyb[] = 1;
(uvědomuju si, že pokud žádné else mít nechci, tak se toto nedá použít) Tento způsob je pro většinu lidí hodně nepřehledný, ale velmi úsporný a rychle jde poznat, o co běží.
Dříve jsem psal všechno co nejjednodušeji, využíval jsem všech krátkých zápisů, ale poslední dobou píšu všechno složitě ve stylu K&R, přijde mi to přehlednější. Ale třeba mě to zase někdy přejde :)
[5] 6. 9. 2006, 10:09 – Honza Hučín (Odkaz)
Ad [1][3]: Ano, editory se zvýrazněnou syntaxí jsou dobrá pomůcka, pro programátora nepostradatelná.
Nejde ale jenom o kontrolu při psaní. Když čtu po někom (stačí, že po sobě po pár měsících) nějaký složitější kód, potřebuju se rychle zorientovat, který kus k čemu patří (typické je větvení pomocí if-else). Tam mi obarvení nepomůže.
Ad [2]: Dobrý argument, na to jsem nepomyslel. (No ale jestli ti stačí odsazení jen o dva znaky při složitějším větvení, máš fakt dobré oko.)
Ad [4]: Ternární operátor je fajn, ale ten příklad byl právě úmyslně bez else.
[6] 6. 9. 2006, 10:53 – Mordae (Odkaz)
Tohle je zrovinka jedna z mala veci, ve ktere s pany K&R nesouhlasim. Tristit kod na male, ucelena bloky - ANO, psat funkce co nejusporneji atd. ano, ale zavorky pisi na samostatne radky stejne, jako delam mezery kolem operatoru a vetsiny klicovych slov.
Pro porovnani:
if ( false === $result )
{
break;
}
a
if(fals
}
[7] 6. 9. 2006, 11:35 – David Majda (Odkaz)
Související zajímavé čtení, kde se mj. říká, že články jako tento by v důsledku neměly vůbec existovat :)
http://www.artima.com/weblogs/v
[8] 6. 9. 2006, 12:18 – Michal Hantl (Odkaz)
Zdravím, já píšu
if ($this->isRed())
{
$this->makeBlue();
}
Nejdř
To bych asi doporučil i ostatním, napište si v tom pár set řádkový skript (zrovna jsem měl tu možnost) se závorkama na nových řádcích a uvidíte, jestli vám to vyhovuje víc.
Teď vám třeba přijde K&R super a Allman divný, ale na tomhle má podíl to, jak píšete a co jste zvyklí číst.
[9] 6. 9. 2006, 12:51 – HejTi (Odkaz)
Svůj názor jsem napsal sem: http://internet.blog.cz/0609/jak-ne-zapisovat
[10] 6. 9. 2006, 13:07 – dgx (Odkaz)
Pravý programátor nepíše
if ($x<0)
{
$pole_chyb[] = 5;
}
ale
$x<0?$
Jak
[11] 6. 9. 2006, 13:16 – Honza Hučín (Odkaz)
Ad [10]: No nevím, co by ti na to řekl Jakub Vrána :D
Taky už mě něco podobného napadlo, ale takové triky se dělají jen hluboko skryty očím pořádkumilovné veřejnosti, nechtěl jsem s tím tu provokovat (;
[12] 6. 9. 2006, 15:18 – Michal "Tutchek" Tulacek (Odkaz)
Používám hybrid, tedy
if (...)
{
// ...
} else if () {
// ..
} else {
}
Jinak je to stejně vděčný flame, jako například co je lepší nekonečná smyčka, jestli
while (1);
nebo
for (;;);
[13] 6. 9. 2006, 16:23 – Oswald (Odkaz)
$x < 0 && $pole_chyb[] = 5;
[14] 6. 9. 2006, 16:48 – PIF (Odkaz)
nekonečná smyčka :)))) no to tu ještě chybělo :))))
[15] 6. 9. 2006, 18:59 – anode
Osobně sice používám BSD styl, ale podle mě mnohem důležitější je konzistentnost stylu zápisu v rámci celého skriptu. Když mám po někom číst K&R, nedělá mi to problém, horší je, když autor pokaždé odsazuje jinak.
Blokové závorky {} píšu úplně všude, je to rychlejší pro další úpravu.
Chytrý editor při psaní koncové } závorky sám automaticky odsadí, takže v tomto důvod proti K&R pokulhává (něco jiného je to samozřejmě tehdy, když mám v cizím skriptu hledat chybu, ale to už mi najde PHP).
Ad [10]: Asi ještě nejsem pravý programátor. Co naplat, ale nečekal jsem, že to zjistím právě takhle :D
[16] 6. 9. 2006, 20:20 – Mamlas
Vim, ze o tom clanek nebyl, ale mam nutkani to napsat, ja se v pripade PHP nedovedu zbavit zapisu
if (podminka):
prikazy;
elseif (podminka):
prikazy;
else:
prikazy;
endif;
:/
[17] 6. 9. 2006, 20:35 – Petr (Odkaz)
Jestli KR nebo BSD, tak v tom nevidim velký problém, pokud programátor sám pořádně ví, co píše. Pokud to neví, je uplně jedno zda používá KR nebo BSD, stejně se v tom nikdo nevyzná ;)
Já jsem toto popisoval zde:
http://interforum.interval.cz/ShowP
Osobně
if ($admin == true)
echo "jsem admin";
nebo
class mojetrida {
}
function Getjmeno()
apod. je toho hodně, ale podle mého je lepší mít kod ve více řádcích. 80 znaků na řádku je ideální. Prostě tak, aby nebyl potřeba horizontální posuvník. Většina editorů toto dokáže hlídat.
[19] 7. 9. 2006, 11:10 – Honza Hučín (Odkaz)
Díky všem za komentáře. Jsem rád, že se ozvali především ti, co přemýšlí, proč píšou právě tak a ne jinak...
Ad [16]: Mám obavu, že tahle syntaxe bude časem zavržena, takže u skriptu, který není na jedno použití, bych ji asi nedoporučoval. I když se někdy hodí.
Ad [13]: Což je skvělá ilustrace toho, jak PHP v "céčkovém" duchu chápe příkazy (pardon, vlastně výrazy). A škoda, že se o tomhle v knížkách moc nepíše.
[20] 7. 9. 2006, 20:42 – Dundee (Odkaz)
Ad[13]: tak tohle vidím prvně...Holt C jde mimo mě.
Osobně používám celý život KR pro podmínky, funkce,atd. a BSD pro definice tříd.
[21] 8. 9. 2006, 11:08 – Věroš Kaplan (Odkaz)
Domnívám se, že funkce by měly být tak malé/jednoduché, aby se daly se lehce zkontrolovat (případně napsat test). S tím souvisí to, že by měly být co nejkratší, aby se daly přehlédnout najednou. Čím nepřehlednější jazyk, tím by funkce měly být jednodušší a pochopitelnější (a PHP bohužel patří k těm nepřehlednějším jazykům).
Mnohem zajímavější diskuse je nad velikostí odsazování. Odsazení o 2 znaky je sice "nějaké odsazení", ale ještě není pořádně vidět. Ideální jsou IMHO alespoň 4 či lépe 8 znaků.
Některé jazyky (Python) navíc nemají složené závorky a pokud tam přijde "prasátko", které odsazuje pouze o 2 znaky, kód se stane rychle nečitelným.
[22] 8. 9. 2006, 11:40 – JersyWoo (Odkaz)
[21] já ti dám prasátko, grrr. Když máš větší větvení dejme tomu 10 úrovní tak už jsi mimo monitor. Vidíš jenom prázdnej monitor a zdroják máš pomyslně půl metru vedle monitoru napravo, to je perfektně přehledný.
[23] 8. 9. 2006, 13:47 – Honza Hučín (Odkaz)
Ad [21]: Myslím, že jsem o tom v článku něco zmínil. Při orientaci POUZE pomocí odsazení by samozřejmě mělo být větší, 4 znaky jsou asi minimum. Pokud mám závorky, IMHO stačí 2 znaky. Souhlasím s [22], že při větším odsazení to utíká rychle vpravo.
Když jsem se učil C, v jakési české učebnici (respektované např. MFF UK) doporučovali odsazení o dva znaky. Jenže, pokud si pamatuju, používali závorkování podle Allmana.
[24] 13. 9. 2006, 17:03 – Bohumír Bednařík (BoboCop) (Odkaz)
Osobně používám zápis typu:
if (podminka):
necoudelej();
jestenecoudelej();
endif;
Pok
[25] 13. 9. 2006, 17:08 – Michal "Tutchek" Tulacek (Odkaz)
[24] A alespoň jeden editor který zvýrazňuje odpovídající "endif" k "if" znáte?
[26] 14. 9. 2006, 09:36 – Honza Hučín (Odkaz)
Ad [16][24]: Ve Velké knize PHP5 a MySQL jsem se dočetl, že alternativní syntax pomocí endif apod. bude údajně v dalších verzích považovaná za překonanou.
Samozřejmě tahle syntaxe má výhody, pokud je potřeba často přeskakovat z PHP do HTML, dneska se už ale doporučuje aplikaci (PHP) a prezentaci (HTML) důsledně oddělovat.
K tomuto článku není možné vkládat komentáře.
© Honza Hučín 2004–6
Šuplík běží na PIPNI.CZ. Díky!
8. 8. 16:48 | Pepa
7. 8. 21:26 | Honza Hučín
7. 8. 21:02 | Honza
6. 8. 14:29 | Pepa
3. 8. 18:29 | Honza
*1967, absolvent MFF UK v Praze (1991)
statistik, analytik, programátor, učitel, hudebník