Zrádný IF

Vývojáři, kteří se svému oboru věnují již delší dobu, nemohli nezaznamenat diskuse na téma zda, je správné použ...


Vývojáři, kteří se svému oboru věnují již delší dobu, nemohli nezaznamenat
diskuse na téma zda, je správné používat klíčové slovo goto, ba dokonce zda má
být v programovacích jazycích vůbec k dispozici. Šlo o diskuse na první pohled
malicherné, avšak dotýkající se samé podstaty strukturálního programování
konstruktu if-then-else. Tato konstrukce představuje základní nástroj k řízení
výpočtu ve strukturním programování a k zajištění integrity programu. Potíž s
goto je v tom, že umožňuje tuto strukturu po libosti obcházet, a tím vytváří
prostor pro obtížně odhalitelné chyby. Diskuse skončily tím, že goto coby pouhý
nástroj v programovacích jazycích zůstává, nemalá část programátorů je však při
jeho používání velmi obezřetná.

IF objektově
Autor tohoto článku je přesvědčen o tom, že ve světě objektového programování
(OOP) nás čeká obdobná diskuse, a to zda máme či nemáme používat konstrukt
if-then-else. Zatímco v programu vytvořeném podle zásad strukturálního
programování se výpočet větví podle podmínek vyhodnocovaných pomocí if, v
programu vytvořeném podle zásad OOP je situace odlišná. Základním prvkem
výpočetního modelu objektového programu je zpráva, kterou poslal jeden objekt
druhému. Příjemce zprávy na ni potom reaguje podle své přirozenosti. Poněkud
nepřesně se dá hovořit o polymorfismu podle typu (třídy) příjemce. Rozhodnutí o
tom, co a jak se v reakci na zprávu vykoná, je dáno identitou příjemce.
Rozhodování podle if není potřeba. Úlohu rozhodovacího bloku zde hraje
struktura programu neboli objektový model.
To samozřejmě neznamená, že je potřeba if odmítnout jako takový. Uplatní se při
porovnávání objektů z množiny, nad kterou je definováno nějaké uspořádání. Dále
je vhodné používat if například tam, kde se pracuje s nějakou logickou
hodnotou. If, či spíše jeho podoba switch, najde též uplatnění při tvorbě
objektového grafu, kdy je potřeba zvolit vhodný typ objektu, často jen na
základě jeho jména. Problém if-then-else spočívá především v tom, že do
budoucna určuje a pevně svazuje strukturu programu. Zhoršuje udržovatelnost
programu a snižuje flexibilitu změn, čímž významně ztěžuje nasazení moderních
agilních metodik vývoje softwaru.

Pro názornost
Pro snazší pochopení poslouží následující příklady. Jsou psány v jazyce C#,
zajisté však budou srozumitelné i uživatelům C++ či Javy a snad i všem ostatním.
Příklad 1 ukazuje past, do které se chytil již nejeden programátor. Podobný
styl psaní programů má autor na mysli, hovoří-li o špatné udržovatelnosti
programu.
Pro demonstraci toho, jak je v OOP možno výhodně nahradit konstrukci
if-then-else, poslouží tento příklad: mějme třídu, která představuje
konfiguraci naší aplikace. Chceme mít možnost tuto konfiguraci ukládat různým
způsobem například do registru Windows, do INI souboru nebo do XML souboru.
Naivní přístup k řešení takového zadání ukazuje příklad 2.
Konstrukce switch/case je pouze o něco pohlednější blízký příbuzný if; na jeho
podstatě nic nemění. Nejhrubší chybu použití "magic numbers" je možno snadno
odstranit zavedením symbolických konstant (C++) nebo lépe pomocí výčtového typu
(C#). Kromě lepší čitelnosti tím však mnoho navíc nezískáme, protože možnosti
uložení konfigurace zůstanou neměnné a v případě potřeby rozšíření to znamená
změnit příslušný kód a znova sestavit příslušný program.
Pokud se rozhodování pomocí if nějakým vhodným způsobem zbavíme, získáme lépe
měnitelný program, který bude navíc i lépe strukturovaný z hlediska OOP. Jedním
ze způsobů, jak toho dosáhnout, je zavedení dalších tříd, specializovaných na
ukládání konfigurace do daného úložiště, například podle návrhového vzoru
Strategie (Strategy Pattern), viz příklad 3.
Pokud někdy v budoucnu vznikne potřeba nového způsobu ukládání konfigurace,
například přes webové služby, jsme připraveni. Implementace bude snadná a při
správném návrhu se vše obejde bez nutnosti zásahu do již běžící aplikace. Tento
příklad je navíc stále možno zlepšovat například zavedením rozhraní
IConfigurationSaver, definujícího metodu Save (Configuration).
Obecně se snad dá říci, že pokud stojí programátor před otázkou, zda je splněna
nějaká jednoduchá podmínka (soubor je otevřený apod.), potom je vhodné použít
if. Pokud se však jedná spíše o rozhodnutí, jakým způsobem dále pokračovat,
potom je dobré zamyslet se nad tím, jestli by nebylo lepší nahradit if
objektovou vazbou. Zavádět všeobecně platná pravidla pro to, kdy použít if a
kdy ne, si však autor netroufá, a vlastně to ani nepovažuje za nutné.
Autor je Senior Software Engineerem v Adastra Corporation.









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.