Odsazování

Školení, která pořádám

Dopsal jsem knihu

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áš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.

Jakub Vrána, Dobře míněné rady, 13.6.2005, diskuse: 27 (nové: 0)

Diskuse

Zdeněk Merta:

Ještě bych si dovolil přidat odkaz na štábní kulturu z Javy http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html
Sám používám tento styl, jen mírně upravený.
# 13.6.2005 10:17:13 reagovat

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 13:22:46 reagovat

ikona Jakub Vrána:

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 13:30:12 reagovat

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 16:00:49 reagovat

Morgion:

Kdyz uz jsme u tech pisem, jaky nejradsi pouzivate pismo v editorech?
# 13.6.2005 14:11:33 reagovat

tark:

Osobne pouzivam v jEditu (WinXP) Lucida Sans, velikost 13, vyhlazene...
# 13.6.2005 14:18:14 reagovat

ikona dgx:

Courier New rulez :-)

Ale jinak je to jedno, záleží na osobním vkusu. Jediná nutnost je neproporcionální písmo.
# 13.6.2005 14:34:33 reagovat

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 15:33:43 reagovat

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 12:04:39 reagovat

p:

Andale Mono :) pro komentare mensi Lucida Grande, vse Xcode na Mac OS X (umi vic fontu v jednom zdrojovem souboru).
# 14.6.2005 13:52:07 reagovat

fous:

uplne nejlepsi je programatorsky fontik Deja Vu Sans Mono - je free, cesky a pro vsechny platformy

doporucuji vyzkouset
# 15.6.2005 09:21:27 reagovat

ikona dgx:

vypadá pěkně, ale najít ho Googlem byl porod. Takže dávám odkaz: http://dejavu.sourceforge.net/wiki/index.php/Main_Page
# 15.6.2005 13:58:31 reagovat

ikona spaze:

taky jsem se snazil, lec jsem to vzdal driv nez ty :/ => diky.
# 15.6.2005 15:23:33 reagovat

halogan:

Courier New 9, vyhlazen přímo v linuxu.
# 13.6.2005 22:45:40 reagovat

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 19:02:00 reagovat

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 16:59:23 reagovat

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 09:58:08 reagovat

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 12:03:01 reagovat

Quick:

Jak resite pokud za if je mnoho podminek? Treba i ruzne zanorenych zavarkami?
# 15.6.2005 16:32:10 reagovat

ikona 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.
# 16.6.2005 09:31:48 reagovat

Zdeněk Merta:

Já to píšu takto:

<?php
if ($podminka1
   
&& $podminka2)
{
   
// kód
}
?>
# 16.6.2005 13:01:48 reagovat

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í
# 16.6.2005 23:55:15 reagovat

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 08:22:54 reagovat

Dundee:

if( ( (jedna podminka) &&
      (druha podminka) &&
      (treti podminka)
     ) ||
     (podminka)
   ){
blok
}

# 7.9.2006 22:57:40 reagovat

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 15:20:29 reagovat

ikona 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();
?>
# 5.3.2007 15:01:08 reagovat

ikona Jakub Vrána:

Syntaxe je v pořádku, schválně si to zkus spustit. ; znamená prázdný příkaz.
# 5.3.2007 15:08:19 reagovat

Vložit příspěvek

Používejte diakritiku. Nelze používat HTML značky, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

© 2005-2010 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.