====== Diagram tříd - Class Diagram ====== Úkolem diagramu tříd je dekompozice problému do dílčích částí reprezentovanými třídami. === Krok 1: Identifikace tříd === Nejprve je potřeba vytvořit třídy odpovídající aktorům a užitím z diagramu užití. Každá třída má nějaké **vlastnosti** (např. //osoba// má //jméno//) a **metody** (u //osoby// může být volána metoda //getJmeno()//). Vlastnosti a metody mají definovánu **viditelnost**: * private (označeno **-**) - viditelné pouze pro konkrétní třídu * protected (označeno **#**) - viditelné pro třídu a všechny třídy z ní zděděné * package (označeno **~**) - viditelné pro třídy v témže balíčku * public (označeno **+**) - viditelné pro všechny Obecně platí, že viditelnost by měla být ta nejpřísnější možná. {{:courses:a4m33nms:cviceni:class00.png|}} === Krok 2: Hierarchické vazby === V dalším kroku je vhodné do class diagramu vložit **hierarchické** vazby - musí odpovídat diagramu užití {{:courses:a4m33nms:cviceni:class01.png|}} === Krok 3: Vazby mezi třídami === Dále identifikujeme vazby mezi objekty. Tyto vazby označujeme jako **asociační**. Vazba může být směrová/orientovaná (je "důležitější spíše" v jednom směru); označena čarou s nevyplněnou šipkou; nebo nesměrová/neorientovaná (pouze čára). U asociace by měla být definována **multiplicita** (na každé straně). {{:courses:a4m33nms:cviceni:class02.png|}} Speciálním případem asiciační vazby je vazba, která má definovány nějaké další vlastnosti, popřípadě metody. Takovou vazbu realizujeme asociační třídou (např. //diplomka//). {{:courses:a4m33nms:cviceni:class03.png|}} === Krok 4: Je asociace pouze asociace? === Asociace volně svazuje třídy. Mnohdy je ale potřeba naznačit, že vazba označuje vztah "podřazenosti" tříd, např. instance jedné třídy jsou (jednou z) částí třídy druhé. //Auto// má 4 //kola//, //Profesor// vede //přednášky//. Mnohdy instance konkrétní třídy má zasadní podíl na (kvalitativních) parametrech celku (//Osoba// má //Srdce//). Takouvou asociaci označujeme jako **agregaci**, označujeme ji přidáním prázdného kosočtverce. {{:courses:a4m33nms:cviceni:class04.png|}} Z programátorského hlediska, třídy spojené aggregační vazbou musí být instancovány nejpozději v průběhu volání konstruktoru "nadřazené" třídy. === Krok 5: Je agregace pouze agregace? === Speciálním případem agregace je **kompozice**. Ta navíc udává, že instance obou tříd tvoří nedělitelný celek, jedna bez druhé nemá smyslu. V našem případě, //Osoba// bez //Srdce// má natolik omezenou funkcionalitu, že uvažování takové kombinace je bezpředmětné. Kompozice znemožňuje u instancované třídy provést změnu třídu nadřazené, deskrukce instance jedné třídy vede k destrukci instance(í) třídy druhé. Kompozici značíme na čáře plným kosočtvercem . {{:courses:a4m33nms:cviceni:class05.png|}} Rozdíl mezi agregací a kompozicí je patrný z následujícího příkladu: //Auto// má 4 //Kola//. Ta ale můžu vyměnit a pořád auto zůstane autem. //Kola// jsou součástí //Auta//, auto bez kol má omezenou funkcionalitu (tedy auto kola mít musí). To je agregace... //Auto// musí mít i //motor//. Krom toho, pokud je motor zničen např. provozem, celý celek //Auto// má zásadně omezenou funkcionalitu, toto omezení znemožňuje funkcionalitu celého celku. Parametry motoru zásadně ovlivňují parametry auta. Zlikvidujeme-li auto, zlikvidujeme i motor (a obráceně) - proto kompozice. {{:courses:a4m33nms:cviceni:class05b.png|}} === Krok 6: Interakce s okolím, další vazby === Součástí diagramu tříd jsou i rozhraní, vazby typu používá, atd. Tyto vazby se označují přerušovanou čarou. {{:courses:a4m33nms:cviceni:class06.png|}} === A je to teď dobře? === Záleží na úhlu pohledu... Diagram není úplně správně, nalezení nedokonalostí však ponechám na Vás. Klíč pro hledání: nemohu o tom říci více?