Class diagram - diagram tříd

Zobrazuje statickou strukturu systému.

class diagram, 7 kB

Na obrázku je příklad class diagramu z naší půjčovny videokazet. :

  • zákazník může mít vypůjčených žádnou, jednu nebo více kazet (řečeno pomocí "*" na konci asociace u CKazeta )
  • kazetu může mít zapůjčenu žádný nebo jeden zákazník (řečeno pomocí "0..1" na konci asociace u Zákazník)
  • Kazetu (resp. film) režíroval právě jeden režisér
  • protože asociace mezi zákazníkem a kazetou musí mít vlastní atributy (musí si pamatovat datum výpůjčky a datum kdy by měla být kazeta vrácena), zavedli jsme asociativní třídu Výpůjčka

Syntaxe atributu

všechny složky, které může obsahovat atribut :
viditelnost jméno násobnost : typ hodnoty="implicitní hodnota"
      kde :
  • viditelnost : nepovinná část; definuje, odkud bude atribut viditelný a přístupný :

    -  soukromý (private)jen uvnitř třídy
    +veřejný (public) ze všech tříd
    #chráněný (protected) uvnitř třídy a jejich potomků
    ~balíček (package) jen z elementů uvnitř balíčku (ve kterém je tato třída) a z vnořených balíčků

  • jméno : povinná část; doporučení : dlouhá jména takto : dlouheJmeno
  • násobnost : nepovinná část; pro určení polí (např. bydliště [4] : String znamená, že bydliště je složeno z pole 4 řetězců, název[1..3] znemaná, že název je pole jednoho až tří řetězců), nebo nullability (RČ[0..1]: String značí : rodné číslo může a nemussí být vyplněno, příjmení[1] značí, že příjmení musí být vyplněno)
  • typ hodnoty : nepovinná část, většinou začíná velkým písmenem
  • "implicitní hodnota" : nepovinná část; tuto hodnotu získá atribut ihned po vzniku instance (použitelné pro inicializaci atributů objektu)
Kromě toho se samozřejmě i na atributy vztahují standardní mechanismy - mohou mít stereotyp, omezení, označené hodnoty.
Příklady :
  • jméno
  • jméno : String
  • -národnost : String="česká"
  • : když nebude explicitně uvedeno jinak, tak národnost bude česká
  • +kuřák : String {Ano, Ne} : atribut kuřák může nabývat jen hodnot "Ano" nebo "Ne"
  • <<optimalizace>> součet : int {důvod = jelo moc pomalu, dne = 6.5.2005} : má stereotyp a dvě označené hodnoty
  • početOsob : int
  • : třídní proměnná, celotřídní atribut

Syntaxe metody

všechny složky, které může obsahovat metoda :
viditelnost jméno (názevArgumentu: typArgumentu=základní hodnota, ....): návratový typ
      kde :
  • viditelnost : stejná pravidla jako u atributu
  • jméno : stejná pravidla jako u atributu
  • základní hodnota : pokud určitý argument není v rámci volání metody vůbec předán, nastaví si jeho hodnotu na implicitní základní hodnotu volaná metoda sama
  • návratový typ : nepovinná část, typ návratové hodnoty
Kromě toho se samozřejmě i na metody vztahují standardní mechanismy - mohou mít stereotyp, omezení, označené hodnoty.
Příklady :
  • inkrementuj()
  • -zvětšiSe(procento: int)
  • +nastavVěk(věk: int = 18) : nastaví věk na předanou hodnotu, pokud není nic předáno, pracuje tak jako by bylo předáno 18
  • +zjistiProspěch(RČ: String) : String {prospěl s vyznamenáním, prospěl, neprospěl} : jako výsledek metody může být vráceno jen prospěl s vyznamenáním, prospěl nebo neprospěl
  • <<optimalizace>> sečti(): int {důvod = jelo moc pomalu, dne = 6.5.2005} : má stereotyp a dvě označené hodnoty
  • zjistiPočet: int : třídní metoda, celotřídní metoda

Signatura metody

