Přejít k navigační liště

Zdroják » Různé » Jak psát hezký kód III

Jak psát hezký kód III

Články Různé

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.

Komentáře

Subscribe
Upozornit na
guest
6 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
View all comments
aprilchild

Clanek se umistil v hitparade 10-ti nejpitomejsich posledni dekady. Nic osobniho, ale uz prosim nic dalsiho nepiste. Existuje duvod, proc nejlepsi knihy s tematikou jakou jste zvolil, pisi lide s mnohaletou (>20) praxi. Vyberte si „cool, hot, brand-new“ tema (je jich v soucasne vlne asi miliarda) a zacnete jimi.

Nezkousejte generalizovat, nezkusenost je z vas citit na sto honu. All the best :).

Almad

Tak zas jako

I am a 19 years old student, who is studing Electronic computer systems fourth year at secondary school in Jičín (…) Next language, which I can excellent, is Python. I programming in Python only one year, but I wrote a great screenlet. (…)

Ja myslim ze na ten vek celkem dobry ,) (Otazka proc zdrojak a ne blogisek, ale to je na pana Maleho)

Martin Malý

Už jsem to někde vysvětloval… Pokud fakt chcete odpověď, tak mi pošlete mail (na redakce kyseláryba zdrojak.cz) a já vám odpovím. :)

vpoho

Já nevím, co mají. Ano, s něčím nemusím souhlasit (já s hodně věcma), ale že by to byl špatnej seriál, to taky rozhodně ne. Kdyby se totiž redakce na všech serverech měly řídit tím, co píšou pánové nahoře, tak tu nemáme žádný články, a nedozvíme se o ničem a nic. Dle mě si z tohoto seriálu každej vezme svoje, někdy možná něco jinýho než autor – ale to nevadí, případně si na základě toho člověk zjistí víc informací, pokud ho to zajímá do hloubky či chce info od těch (praxe>20). Podle mě je to prostě startovní čára, a v poho.

uf

Já si myslím, že seriál je dobře napsaný, ačkoliv JEN opisuje z knihy.

Spousta lidí publikuje, protože má potřebu psát nebo se zviditelnit nebo si myslí, že jsou machři. Na druhou stranu nějak začít musí.

Zažil jsem už spoustu článků, které omílají opakované téma nebo opisují dokumentaci – třeba hashCode() a equals() v javě. Na druhou stranu někdo upozorní začínající, na co si dát pozor. Článek najdou jako novinku, normálně by ho nevyhledali.

Já začnu až příští týden.

Quido

Divím se, proč takové kritiky. Pokud se vám seriál nelíbí, napište, že byl hroznej a nečtěte ho. Pokud nechcete, aby autor publikoval, piště do redakce.

Enum a statická analýza kódu

Mám jednu univerzální radu pro začínající programátorty. V učení sice neexistují rychlé zkratky, ovšem tuhle radu můžete snadno začít používat a zrychlit tak tempo učení. Tou tajemnou ingrediencí je statická analýza kódu. Ukážeme si to na příkladu enum.

Pocta C64

Za prvopočátek své programátorské kariéry vděčím počítači Commodore 64. Tehdy jsem genialitu návrhu nemohl docenit. Dnes dokážu lehce nahlédnout pod pokličku. Chtěl bych se o to s vámi podělit a vzdát mu hold.