Toto je starší verze dokumentu!
Z odpovědi Kouby vyplývá, že je z těch otázek nadšen zhruba stejně jako my (nedělal je on, dostal je i s předmětem přiděleny). Potvrdil, že to, kam to směřujeme, je patrně správně…ale také neví, co tím autor vlastně myslel (což asi nevěděl ani autor sám…).
Klíčová část odpovědi k metodikám OOP návrhu:
„RUP bych tam okrajově zmínil, ale souhlasím s Vámi, že je to především metodika vývoje SW. Začal bych funkčníma požadavkama, use casama, řekl bych, že se v use casech identifikují kandidáti na analytické třídy. Jak se zpřesňují use casy, tak se začíná analyzovat interakce mezi těmito návrhovými třídami, které se vyjadřují interakčními diagramy (t.j. sekvenčními nebo activity) popř. stavovým diagramem, který se typicky používá k popisu životního cyklu těch tříd. Jdyž máme takto nadefinované funkční požadavky, uděláme z analytických tříd třídy návrhové a při implementaci třídy implementační.“
Deméterovo pravidlo je doporučení pro objektový návrh, které respektuje princip minimální znalosti o zbytku systému. Jedná se také o návod, jak kontrolovat, že implementace metod zbytečně nezvyšuje zatížení tříd dalšími třídami, které nejsou pro její funkci bezpodmínečně nutné. Objekt by měl činit jen minimální předpoklady o struktuře a chování objektů ostatních. Toho lze dosáhnout tak, že bude každý objekt komunikovat jen se svým nejbližšími sousedy, kde sousednost dvou objektů znamená schopnost jednoho objektu volat metody objektu druhého. Pravidlo Deméter tedy primárně slouží k zachování znovupoužitelnosti.
Formálně pravidlo Deméter říká, že metoda M objektu O může volat metody jen a pouze těchto objektů:
objektu O parametrů metody M objektů vytvořených v metodě M objektů obsažených v objektu O
V praxi to znamená, že když máme v nějaké metodě objekt, tak voláme pouze metody poskytnuté tím objektem a nevoláme explicitně např.jeho vnořené objekty a jejich metody. Tj. něco podobného není doporučeno: this.getSomeObject().getSomeSubObject().callMethod()
, nebo také someObject.getSubObject().callMethod()
.
Převzato z http://voho.cz/wiki/objektovy-navrh-grasp/
GRASP (general responsibility assignment software patterns) je sada doporučení, principů a vodítek, sloužících k vytvoření kvalitnějšího objektového návrhu. Princip GRASP se zaměřuje se na rozdělení zodpovědností jednotlivým třídám a objektům.
Zodpovědností se rozumí podúloha, kterou má třída nebo skupina tříd řešit. Může to být například načítání zakázek, výpočet daně nebo kopírování souborů. Každá taková zodpovědnost lze realizovat různými třídami a různými metodami. GRASP radí, jak jednotlivé podúlohy mezi třídy rozdělit a jak tyto součásti spolu budou spolupracovat. Výstupem jsou nejčastěji diagramy spolupráce v jazyce UML).
Information Expert rozdělení zodpovědnosti na základě přístupu k informací Creator nalezení vhodného místa k vytváření instancí Controller realizace uživatelské akce Low Coupling minimální závislosti mezi třídami High Cohesion maximální soustředěnost souvisejících dat a funkcí Polymorphism odlišné chování podle konkrétního typu objektu Protected Variations identifikace a stabilizace společného rozhraní několika tříd Pure Fabrication návrh univerzálních tříd, které nejsou závislé na řešeném problému Indirection komunikace mezi dvěma třídami zajištěná třetím prostředníkem
Princip information expert (informační expert) říká, že třídou zodpovědnou za nějakou akci má být právě ta třída, která má k provedení této akce nejvíce informací. Taková třída se nazývá informační expert. Podle tohoto pravidla by se měly služby umisťovat k souvisejícím atributům a třída by měla se svými vlastními daty pracovat pokud možno sama.
Princip creator (tvůrce) pomáhá najít vhodné místo, kde vytvářet nové instance nějaké třídy. Je to princip důležitý, protože vytváření nových objektů patří mezi nejčastější operace v objektově orientovaném programování. Vytváření nových instancí třídy A by mělo být zajištěno třídou B, právě když platí alespoň jeden z těchto výroků:
Třída označovaná jako controller (ovladač) je taková třída, která jako první zpracovává systémovou událost (například uživatelskou akci vyvolanou kliknutím na tlačítko) a zajišťuje její provedení. Controller by měl akci delegovat specializovanému podsystému nižší úrovně.
Princip low coupling (nízká závislost) si vynucuje dodržování těchto zásad:
Princip high cohesion (vysoká soudržnost) je založen na těchto principech:
Chování se mění na základě typu objektu.
Princip protected variations (chráněné variace) ochraňuje prvky systému před změnami jiných prvků tak, že zavede rozhraní. Konkrétní chování se pak zvolí na základě konkrétní instance objektu.
Třída označovaná jako pure fabrication v systému existuje jen a pouze proto, aby vylepšila systémovou architekturu (zmenšila závislost a/nebo zvýšila soustředěnost). Taková třída je velmi vhodným kandidátem pro znovupoužití, tedy pro přenos mezi projekty se stejnou či podobnou architekturou.
Princip zvaný indirection (nepřímost) snižuje závislost mezi dvěma třídami tak, že jejich vazby přetrhne a místo nich nechá obě třídy komunikovat přes prostředníka. Tím se mimo jiné zvyšuje i znovupoužitelnost obou tříd.
Příkladem dobrého použití tohoto principu je vytvoření controlleru jako prostředníka pro přenos dat mezi uživatelským rozhraním (view) a datovým modelem (model) v architektuře MVC (model-view-controller).