Odsazování
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.
13.6.2005 14:22:46
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.
13.6.2005 14:30:12
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;)
13.6.2005 17:00:49
Morgion:
Kdyz uz jsme u tech pisem, jaky nejradsi pouzivate pismo v editorech?
13.6.2005 15:11:33
tark:
Osobne pouzivam v jEditu (WinXP) Lucida Sans, velikost 13, vyhlazene...
13.6.2005 15:18:14
Courier New rulez :-)
Ale jinak je to jedno, záleží na osobním vkusu. Jediná nutnost je neproporcionální písmo.
13.6.2005 15:34:33
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ě.
13.6.2005 16:33:43
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.
14.6.2005 13:04:39
p:
Andale Mono :) pro komentare mensi Lucida Grande, vse Xcode na Mac OS X (umi vic fontu v jednom zdrojovem souboru).
14.6.2005 14:52:07
fous:
uplne nejlepsi je programatorsky fontik Deja Vu Sans Mono - je free, cesky a pro vsechny platformy
doporucuji vyzkouset
15.6.2005 10:21:27
taky jsem se snazil, lec jsem to vzdal driv nez ty :/ => diky.
15.6.2005 16:23:33
halogan:
Courier New 9, vyhlazen přímo v linuxu.
13.6.2005 23:45:40
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ý :)
8.7.2005 20:02:00
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
13.6.2005 17:59:23
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.
14.6.2005 10:58:08
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.
14.6.2005 13:03:01
Quick:
Jak resite pokud za if je mnoho podminek? Treba i ruzne zanorenych zavarkami?
15.6.2005 17:32:10
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.
16.6.2005 10:31:48
Zdeněk Merta:
Já to píšu takto:
<?php
if ($podminka1
&& $podminka2)
{
// kód
}
?> 16.6.2005 14:01:48
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í
17.6.2005 00:55:15
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.
17.6.2005 09:22:54
Dundee:
if( ( (jedna podminka) &&
(druha podminka) &&
(treti podminka)
) ||
(podminka)
){
blok
}
7.9.2006 23:57:40
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
17.6.2005 16:20:29
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();
?>
5.3.2007 15:01:08
Syntaxe je v pořádku, schválně si to zkus spustit. ; znamená prázdný příkaz.
5.3.2007 15:08:19