/ janturon.cz / Od kodéra k analytikovi / Antivzory programování

Antivzory programování

Antivzory jsou opakující se postupy a přístupy, které se neosvědčily. Je dobré je znát, abychom se jim mohli vyhnout: obecně vedou k problémům a zádrhelům ve vývoji.

Metodické antivzory

Univerzální kladivo

Vystihuje Murphyho zákon Máte-li po ruce kladivo, vše ostatní vám připadá jako hřebík. Jinými slovy, pokud si někdo osvojí nějakou techniku (např. práci s poli), měl by také vědět, kde je vhodná a nepoužívat ji na všechno, s čím se setká.

Znovuvynalézání kola

Je jakákoli snaha napsat vlastní algoritmy pro něco, co už existuje (třeba práce s řetězci). Takový programátor mívá nedůvěru ke všemu, co si nenapsal sám - včetně dlouhodobě osvědčených řešení - a raději si píše vlastní neprověřené knihovny na všechno. To je jednak na překážku týmového programování, a druhak to odvádí od obchodní logiky vyvíjené aplikace.

Nepravděpodobné

Spočívá v odhalení chyby a jejím ignorování, protože okolnosti, které k ní vedou, jsou velmi nepravděpodobné a ošetření by bylo složité. Z omylu vyvádí Murphyho zákon: Pravděpodobnost, že se něco stane, je nepřímo úměrná tomu, nakolik je žádoucí, aby se tak stalo. Občas se tento přístup pejorativně označuje jako God-oriented programming nebo Slepá víra - programátor věří, že k chybě nedojde. Každý zkušený programátor reaguje na slovo nepravděpodobné jako býk na červený hadr.

Security by obscurity

Z důvodu pohodlnosti se někdy dělá přístup do autorizované části programu tak, že někde něco schováme (např. soubor s citlivými daty pojmenujeme nějak nenápadně, třeba win32.sys). Tvůrce věří, že nikoho nenapadne zkoumat obsah tohoto souboru (viz God-oriented programming). Správný přístup je Security by design, vyřešený například odebráním práva pro čtení citlivému souboru.

Dědictví minulosti, Historické důvody (Legacy code)

Je používání kódu, o němž se všeobecně ví, že je špatně navržen, ale nikdo si netroufá provést v něm změnu, protože na něm stojí megabajty kódu a při sebemenší změně by vše přestalo fungovat.

Boilerplate

Je nutnost napsat větší množství kódu (aby aplikace fungovala), který ale nemá nic společného s její obchodní logikou. Často se objeví po několikerém refaktoringu, je příznakem zahnívání kódu (code smell).

Kódovací antivzory

Programování copy&paste

Znamená nepoužívání abstrakce. Pokud je nějaký kód nutno vykonat vícekrát, místo cyklu se použije nakopírování stávajícího kódu. Kam tento postup vede, viz příklad s násobilkou.

Programování pokus-omyl

Jest postup opravy chyb stylem Co kdybych tento příkaz dal před tento blok? nebo Co kdybych tady proměnnou i nastavil na 5? I kdybychom chybu takhle opravili, nebudeme vědět, proč kód funguje, tedy při jakékoliv úpravě si nikdy nebudeme jisti, jestli kód bude fungovat i nadále. Před každou úpravou musí být jasný záměr, ne Co kdyby...?.

Lepení kódu

Stane se, že zjistíme například, že chyba nastala, protože hodnota proměnné byla null místo 5. Lepení kódu znamená, že před uvedené místo vložíme příkaz if(i==null) i=5;. Opět je nutno vědět, proč tam byla neočekávaná hodnota, jinak si nemůžeme být jisti, jestli se tatáž chyba nevyskytne i jinde. Kód se tak navíc stává nepřehledným, což je beztak předposlední krok pro jeho přepsání.

Zašmodrchaný kód, Špagety

Je používání GOTO, podmínky v podmínce a přísně vzato cokoliv, co není patrné na první pohled a potřebuje komentář.

Skrývání chyby

Je ponechání prázdného bloku catch, případně zobrazení bezobsažné zprávy typu Došlo k obecné chybě aplikace. Pokud chyba nastane, v prvním případě se o ní vůbec nedozvíme (a aplikace bude pracovat se špatnými daty), v druhém případě se nedozvíme příčinu chyby.

Kódování natvrdo

Znamená předpoklad, že něco bude fixní. Je to například použití řetězce C:\Windows místo systémové proměnné %SystemRoot% - v případě, že uživatel má Windows na disku D, aplikace nebude fungovat. Takovým fixním výrazům se říká magická čísla/řetězce. V programu by se neměl vyskytovat žádný řetězec a žádné číslo kromě nuly a možná občas jedničky. Obzvláště pokud se fixní hodnota používá na více místech. Tyto údaje je vhodné umístit do konfiguračního souboru.

Mrtvý kód

Je jakýkoliv kód, který se nepoužívá při vykonávání programu. Je zbytečný - jeho odstranění přispěje k přehlednosti.