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áš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, on-line

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 11:17:13

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

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

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

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 14:58:31

ikona spaze:

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

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

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

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