Šuplík Honzy Hučína

Skok na navigaci (menu)

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.

Komentovaný článek

Internet a vše kolem
6. 9. 2006

Otevírací závorka, aneb konvence K&R není sama

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.

Důvod pro K&R

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.

Ten důvod dnes ztratil význam

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;

Důvod proti K&R

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.

Závěrem

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ánkuRSS komentářů tohoto článku

Komentáře

[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(false===$result){
break;
}

[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/viewpost.jsp?thread=74230

[8] 6. 9. 2006, 12:18 – Michal Hantl (Odkaz)

Zdravím, já píšu

if ($this->isRed())
{
$this->makeBlue();
}

Nejdřív jsem psal dlouho K&R, pak nám říkal jeden cvičící, že tenhle zápis mu přijde úplně pitomý, tak jsem zkusil psát závorky na další řádek a po relativně krátké době jsem shledal takto napsaný kód čitelnější.

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-php

[10] 6. 9. 2006, 13:07 – dgx (Odkaz)

Pravý programátor nepíše

if ($x<0)
{
    $pole_chyb[] = 5;
}

ale

$x<0?$pole_chyb[]=5:0;

Jak jinak?

[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á ;)

[18] 6. 9. 2006, 22:29 – finc

Já jsem toto popisoval zde:
http://interforum.interval.cz/ShowPost.aspx?PostID=30899

Osobně jsem pro konvenci z javy, kde je toto řešeno asi nejlépe. Každý z nás má to své, ale určité standarty, by se dodžovat měli. Možná mám výhodu v tom, že ty standarty dodržuji už od začátku, takže se neučím šílené věci jako:

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;

Pokud je mi známo, tak je tento způsob zápisu rovněž možný a z hlediska přehlednosti kódu je IMHO nejlepší (ke každému IF vidím jeho ENDIF).

[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!

sber.cermat.cz

RSS Šuplíku

RSS komentářů – souhrnně

U každého článku je samostatný RSS kanál pro komentáře.

Výběr článků

Posledních 10 článků

nebo podle data:

nebo hledání fulltextem:

Archiv všech článků

Poslední komentáře

Zabili mě, parchanti [2]

8. 8. 16:48 | Pepa

Cestou kolem blogu [2]

7. 8. 21:26 | Honza Hučín

Cestou kolem blogu [1]

7. 8. 21:02 | Honza

Vrtulník nad hlavou [3]

6. 8. 14:29 | Pepa

Taková hra na volby [1]

3. 8. 18:29 | Honza

Nejčtenější

Žádné údaje nejsou k dispozici.

O mně

*1967, absolvent MFF UK v Praze (1991)

statistik, analytik, programátor, učitel, hudebník

nyní Ústav pro informace ve vzdělávání

Životopis (RTF)

Napište mi