Jak psát hezký kód III

V minulých dílech jsme si ukázali, jak správně vybírat názvy, jak správně psát funkce, metody, ale také celé objekty. Také jsme si pověděli, že nebudeme psát komentáře, a pokud ano, tak pouze výjimečně a hlavně správné, přínosné komentáře. Dnes si ukážeme, k čemu a jak dokáže pomoci hezké formátování kódu.

Seriál: Hezký kód (3 díly)

  1. Jak psát hezký kód I 13.4.2010
  2. Jak psát hezký kód II 20.4.2010
  3. Jak psát hezký kód III 27.4.2010

Formátování kódu

Formátování je velmi důležitá věc. Pokud bychom psali kód, jak by nás napadlo, tak by se v něm nedalo nic nalézt a byl by k ničemu, i kdyby byl kdovíjak geniální. Proto je důležité, abychom kód pěkně formátovali, díky čemuž se v něm budeme i dobře orientovat. Hned na úvod si uvedeme příklad.

#include
int   main(int argc,char*argv[]){int x = 5;if (x> 3 &&x<8  )std::cout <<"je v rozmezi";
else {std::cout<<"neni v rozmezi";}std::cout<<    " 3 az8"<< std::endl;}

V dnešním díle budou ukázky v C/C++ a Pythonu.

Možná vám připadá ukázka přehnaná, a doufám, že něco takového by nikdo z vás nenapsal. V ukázce vidíme hned několik závažných problémů. Na prvním místě bych rád poukázal na zhuštění kódu. Toho si nejspíše všichni všimneme nejdřív. Nějaký Franta Moula se snažil šetřit místem na obrazovce a ve špatném poměru využil šířku řádku a délku kódu. Dalším neštěstím je využívání mezer. V ukázce jsou mezery použity úplně nerozumně – většinou nejsou, a pokud ano, tak je jich pro jistotu až moc! Kolik lidí by se takový kód snažilo přečíst, pokud by na něj narazilo? U dvou řádků možná, ale kdyby našli takových řádků několik set?

#include

using namespace std;

int main( int argc, char* argv[] )
{
    int x = 5;
    if ( x>3 && x<8 ) {
        cout << "je";
    } else {
        cout << "neni";
    }
    cout << " v rozmezi 3 az 8" << endl;
}

Takto upravený kód dělá totéž co předchozí, ale má jednu výhodu: kód lze rychleji a pohodlněji přečíst. Snažte se psát kód čitelně a s jednotným formátováním a pomůžete sobě i lidem, kteří budou číst kód po vás. Minule jsem psal o tom, že místo komentáře je mnohdy lepší kód napsat čitelněji. Dnešní první ukázka vysloveně sváděla k tomu, abychom tam nějaký (špatný, zbytečný) komentář napsali, ale jak je vidět, tak po úpravě není žádný potřeba.

Využívání šířky

Doba, kdy se psalo na šířku 80 znaků a poté se pokračovalo na dalším řádku, pominula a dnes není problém napsat klidně i 150znakový řádek. Dnes jsou monitory a rozlišení větší než dřív. Napatlat kód na jeden dlouhý řádek, jako v ukázce od Franty, není dobré, ale když je nějaký dlouhý příkaz, tak – pokud to pomůže čitelnosti – není důvod zalamovat řádek zbytečně. Dobrá ukázka může být vytvoření položky v nastavení pro Screenlet.

self.add_option( StringOption( 'Processes', 'processesType', self.processesType, 'Processes type', '', choices=self.processesTypes ) )

Naopak špatné využití šířky řádku je zmíněné patlání nesouvisejících věcí do jedné nebo vnořování seznamů v parametrech. Místo vnořování je pro čitelnost lepší před vykonáním příkazu sestavit seznam (atd.) do proměnné a poté předávat jen proměnné.

return render_to_response( 'detail.phtml', { 'category' : category, 'product' : product, 'items' : items }, context_instance=RequestContext( request ) )

dictionary = {
    'category' : category,
    'product' : product,
    'items' : items,
}
context = RequestContext( request )
return render_to_response( 'detail.phtml', dictionary, context_instance=context )

A opět, jako u všech pouček v seriálu, platí pravidlo dobré míry: u složitějších instrukcí je lepší přiřadit dlouhé seznamy parametrů předem (či u jazyků, které to umožňují, jako třeba Javascript, rozlámat dlouhý seznam do odsazených řádků), ale u jednodušších není třeba bát se vnoření.

print value[ value.find('[')+1 : value.find(']') ]

Poznámka: Dlouhých řádků je mnohem méně než řádků kratších. I když nevadí, že má řádek více než 80 znaků, tak to neznamená, že je musíme stále psát.

Délka kódu

Možná to bude znít divně, ale záleží i na délce kódu – tedy počtu řádků. Stejně jako je špatné psát dlouhé funkce, tak je špatné psát dlouhé soubory. Je vhodné každou třídu, pokud to jazyk umožňuje, udržovat ve vlastním souboru. Podle statistik délky souborů se v aplikacích pohybují okolo 100 řádků. Co statistika, to lehce jiné číslo (záleží, jaké aplikace se do statistiky dostaly). Vhodné je udržovat svoje soubory s třídami do 200 řádků. U delšího souboru se podívejte, zda není zbytečně dlouhý a zda by ho nešlo rozdělit na menší logické celky.

