Odsazování
Školení, která pořádám
Důležitou součástí elegantního kódu je dodržování štábní kultury – správné používání bílých znaků, tedy především znaků konce řádku a odsazování. V ukázkách kódu na tomto blogu jste si už možná všimli, že nějakou štábní kulturu používám, tak se ji pokusím trochu popsat.
- Všechny bloky kódu uzavírám do složených závorek
{}
a to i v případě, že je tvoří jediný příkaz. Zpřehledňuje to kód a usnadňuje to jeho rozšiřování.
- Vnitřek bloku kódu vždy odsazuji o jednu úroveň a nic jiného naopak neodsazuji.
- Kolem operátorů
=
, +
a podobných dělám mezeru.
- Otevírací složenou závorku píšu na stejný řádek jako konstrukci, ke které se vztahuje. Výjimkou je složená závorka u funkcí, která je až na dalším řádku (ctím doporučení Kernighana a Ritchieho).
- Závorky přisazuji k názvu funkce, od konstrukcí jako
if
, while
a podobných je naopak odděluji mezerou.
- Nemám stanovenou pevnou maximální šířku řádku. Snažím se samozřejmě psát krátké řádky, ale když řádek překročí např. 72 znaků, neznamená to jeho automatické zalomení.
Vášnivých debat o tom, jestli je pro odsazování lepší používat tabulátor nebo několik mezer, se už naštěstí neúčastním. Osobně používám tabulátor, protože ten jediný je schopen zajistit konzistentnost a každý si ho může nastavit na šířku, jaká mu vyhovuje, ale když jsou někomu milejší mezery, tak ať si to užije. Pokud spolupracujete na větším projektu, hlavní je používat to, co už se tam používá (např. v PHP dokumentaci se pro odsazování XML používá jedna mezera a pro odsazování PHP kódu čtyři mezery a vše ostatní se trestá požadavkem na opravu).
<?php
// špatné odsazování může způsobit i bezpečnostní riziko
if ($podminka_ktera_nemuze_byt_splnena) ;
skodlivy_kod();
?>
Tento kód vyvolává na první pohled dojem, že skodlivy_kod
nebude nikdy vykonán, což ale není pravda, protože v závislosti na podmínce se zpracuje pouze prázdný příkaz (středník za if) a skodlivy_kod
bude naopak vykonán vždy. I to je jeden z důvodů, proč se u větších projektů na štábní kulturu někdy až úzkostlivě dbá a patch, který ji nerespektuje, bývá zamítnut.
Podívat se můžete také na PEAR Coding Standards nebo třeba na Linux Kernel Coding Style.
Diskuse
halogan:
Po dlouhém období používání tabů jsem přešel na mezery, protože s tabulátory neudělám tak přehledný kód, např.:
$prom = "ahoj";
$p = "jiné" // samozřejmě tady není monospace
atp.
Tuto "ruční typografii" nemám rád, protože s sebou nese spoustu zbytečné práce a se správným zvýrazňováním jsou přehledné oba zápisy. Jak je dobře vidět, tak se navíc nedá používat s proporcionálním písmem, které se lépe čte a na obrazovku se ho vejde víc.
Jen podotýkám, že když už si na to někdo potrpí a spáleného času mu není líto, dá se zleva odsazovat pomocí tabulátorů a formátování zajistit mezerami.
lukas:
zrovna v pspadu myslim proste tabulator se zkrati podle toho jak je horejsi radek; takze se da udelat i to tvoje zarovnai na rovnitka pomoci tabulatoru
v jinym editoru se to zase zobrazit rozhozene asi muze;)
Morgion:
Kdyz uz jsme u tech pisem, jaky nejradsi pouzivate pismo v editorech?
tark:
Osobne pouzivam v jEditu (WinXP) Lucida Sans, velikost 13, vyhlazene...
Courier New rulez :-)
Ale jinak je to jedno, záleží na osobním vkusu. Jediná nutnost je neproporcionální písmo.
ales:
Kvůli pohodlnému zarovnávání se dá používat jen něco monospaced. V jEditu používám Monospadced 12 plain nevyhlazeně.
Mordae:
Důrazný souhlas, Courier je best. Pak taky ten fuj na terminálu, nevím z hlavy jak se menuje. Ten je taky moc pěknej.
p:
Andale Mono :) pro komentare mensi Lucida Grande, vse Xcode na Mac OS X (umi vic fontu v jednom zdrojovem souboru).
fous:
uplne nejlepsi je programatorsky fontik Deja Vu Sans Mono - je free, cesky a pro vsechny platformy
doporucuji vyzkouset
spaze:
taky jsem se snazil, lec jsem to vzdal driv nez ty :/ => diky.
halogan:
Courier New 9, vyhlazen přímo v linuxu.
tark:
nj, halogan má taky supr antialiasing courieru, nejdřív jsem si myslel, že je to nějaký neproporcionální patkový písmo ;)
ale je to hodně hezký :)
Gioel:
Ja to riesim takto:
<?php
if ($podminka) skodlivy_kod();
// end if..
?>
je to podla mna mensie ako
<?php
if ($podminka) {
skodlivy_kod();
} // end if..
?>
Nejde mi len o prehladnost kodu ale aj dlzku a rychlost zapisu
Michal:
Ani môjmu kolegovi nešlo o prehľadnosť kódu ale o rýchlosť zápisu...čítať to po ňom je pekná otrava.
Mordae:
Tohle je ještě v toleranci. Na zabití je třeba:
if (a())
doThis();
if (b())
doThat();
$e = toSomethingOther();
if($e)
error($e);
Pak to je na tlustou železnou rouru.
Quick:
Jak resite pokud za if je mnoho podminek? Treba i ruzne zanorenych zavarkami?
Jakub Vrána :
Obvykle je píšu za sebe, pokud jich je hodně dlouhých, odděluji je takhle:
<?php
if ($podminka1
&& $podminka2
) {
// kód
}
?>
Spíše se jim ale snažím vyhnout.
Zdeněk Merta:
Já to píšu takto:
<?php
if ($podminka1
&& $podminka2)
{
// kód
}
?>
Jakub Podhorský:
normálně je píšu na jeden řádek...na více řádcích se mi to zdá strašně moc nepřehledný a hlavně nepřirozený
pro přehlednost na jednom řádku používám závorky, který mně ten kód dostatečně zpřehlední
Zdeněk Merta:
Způsob psaní na více řádků většinou bývá podmíněn dalším pravidlům. Já třeba striktně dodržuji šířku řádku na 80 znaků.
V případě, že se podmínka vejde na 1 řádek, tak ji tak samozřejmě napíšu.
Dundee:
if( ( (jedna podminka) &&
(druha podminka) &&
(treti podminka)
) ||
(podminka)
){
blok
}
Jakub Podhorský:
já šířky řádků nedodržuju a horizontální scrollování mně nějak problémy nedělá
je ot prostě o zvyku ale i zvyky se dají měnit ale osobně podmínky mám radši na jednom řádku
Pilda:
Asi budu za blbce, ale vůbec nechápu co má tento kód společného s odsazováním, podle mě se jedná spíš o chybnou syntaxi ne?
<?php
// špatné odsazování může způsobit i bezpečnostní riziko
if ($podminka_ktera_nemuze_byt_splnena) ;
skodlivy_kod();
?>
Jakub Vrána :
Syntaxe je v pořádku, schválně si to zkus spustit. ; znamená prázdný příkaz.
Diskuse je zrušena z důvodu spamu.