Styl programování - Programming style

Styl programování , známý také jako styl kódu , je sada pravidel nebo pokynů používaných při psaní zdrojového kódu pro počítačový program . Často se tvrdí, že dodržování konkrétního stylu programování pomůže programátorům číst a porozumět zdrojovému kódu odpovídajícímu stylu a vyhnout se zavádění chyb.

Klasickou prací na toto téma byly Prvky programovacího stylu , napsané v 70. letech, a ilustrované příklady z tehdy převládajících jazyků Fortran a PL / I.

Styl programování používaný v konkrétním programu může být odvozen z kódovacích konvencí společnosti nebo jiné výpočetní organizace, stejně jako z preferencí autora kódu. Programovací styly jsou často navrženy pro konkrétní programovací jazyk (nebo jazykovou rodinu): styl považovaný za dobrý ve zdrojovém kódu C nemusí být vhodný pro zdrojový kód BASIC atd. Některá pravidla se však běžně používají v mnoha jazycích.

Prvky dobrého stylu

Dobrý styl je subjektivní záležitostí a je obtížné jej definovat. Existuje však několik prvků společných pro velký počet programovacích stylů. Problémy obvykle považované za součást stylu programování zahrnují rozložení zdrojového kódu, včetně odsazení ; využití prázdného prostoru kolem operátorů a klíčových slov; velká a malá písmena klíčových slov a názvů proměnných; styl a pravopis uživatelem definovaných identifikátorů, jako jsou funkce, procedury a názvy proměnných; a použití a styl komentářů .

Vzhled kódu

Programovací styly se běžně zabývají vizuálním vzhledem zdrojového kódu s cílem čitelnosti. Již dlouho je k dispozici software, který automaticky formátuje zdrojový kód, takže kodéry se mohou soustředit na pojmenování, logiku a vyšší techniky. Praktické použití formátování zdrojového kódu pomocí počítače šetří čas a je tedy možné bez debat prosazovat celofiremní standardy .

Odsazení

Styly odsazení pomáhají identifikovat tok řízení a bloky kódu. V některých programovacích jazycích se k vymezení logických bloků kódu používá odsazení; správné odsazení je v těchto případech více než otázkou stylu. V jiných jazycích nemá odsazení a prázdné znaky vliv na funkci, ačkoli logické a konzistentní odsazení umožňuje lepší čitelnost kódu. Porovnat:

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 něčím jako

if  ( hours   < 24
   && minutes < 60
   && seconds < 60
)
{return    true
;}         else
{return   false
;}

První dva příklady jsou pravděpodobně mnohem snadněji čitelné, protože jsou odsazeny zavedeným způsobem (styl „zavěšeného odstavce“). Tento styl odsazení je zvláště užitečný při práci s více vnořenými konstrukcemi.

ModuLiq

Skupiny ModuLiq Zero Indentation Style s návratem konce řádku, nikoli s odsazením. Porovnejte všechny výše uvedené položky s:

if (hours < 24 && minutes < 60 && seconds < 60)
return true;

else
return false;

Lua

Lua nepoužívá tradiční složené závorky ani závorky . if / else příkazy vyžadují pouze následování výrazu thena uzavření if / else příkazu end.

if hours < 24 and minutes < 60 and seconds < 60 then
  return true
else
  return false
end

Odsazení je volitelné. and, or, notJsou používány mezi Pravda / nepravda.

Jsou to pravdivá / nepravdivá prohlášení, jako

print(not true)

by znamenalo falešný.

Krajta

Python používá k označení řídicích struktur odsazení , takže je vyžadováno správné odsazení . Tímto způsobem je eliminována potřeba bracketingu se složenými závorkami (tj. {A }). Na druhou stranu kopírování a vkládání kódu Pythonu může vést k problémům, protože úroveň odsazení vloženého kódu nemusí být stejná jako úroveň odsazení aktuálního řádku. Ruční přeformátování může být zdlouhavé, ale některé textové editory a IDE mají funkce, které to umožňují automaticky. Existují také problémy, když se kód Pythonu stává nepoužitelným, když je zveřejněn na fóru nebo na webové stránce, která odstraňuje prázdné místo, i když tomuto problému se lze vyhnout, pokud je možné kód uzavřít do značek zachovávajících prázdné místo, například „<pre> .. . </pre> „(pro HTML ),„ [kód] “...„ [/ kód] “(pro bbcode ) atd.