Poznámka: V knížce „Čistý kód“ přirovnává Robert C. Martin vertikální formátování k novinám. U dobře napsaného článku na začátku očekáváte titulek, který řekne, o čem bude pojednávat. První odstavec poskytne přehled celé zprávy bez detailů a postupným čtením se dozvídáte více a více detailů. Zdrojový soubor by se měl podobat takovému článku.

Odsazování

Odsazení je další důležitá věc u formátování kódu. Zkusme se podívat na druhou ukázku bez použití odsazení:

int main( int argc, char* argv[] )
{
int x = 5;
if ( x>3 && x<8 )
cout << "je";
else
cout << "neni";
cout << " v rozmezi 3 az 8" << endl;
}

Nevím jak vám, ale mě to připomíná Assembler. Neříkám, že Assembler je špatný, ale ve vyšším programovacím jazyku je takový zápis nevhodný. Špatně se čte, špatně se zjišťuje co kam patří. Vinou chybějících závorek lze také jednoduše splést, co vše patří do bloku else. Může nastat situace, kdy se vám může zdát použití odsazení zbytečné – přesto lenost stisknout jednu klávesu překonejte a tabulátor tam dejte! Pokud ho tam nedáte hned, tak můžete snadno něco přehlédnout, udělat chybu – a nakonec ho tam stejně dáte. Něco takového se nejčastěji stane například u prázdného cyklu:

while( fscanf( file, "%d", &num ) != EOF )
    ;

Nedávejte středník na začátek řádku ani na konec řádku za while. Dejte ho tak, aby ho nikdo nepřehlédl.

Odsazování je důležité a (už z principu) na to jde nejlépe Python. V něm prostě odsazovat musíte – tam složené závorky, které by naznačovaly blok kódu, neexistují. Zkušenost s Pythonem vás naučí správně odsazovat kód i v jiných jazycích.

Bloky

Složené závorky, které vyznačují v C-like jazycích bloky kódu, píše každý jinak. Někdo píše závorky na řádek za hlavičku funkce, někdo na nový řádek samostatně. Stejně tak podmínky, cykly a podobně. Žádný způsob není lepší než jiný způsob. Každému vyhovuje něco jiného. Jelikož to každý píše jinak, tak je dobré se v týmu dohodnout na jednotném způsobu a ten dodržovat v celé aplikaci. I vy sami byste měli dodržovat pro svoje aplikace jednotný styl. (Otázka, zda složená závorka patří na řádek s hlavičkou či na nový, je vděčné a věčné téma k flamewar.)

Dodatek

Formátování kódu je často věc individuálního stylu. Nikde není napsáno, jak by se měl kód přesně formátovat. Přesto pro jednotlivé jazyky existují určité typografické konvence, přijímané širokou obcí jeho uživatelů. Pokud s nějakým jazykem začínáme, rozhodně nebude na škodu tyto konvence dodržovat (například pro Python tu je PEP 8). Můžete časem zjistit, že vaší produktivitě (či celému vašemu týmu) vyhovuje konvence lehce jiná – v takovém případě se nebojte používat to, co vyhovuje vám. Mnohem důležitější než názor komunity je psát kód jednotně, a ještě důležitější je psát kód jednotně v celém týmu. V týmu byste se měli dohodnout, jak budete kód formátovat, a toho se držet v celé aplikaci.

Formátujte kód podle sebe, jak vám vyhovuje nebo podle toho, jak jste se dohodli v týmu – jazykové konvence nejsou dogma. Formátujte ale hezky. Možností je dost a nezapomeňte, že hezky formátovaný a dobře čitelný kód je vaše vizitka.

Konec

Tento miniseriál byl pouze rychlý a všeobecný přehled a úvod do problematiky „hezkého kódu“. Dále se už musíte zdokonalovat sami. Určitě si pořiďte nějakou literaturu na toto téma. Známý citát říká, že každý rok bychom se měli naučit minimálně jeden nový jazyk nebo metodu programování a zdokonalit se v tom, co už umíme. Neváhejte se tedy zdokonalit i v psaní kódu.

Do pravidel „hezkého kódu“ patří například i testy. O testování jsem se v seriálu nakonec nezmínil; místo toho doporučuji článek o testování v Pythonu zde na Zdrojáku.

Michal dělá team leadera v Seznam.cz a hraje si na BOObook.cz. Jeho nejoblíbenějším jazykem je Python, ale nevadí mu třeba ani JavaScript a rád zkouší nové jazyky i technologie. Ve volném čase cestuje, fotí, píše, ale taky plave, jezdí na kole či tancuje.

Komentáře: 6

Přehled komentářů

aprilchild Gratulace
Almad Re: Gratulace
Martin Malý Re: Gratulace
vpoho Re: Gratulace
uf Re: Gratulace
Quido Re: Jak psát hezký kód III
Zdroj: https://www.zdrojak.cz/?p=3222