/ janturon.cz / Od kodéra k analytikovi / Návrhové antivzory

Návrhové antivzory

God object

Této návrhové chyby se dopouštějí hlavně programátoři uvyklí na procedurální styl: spočívá ve vytvoření velké třídy (víc než 10kB) často pojmenovanou jako Engine, přičemž ostatní třídy (jsou-li jaké) jsou mnohem menší (1-2 metody) a slouží převážně k manipulaci s velkou třídou.

Tento postup je prohřešek proti principu SRP: problémem, který ona velká třída řeší, je celý program. Je všudypřítomná, všemohoucí a časem přebírá i další nevítané božské vlastnosti: nekonečná složitost, záhadnost a nenahraditelnost v aplikaci. Programátor se pak může jen modlit, aby na aplikaci žádné další požadavky nebyly.

 

Sekvenční volání metod

Spočívá v nutnosti volat metody v předepsaném pořadí. Pokud na pořadí nesejde (například pořadí zaslání proměnných v URL), a aplikace se přesto chová jinak, říká se tomu race hazard.

Nesprávné pořadí volání by nikdy nemělo končit chybou. Tak je tomu i v reálném světě: pokud odneseme půllitr, a teprve pak provedeme metodu načepujPivo(), ubrus se dostane do nežádoucího stavu, ale svět se kvůli tomu nezboří s chybovou hláškou.

 

Unáhlené zobecnění

Popisuje předpoklad, že kód se bude používat i v budoucích aplikacích, což vede ke složitějšímu kódu. Veškerý kód by se měl vyvíjet induktivně: s abstrakcí odpovídající zadání, které je při další iteraci zobecňováno správným použitím návrhových vzorů. Deduktivní postup od abstraktního ke konkrétnímu řešení přesahující jednu iteraci jde proti směru vývoje a nefunguje.

 

Dělo na zajíce

Spočívá v nasazení robustního univerzálního kódu k řešení jednoduchého problému (například použití redakčního systému na statické prezentační stránky).

 

Hranaté kolečko, Kulatý čtvereček

Je pokus o použití návrhového vzoru do situace, kde se nehodí. Připomíná to situaci, kdy se nemluvně pokouší nacpat hranatý dílek do kulatého otvoru.

Přebujelá analýza (Paralýza analýzou)

Hrozí hlavně při nevhodném nasazení vodopádové metodiky. Spočívá v analýze příliš daleko dopředu s mnoha možnostmi a výstupy. Promýšlení každé větve zabírá mnoho času, většina větví jsou nerealizované možnosti, a projekt tak stojí. Hloubka analýzy se musí odvíjet od ceny ušlé příležitosti (opportunity cost): k paralýze dochází, je-li cena za analýzu vyšší než cena realizace. Pokud je naopak cena realizace výrazně vyšší než cena analýzy a udělá se ukvapené nesprávné rozhodnutí, je to antivzor extinct by insinct. Moderní deskové hry jako LeHavre, Agricola či Samarkand jsou založeny na rozhodovacím stromu příliš širokém na průchod do hloubky a trénují tak rozpoznání a vyvážení těchto dvou antivzorů.

 

Přebujelá hierarchie

Většina dědičností nezná "prarodiče" a "vnuky", tedy více než jeden krok odvození. A když, pak je nejstarší předek většinou jednoduchý nebo nejmladší potomek pouze drobnou úpravou předka. Jakékoliv složitější odvozování vyžaduje zmapování závislosti, což je další požadavek na programátora, který lze vhodnějším návrhem obejít.

 

Přebujelé rozhraní

Rozhraní, které má mnoho metod, je těžké implementovat. Typickým příkladem je Java MouseListener: většinou stejně implementujeme pouze mouseClicked. K usnadnění Java používá MouseAdapter, který tyto metody implementuje jako prázdné a třída, která ho zdědí, může tyto metody překrýt. V tom případě ale rozhraní postrádá jakýkoliv smysl.

 

Feature Envy

Je indikována složitým nastavováním objektu mimo třídu, ve které je definován. (Tyto operace by měly být shrnuty jako nová metoda ve třídě, se kterou se pracuje.) Není tak jasné, ve které třídě je napsána zodpovědnost za prováděnou operaci

Každá metoda by se měla starat o vlastnosti své třídy, ne o vlastnosti objektů, které používá (závidí jim jejich vlastnosti). Každý objekt má svou vymezenou zodpovědnost (viz Anemický doménový model) a neměl by lézt do zelí jinému objektu.