if hours < 24 and minutes < 60 and seconds < 60:
    return True
else:
    return False

Všimněte si, že Python nepoužívá složené závorky, ale normální dvojtečku (např. else:).

Mnoho programátorů v Pythonu má sklon řídit se běžně dohodnutým průvodcem stylem známým jako PEP8. Existují nástroje určené k automatizaci souladu s PEP8.

Haskell

Podobně má Haskell mimosmluvní pravidlo , tj. Má dvourozměrnou syntaxi, kde má odsazení smysl definovat bloky (alternativní syntaxe však používá složené závorky a středníky). Haskell je deklarativní jazyk, existují příkazy, ale deklarace ve skriptu Haskell. Příklad:

let c_1 = 1
    c_2 = 2
in
    f x y = c_1 * x + c_2 * y

lze napsat do jednoho řádku jako:

let {c_1=1;c_2=2} in f x y = c_1 * x + c_2 * y

Haskell podporuje používání gramotného programování , kde rozšířený text vysvětluje genezi kódu. V gramotných skriptech Haskell (pojmenovaných s lhspříponou) je vše komentář kromě bloků označených jako kód. Program lze psát v LaTeXu , v takovém případě codeprostředí označí kód. Každý aktivní odstavec kódu lze také označit předcházejícím a končícím prázdným řádkem a zahájením každého řádku kódu znaménkem větším než a mezerou. Zde je příklad použití značky LaTeX:

The function \verb+isValidDate+ test if date is valid
\begin{code}
isValidDate :: Date -> Bool
isValidDate date = hh>=0  && mm>=0 && ss>=0
                 && hh<24 && mm<60 && ss<60
 where (hh,mm,ss) = fromDate date
\end{code}
observe that in this case the overloaded function is \verb+fromDate :: Date -> (Int,Int,Int)+.

A příklad použití prostého textu:

The function isValidDate test if date is valid

> isValidDate :: Date -> Bool
> isValidDate date = hh>=0  && mm>=0 && ss>=0
>                  && hh<24 && mm<60 && ss<60
>  where (hh,mm,ss) = fromDate date

observe that in this case the overloaded function is fromDate :: Date -> (Int,Int,Int).

Vertikální zarovnání

Často je užitečné zarovnat podobné prvky svisle, aby byly chyby generované překlepy jasnější. Porovnat:

$search = array('a', 'b', 'c', 'd', 'e');
$replacement = array('foo', 'bar', 'baz', 'quux');

// Another example:

$value = 0;
$anothervalue = 1;
$yetanothervalue = 2;

s:

$search      = array('a',   'b',   'c',   'd',   'e');
$replacement = array('foo', 'bar', 'baz', 'quux');

// Another example:

$value           = 0;
$anothervalue    = 1;
$yetanothervalue = 2;

Druhý příklad intuitivně objasňuje dvě věci, které v prvním nebyly jasné:

  • vyhledávací a nahrazovací výrazy spolu souvisejí a odpovídají: nejedná se o diskrétní proměnné;
  • existuje více vyhledávaných výrazů než náhradních výrazů. Pokud se jedná o chybu, je nyní pravděpodobnější, že bude objevena.

