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

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.

ikona Jakub Vrána OpenID:

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

ikona dgx:

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

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

ikona 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?

ikona Jakub Vrána OpenID:

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

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();
?>

ikona Jakub Vrána OpenID:

Syntaxe je v pořádku, schválně si to zkus spustit. ; znamená prázdný příkaz.

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 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.