Styl zápisu programu (v angličtině code style) je soubor norem nebo na pravidel, která se používají při psaní zdrojového kódu počítačového programu. Pravidla programovacích stylů umožňují programátorům snadnější orientaci a pochopení zdrojového kódu a zároveň pomáhají vyhnout se formálním chybám při jeho tvorbě. Tato pravidla také zlepšují přenositelnost programu z osoby na osobu resp. z programátora na programátora.
Základní pravidla byla poprvé sepsána v publikaci „The Elements of Programming Style“, která byla vydána v 70. letech 20. století. Ilustrace a příklady byly čerpány z programovacího jazyka Fortran.
Programovací styl, použitý v jednotlivých programech, může být odvozen z obecných zásad, společností nebo jiných organizací, stejně tak jako z vlastního stylu autora kódu. Programovací styl je často navržen pro specifický programovací jazyk nebo jazykovou rodinu. Styly, používané pro rodinu jazyka C nemusí být vhodné pro použití pro jazyky typu BASIC atp. Přesto mohou být některá pravidla aplikována obecně.
V praxi je výhodné použít konkrétní hotovou sadu formátovacích pravidel a nevymýšlet svojí vlastní. Díky tomu se při přesunu kódu z jednoho vývojáře na dalšího (například v rámci různých firem) nemusí přenášet i sada pravidel, ale použití se již zažité principy. Například pro jazyk PHP existuje sada pravidel PSR2[1].
Je obtížné definovat, co je dobrý styl. Přesný standard není definován, jedná se do jisté míry o subjektivní pohled každého programátora. Nicméně existují základní prvky, které jsou společné velkému množství programovacích stylů:
Formátování kódu se liší podle typu zvoleného paradigmatu a gramatických pravidel jazyka. Často se také odvozuje podle návrhových vzorů, které slouží pro sjednocení konvence.
Programovací styly obvykle vycházejí z vizualizace zdrojového kódu, což programátorovi usnadňuje práci při orientaci v konkrétním algoritmu a zjišťování, co kód reálně dělá. Software pro psaní zdrojového kódu často umožňuje automatické formátování, což programátorovi usnadňuje práci a umožňuje mu soustředit se na vlastní programování. Praktickým hlediskem automatického formátování zdrojového kódu je, že šetří čas a umožňuje snazší prosazení firemních standardů bez větších diskuzí.
Styl zápisu s odsazováním pomáhá při identifikaci bloků kódu. U některých programovacích jazyků je odsazování používáno pro stanovení hranice logických bloků zdrojového kódu. Správné odsazování je v tomto případě více, než jen problém stylu. V některých jazycích neovlivňují netisknutelné znaky a odsazování funkčnost, avšak dělají zdrojový kód čitelnější. Porovnejte zápisy:
if (hours < 24 && minutes < 60 && seconds < 60)
{
return true;
}
else
{
return false;
}
nebo
if (hours < 24 && minutes < 60 && seconds < 60) {
return true;
} else {
return false;
}
s tímto zápisem bez přehledného odsazování
if ( hours<
24 && minutes<
60 && seconds<
60 )
{return true
;} else
{return false
;}
První dva příklady jsou čitelnější, odsazení je provedeno podle ustanovených pravidel. Tento styl odsazování je zejména používán u vícenásobných vnořených bloků.
Programovací jazyk Python používá odsazování přímo k definici struktury a významu zdrojového kódu.
Často je užitečné seřadit podobné elementy zdrojového kódu svisle, protože jsou vzniklé chyby zřetelnější. Porovnejte:
$search = array('a', 'b', 'c', 'd', 'e');
$replacement = array('foo', 'bar', 'baz', 'quux');
$value = 0;
$anothervalue = 1;
$yetanothervalue = 2;
s tímto příkladem:
$search = array('a', 'b', 'c', 'd', 'e');
$replacement = array('foo', 'bar', 'baz', 'quux');
$value = 0;
$anothervalue = 1;
$yetanothervalue = 2;
U druhého příkladu je zvýrazněná možná chyba:
Argumentem proti svislému zarovnání může být problém udržení zarovnání u některých editorů. Tento problém může být eliminován použitím editoru zdrojového kódu, který podporuje funkci elastických tabulátorů. Na další problém můžeme narazit při použití verzovacích systémů: pokud bychom přidali čtvrtou položku s delším názvem, museli bychom přidat mezery i k prvním třem řádkům – ve verzovacím systému by pak byly zaznamenány změny na řádcích, na kterých se fakticky nic nezměnilo.
U většiny programovacích jazyků platí, že pro oddělení syntaktických elementů lze použít libovolný počet bílých znaků (mezer, tabulátorů a konců řádku). Vhodné použití bílých znaků zlepšuje čitelnost zdrojového kódu. Příkladem může být porovnání syntakticky ekvivalentních příkladů zdrojového kódu jazyka C:
int i;
for(i=0;i<10;++i){
printf("%d",i*i+i);
}
vs.
int i;
for (i=0; i<10; ++i) {
printf("%d", i*i+i);
}
vs.
int i;
for ( i = 0; i < 10; ++i ) {
printf( "%d", i*i + i );
}
Použití tabulátoru k odsazení znaků přináší specifické problémy s velikostí odsazení tabulátoru, které se liší v závislosti na použitých nástrojích a uživatelských preferencích. Příkladem může být programátor, který má nastaven tabulátor o délce čtyři znaky a přizpůsobuje tomu svůj zdrojový kód:
int ix; // Index to scan array
long sum; // Accumulator for sum
Jiný programátor má v editoru nastaven tabulátor o délce osmi znaků. Při prohlížení kódu od prvního programátora může být zdrojový kód méně čitelný:
int ix; // Index to scan array
long sum; // Accumulator for sum
Stanovení šířky osazení (obvykle 4 znaky, případně 8 nebo 2) a rozhodnutí, zda pro odsazování používat tabulátory nebo mezery je důležitou součástí konvencí pro psaní kódu každého týmu. Teoretickou výhodou použití tabulátorů je, že ukládají do textu sémantickou informaci: počet úrovní odsazení = počet po sobě jdoucích tabulátorů. Použití tabulátorů však přináší problémy, protože je obtížné tuto konvenci dodržovat, když kód odsazený tabulátory a mezerami vypadá stejně. Z tohoto důvodu je lepší se použití tabulátorů úplně vyhnout.
Vhodný výběr názvů proměnných je základním principem pro tvorbu dobře stylizovaného zdrojového kódu. Špatně pojmenované proměnné zhorší jeho čitelnost, což je ukázáno na příkladu:
get a b c if a < 24 and b < 60 and c < 60 return true else return false
Kvůli nevhodné volbě proměnných je poměrně složité na první pohled zjistit, k čemu daná část zdrojového kódu slouží. V následujícím příkladu jsou názvy proměnných více názorné a je snadnější rozpoznat záměr kódu:
get hours minutes seconds if hours < 24 and minutes < 60 and seconds < 60 return true else return false