Kdy použít v Use Case Diagramu vztah Extend a kdy Include (část 3)

U jednoho z předešlých článků se objevil jeden natolik důležitý komentář, že jsem se rozhodl odpovědět na něj přímo tímto článkem.

Cituji daný komentář:

Dobrý den, přečetl jsem si Váš článek “Kdy použít v Use Case Diagramu vztah Extend a kdy Include, 2. část” a trochu mne zarazil Váš komentář na konci: Příklad chybného použití vztahu Extend, kde pro případ prohlížení seznamu osob můžeme vyvolat případ užití “Založení nové osoby”. V článku tvrdíte, že se jedná o vztah “Include” nikoliv “Extend”. Měl jsem představu, že rozdíl mezi “Include” a “Extend” je “musí” a “může”. Tj. případ užití “Založení nové osoby” může, ale nemusí být použit a je to tedy vztah typu “Extend” – rozšiřuje možnosti prohlížení seznamu. Vztah “Include” by naznačoval nutnost vložení nové osoby?

Rozlišování mezi interakcí Extend a Include pomocí situací obsluha „může“ a „musí“ patří k nerozšířenějším mýtům ohledně těchto dvou interakcí. Ono totiž rozlišování pojmů „může“ a „musí“ je poměrně dost zavádějící a dva by se mohli hádat, zda obsluha „může“ nebo „musí“.

Rozeberme si blíže onu zajímavou část scénáře daného případu užití, označme si tento případ užití jako UC X:


Obsluze se zobrazí seznam osob.

Obsluha vybere osobu.

Pokud obsluha danou osobu v seznamu nenalezne, obsluha může přidat novou osobu, viz UC Založení nové osoby

Všimněme si dvou podstatných skutečností:

  1. Ve scénáři se sice používá formulace „může“, ale z hlediska dalšího chodu scénáře je za tímto slovem schováno vlastně „musí“, protože pokud chce obsluha pokračovat ve scénáři dále, musí založit novou osobu. Pokud nezaloží novou osobu, scénář končí. Formulace „může“ je zde pouze o tom, že obsluha se rozhoduje, zda ve scénáři pokračovat dále (a přitom využije a vyvolá se UC Založení nové osoby) anebo ne.
  2. Ve scénáři se přímo a natvrdo oslovuje případ užití UC Založení nové osoby a takto se to projeví přímo i v technologickém návrhu (například jako tlačítko s textem „Přidat novou osobu“ pod zobrazeným seznamem osob). Znamená to, že je zde přímá závislost od volajícího případu užití X k volanému případu užití Založení nové osoby. To se projeví až do technologie: Za tlačítkem „Přidat novou osobu“ je uschováno volání nějaké metody z modulu osob (např. Form_New_Person.Show() apod.). Z tohoto titulu si zde vystačíme s interakcí Include (což je správně) a není třeba zavádět interakci Extend (což není dobře, to vyjadřuje něco jiného).

Pro rozlišení vztahů Include a Extend je důležitý směr závislosti. Cituji z dokumentu specifikace UML 2.4.1, kapitola 16.3.3. Extend (str. 601), zdůrazňuji tučně důležité pasáže:

A relationship from an extending use case to an extended use case that specifies how and when the behavior defined in the extending use case can be inserted into the behavior defined in the extended use case.

This relationship specifies that the behavior of a use case may be extended by the behavior of another (usually supplementary) use case. The extension takes place at one or more specific extension points defined in the extended use case. Note, however, that the extended use case is defined independently of the extending use case and is meaningful independently of the extending use case. On the other hand, the extending use case typically defines behavior that may not necessarily be meaningful by itself. Instead, the extending use case defines a set of modular behavior increments that augment an execution of the extended use case under specific conditions.

It is a kind of DirectedRelationship, such that the source is the extending use case and the destination is the extended use case. It is also a kind of NamedElement so that it can have a name in the context of its owning use case. The extend relationship itself is owned by the extending use case.

Z uvedeného je jasné, že v našem případě se nejedná o Extend, ale o Include, protože náš scénář případu užití X používá přímo a natvrdo UC Založení nové osoby. Není zde žádný „háček“, ke kterému by se pro UC X neznámý (přímo neoslovený) extendující UC zaháčkoval a nechal se nepřímo (dynamicky) vyvolat, aniž by UC X věděl, koho vlastně v bodě Extension Point vyvolává.

Pokračování následuje


Uveřejněno

v

od

Značky:

Komentáře

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *