neděle 30. listopadu 2014

Use Case: include vs. extend

Docela dlouho jsem nechápal rozdíl mezi tím, co v use casech označují stereotypy include (někdy také use) a extend.

Nakonec se okamžik prohlédnutí dostavil a v zásadě je to jednoduché. Představme si server pro prohlížení fotografií:

http://yuml.me/edit/acf62d96

Use case Prohlížení fotografií zahrnuje (include)/používá (use) zobrazení jednotlivé fotografie. Všimněte si, že Prohlížení fotografie vyžaduje use case Zobrazení fotografie, nelze prohlížet fotografie bez jejich zobrazení. Zobrazení je část funkčnosti.

Naproti tomu Hodnocení rozšiřuje funkčnost Prohlížení, zjevně lze prohlížet fotografie bez jejich hodnocení.

Všimněme si, že Uživatel má vazbu jen na prohlížení fotografií, nikoli přímo na hodnocení. V opačném případě by také mohlo jít o situaci, kdy Hodnocení zahrnuje (include) Prohlížení. Tady už záleží na tom, jaké chování mají jednotlivé use case přesně vyjadřovat.

Další vztah mezi use case je ještě zobecnění (generalizace). Ta klasicky vyjadřuje variantnost, např. use case Přihlášení může mít varianty:
  • přihlášení jménem a heslem,
  • přihlášení účtem Googlu,
  • přihlášení účtem Facebooku,
  • přihlášení pomocí OpenID.
V tomhle případě je navíc samotné Přihlášení zjevně abstraktní.



Pěkná tabulka porvnání jednotlivých typů mezi use case se dá najít na uml-diagrams.org, na konci stránky v sekci Use Case Relationships Compared. Mimochodem, já si myslím, že autor těch stránek nemá pravdu, když tvrdí, že při vkládání (include) je ta základí (závislá) use case, v našem příkladu Prohlížení fotografií, vždy z principu abstraktní. To že je sama o sobě nekompletní přece nevadí, pořád dává smysl mít její výskyty (instance), koneckonců se vztah vkládání přirovnává k volání podprogramu. A metoda také přece není není abstraktní proto, že volá jinou! Porovnejte to s příkladem Přihlášení.