Všimněte si však, že existují argumenty proti vertikálnímu zarovnání:

  • Falešné závislosti mezi řádky ; tabulkové formátování vytváří závislosti napříč řádky. Například pokud je k tabulkovému rozložení přidán identifikátor s dlouhým názvem, bude pravděpodobně nutné zvětšit šířku sloupce, aby se do něj vešlo. To vynutí větší změnu zdrojového kódu, než je nutné, a v šumu může dojít ke ztrátě podstatné změny. To je na úkor kontroly revizí, kde je nezbytná kontrola rozdílů mezi verzemi.
  • Křehkost ; pokud programátor při provádění změny úhledně nenaformátuje tabulku, možná oprávněně s ohledem na předchozí bod, výsledkem se stane nepořádek, který se s dalšími takovými změnami zhoršuje. Jednoduché operace refaktoringu, jako je hledání a nahrazení, mohou také přerušit formátování.
  • Odolnost proti modifikaci ; tabulkové formátování vyžaduje větší úsilí o údržbu. To může odradit programátora od provádění prospěšné změny, jako je přidání, oprava nebo vylepšení názvu identifikátoru, protože by to pokazilo formátování.
  • Spoléhání se na jednoprostorové písmo ; formátování tabulky předpokládá, že editor používá písmo s pevnou šířkou. Mnoho moderních editorů kódu podporuje proporcionální písma a programátor může pro lepší čitelnost upřednostňovat použití proporcionálního písma.
  • Závislost na nástroji ; část snahy o udržení zarovnání lze zmírnit nástroji (např. editor zdrojového kódu, který podporuje elastické zarážky ), i když to na takové nástroje spoléhá.

Například pokud se na výše uvedeném kódu provede jednoduchá operace refaktoringu, přejmenování proměnných „$ replacement“ na „$ r“ a „$ anothervalue“ na „$ a“, bude výsledný kód vypadat takto:

$search      = array('a',   'b',   'c',   'd',   'e');
$r = array('foo', 'bar', 'baz', 'quux');

// Another example:

$value           = 0;
$a    = 1;
$yetanothervalue = 2;

Původní sekvenční formátování bude po takové změně vypadat dobře:

$search = array('a', 'b', 'c', 'd', 'e');
$r = array('foo', 'bar', 'baz', 'quux');

// Another example:
 
$value = 0;
$a = 1;
$yetanothervalue = 2;

Prostory

V situacích, kdy je vyžadováno určité prázdné místo , gramatiky většiny jazyků ve volném formátu nezáleží na množství, které se objeví. Styl související s prázdným prostorem se běžně používá ke zvýšení čitelnosti . V současné době nejsou známa žádná tvrdá fakta (závěry studií) o tom, které styly mezer mají nejlepší čitelnost.

Porovnejte například následující syntakticky ekvivalentní příklady kódu C:

int i;
for(i=0;i<10;++i){
    printf("%d",i*i+i);
}

proti

int i;
for (i = 0; i < 10; ++i) {
    printf("%d", i * i + i);
}

Záložky

Použití karet k vytvoření prázdného místa představuje konkrétní problémy, pokud není věnována dostatečná péče, protože umístění bodu tabulky může být různé v závislosti na použitých nástrojích a dokonce na preferencích uživatele.

Například jeden programátor preferuje zarážky čtyř karet a má svou sadu nástrojů nakonfigurovanou tímto způsobem a používá je k formátování svého kódu.

int     ix;     // Index to scan array
long    sum;    // Accumulator for sum

Jiný programátor dává přednost zarážkám tabulátoru osmi a jejich sada nástrojů je nakonfigurována tímto způsobem. Když někdo jiný prozkoumá kód původní osoby, může být pro něj obtížné číst.

int             ix;             // Index to scan array
long    sum;    // Accumulator for sum

Jedno široce používané řešení tohoto problému může zahrnovat zákaz používání karet pro zarovnání nebo pravidla, jak musí být nastaveny zarážky karet. Všimněte si, že karty fungují dobře, pokud jsou používány konzistentně, omezeny na logické odsazení a nepoužívají se k zarovnání:

class MyClass {
	int foobar(
		int qux, // first parameter
		int quux); // second parameter
	int foobar2(
		int qux, // first parameter
		int quux, // second parameter
		int quuux); // third parameter
};

Viz také

Reference

externí odkazy