Každá metoda (ze všech metod jednoho objektu) musí mít jedinečnou signaturu, aby bylo jednoznačné, která metoda objektu má být spuštěna. Signaturu tvoří
jméno metody, typy všech předávaných parametrů a typ návratvé hodnoty.
Tzn. že třída může mít současně všechny tyto metody :
  • zvětšiMnožství()
  • zvětšiMnožství(koho: int)
  • zvětšiMnožství(koho: String)
  • zvětšiMnožství(koho: String, kdy: Date)
  • zvětšiMnožství(koho: String, kdy: Date) :int
  • zvětšiMnožství(koho: String, kdy: Date) :String
Každá z výše uvedených metod má jinou signaturu, tedy všechny tyto metody mohou současně existovat v jediném objektu : podle signatury použité při volání metody lze vždy jednoznačně určit, která metoda má být spuštěna.

Relace (relationship) v diagramu tříd

Relace mezi dvěma (popř. více než dvěma) třídami jsou asociace.
Příklad asociace :
asociace, 6 kB
  • název asociace
  • říká, jak máme vztah číst, trojúhelníček udává směr čtení : muž je otcem ženy; směr čtení můžeme i obrátit, ale pak si musíme odpovídajícím způsobem upravit název vztahu : žena je dcerou muže
  • název role
  • vyjadřuje, jaké role objekty daných tříd hrají, když jsou spojeny instancí této asociace; zde muž má roli otce, žena má roli dcery; vidíme zde redundanci - názvy rolí nám v podstatě říkají to stejné co názvy asociace : a skutečně, v praxi se používá u konkrétní asociace buď její název, nebo názvy rolí, použití obojího současně je nadbytečné
  • násobost (multiplicity)
  • udává, jaký počet objektů se v libovolném okamžiku účastní vztahu; zde :
    • muž má libovolný počet dcer (žádnou dceru, jednu dceru nebo více dcer)
    • žena má vždy jednoho otce
    • žena ovšem může otce v čase měnit (např. dítě adoptuje jiný muž, ten se tak stane otcem dítěte, původní otec už není jeho otcem), žena však vždy musí mít právě jednoho otce (že muž může zemřít, nebo že otec může být "neuvedený", náš model jaksi nezohledňuje)
    Násobnost se udává ve tvaru minimum..maximum, popř. přesná hodnota nebo hodnota1, hodnota2, hodnota3 či kombinací všeho. Není-li násobnost vyjádřena, pak je neurčitá - zde žádná implicitní hodnota (např. 1) neexistuje.
    Syntaxe násobnosti :
    1přesně jedna
    0..1nula nebo jedna
    *nula nebo více
    0..*nula nebo více
    1..*jedna nebo více
    2..8dva až osm
    4..8, 14..18, 20, 22, 24, 30..* od čtyř do osmi nebo od čtrnácti do osmnácti nebo dvacet nebo dvacet dva nebo dvacet čtyři nebo třicet a více
  • řiditelnost (navigability) určuje, že objekt zdrojové třídy vidí objekt cílové třídy, že mu může poslat zprávu. Objekt z cílové třídy na objekt zdrojové třídy nevidí, neví o něm a nemůže mu poslat zprávu.
    V našem modelu otec zná všechny své dcery a kterékoliv dceři může poslat zprávu, ale dcera o svém otci neví (nemůže mu poslat zprávu).
    Relace bez šipek je obousměrná (jakoby šipky byly na obou koncích), tj. objekty na sebe navzájem vidí a mohou si posílat zprávy.

Náměty na další studium

  • třídní proměnná, třídní metoda, konstruktory, destruktory
  • reflexivní (rekurzivní) asociace
  • vylučovací asociace
  • seřazená asociace
  • n-ární asociace
  • modelování hierarchií a sítí
  • asociace jako pseudoatribut
  • kvalifikátor
  • závislosti, standardní typy závislostí, standardní stereotypy závislostí
  • rozhraní
  • agregace, kompozice
  • vnořené třídy
  • šablony, vzory
  • zvláštní typy generalizací (přesahující, rozpojená, hotová, nehotová)
  • realizace
  • odvozený atribut, odvozená asociace
  • omezená asociace
  • interface
  • balíčky