Generalizace¶
Úvod¶
Tato kapitola zavádí dva související pojmy CLM: Generalizaci — vztah mezi dvěma Class (obecnější a speciálnější) — a Abstraktní třídu, která z Generalizace vyplývá.
Oba pojmy žijí na úrovni analytického modelování (AM) s mírou detailu implementace 0 % (viz kapitola Analytické modelování).
Generalizace je vedle Asociace druhý vztah modelu tříd. Na rozdíl od Asociace nevede ke vztahu mezi instancemi — působí přímo mezi třídami. Při hledání vztahů se proto hledá až po Asociacích (viz kapitola Asociace).
Generalizace¶
Generalizace je vztah mezi dvěma Class: obecnější třídou (předek) a speciálnější třídou (potomek). Pojem Generalizace má v AAF synonymum dědičnost.
Generalizace je interakce přímo mezi třídami, ne mezi jejich instancemi. Nevede ke vztahu (Link) mezi instancemi — to je vlastnost Asociace. Generalizace působí už při vzniku instance potomka.
Předek a potomek¶
Vztah se kreslí spojnicí s trojúhelníkem u předka. Směr (šipka trojúhelníku) vede od potomka k předkovi a čte se „potomek je druh předka".
Instance potomka má vlastnosti definované potomkem i předkem dohromady, jako by se oba předpisy slily. Sdílí se definice struktury (společná políčka), ne instance — každá instance má své vlastní hodnoty.
Generalizace je tranzitivní. Má-li předek dalšího předka, nese instance potomka strukturu všech předků nad sebou.
Zástupnost rolí zespodu nahoru¶
Zástupnost rolí zespodu nahoru je klíčová vlastnost Generalizace. Všude, kde se v modelu objeví předek (na konci asociace, v odkazu, v seznamu), může tuto roli sehrát instance libovolného konkrétního potomka. Obecnější pojem předka je tak zástupným pojmem pro kteréhokoli potomka.
Projevem v instancích je rodina heterogenních linků: linky jednoho vztahu končí na instancích různých tříd (různých potomků), a přesto patří pod jeden vztah v modelu tříd.
Rozlišující znaky¶
Generalizace × Asociace. Asociace vede ke vztahu (Link) mezi instancemi a hledá se jako první. Generalizace působí přímo mezi třídami, k Linku nevede a hledá se až po Asociacích.
Nezávislost instancí potomků. Instance dvou různých potomků téhož předka spolu nejsou v žádném vztahu. Sdílí jen společnou definici struktury, ne instance.
Abstraktní třída¶
Abstraktní třída je třída, která už neslouží k rození instancí, ale jen jako předloha pro dědičnost (vystupuje jako předek). Instance z ní nevznikají.
Třída, ze které instance vznikají, je konkrétní. Konkrétní třídy se vyhledávají jako první (viz kapitola Class); abstraktní třída vzniká až zavedením Generalizace, kdy se vytkne společný předek.
Nejčastější chyby¶
Metoda generalizačního buldozeru. Z toho, že dvě třídy mají shodné atributy, neplyne Generalizace. Nalezená shoda struktury (například obě třídy nesou IČ) se ve většině případů řeší kompozicí — společná část se vloží jako samostatná instance do obou tříd — ne společným předkem. Generalizaci zakládá zástupnost rolí zespodu nahoru, ne shoda atributů.
Hledání Generalizace před Asociací. Vztahy se hledají vždy nejprve jako Asociace; Generalizace se nalézá až poté, když jsou patrné vztahy mezi instancemi.
Míchání úrovní abstrakce. Implementační mapování dědičnosti (varianty do RDB, vícenásobná dědičnost jako technika) patří do Designu a Kódování, ne do analytického modelu (viz kapitola Analytické modelování).
Vazby¶
Generalizace je vedle Asociace druhý vztah modelu tříd; spojuje dvě Class (viz kapitoly Class, Asociace).
Generalizace konceptuálně souvisí s Objektovým paradigmatem — instanci potomka vidíme zvenku jako instanci předka, aniž bychom interakci dědičnosti viděli (viz kapitola Objektové paradigma).
Na Generalizaci stojí složené (COMPLEX) vzory CLM Lite — Heterogenní seznam, Odkaz na vrchol stromu, Diskriminátor, Bridging, Party (viz dále).
Externí kotva: kniha Analytické modelování v praxi, kapitola 3.2.5 Vztah Generalizace. Z UML 2.5.1 (Generalization) se přebírají rysy slučitelné s AM (vztah mezi třídami, dědění struktury, abstraktní třída); nepřebírá se implementační mapování dědičnosti.
Verze a změny¶
- 1.0 — Early Access.