4 Klasifikace
(Poslední úprava 17.2.96,10.3.96, 24.3.2002)
==================================================================
Obsah kapitoly:
4.1. Význam správné klasifikace.
4.1.1. Klasifikace a OO návrh
4.1.2.Potíže s klasifikací
4.1.2.2. Inkrementální a iterativní povaha klasifikace.
4.2. Identifikace tříd a objektů
4.2.1. Klasický a moderní přístup
4.2.1.1. Klasická kategorizace
4.2.1.2. Konceptuální (pojmové) sdružování (concept = pojem)
4.2.1.3. Prototypová teorie
4.2.2. Objektově orientovaná analýza
4.2.3. Doménová analýza
4.2.4. Jiné přístupy
4.3. Klíčové abstrakce a mechanismy
4.3.1. Identifikace klíčové abstrakce
4.3.1.1. Zjemňování klíčové abstrakce
4.3.2. Identifikace mechanismů.
4.3.2.1. Nalezení mechanismů
4.3.2.2. Příklady mechanismů
4.4. Souhrn kapitoly

===================================================================
Klasifikace je prostředek uspořádání vědomostí. V OO návrhu je to
hledání shodnosti mezi elementy, které umožní stanovení společných
vlastností klíčových abstrakcí a mechanismů. Výsledkem by mělo být
zjednodušení návrhu. Neexistuje návod, jak v OOP dosáhnout dokonalé
klasifikace. V mnoha případech se lze poučit z jiných oblastí života, v
nichž se klasifikace osvědčila.

4.1. Význam správné klasifikace.
(obr.4.1.)
4.1.1. Klasifikace a OO návrh

Identifikace tříd a objektů je nejtěžší část OO návrhu. Vyžaduje
schopnost objevovat i vynalézat. Objevit je třeba klíčové abstrakce
a mechanismy slovníku problémové domény. Vynalézt je třeba zobecněné
abstrakce a takový mechanismus, kterým objekty vzájemně spolupracují.
Klasifikace je důležitá v každé části OO návrhu. Pomáhá identifikovat
zobecnění, specializaci a agregaci hierarchií tříd. Rozpoznáním
společných rysů interakce mezi objekty se usnadní vytvoření mechanismu,
který tvoří jádro implementace. Klasifikace usnadňuje modularizaci.
Různé objekty umisťujeme do téhož modulu na základě určitých společných
rysů. Výsledná spřaženost a soudržnost modulu jsou mírou takové
podobnosti.

4.1.2.Potíže s klasifikací

4.1.2.1. Příklady klasifikace

V historii lze nalézt řadu významných klasifikací, ať již v říši
živočichů, kde Darwin ustavil klasifikační systém zvířat na základě
podobnosti a odlišnosti jejich vnějšího tvaru a chování. Pozdější
klasifikační systémy byly založeny na společných dědičných vlastnostech,
vyjádřených společnou DNA (deoxiribonukleová kyselina). Nejznámějším
klasifikačním systémem v chemii je Mendělejova periodická tabulka prvků.

4.1.2.2. Inkrementální a iterativní povaha klasifikace.

Postupný inkrementální a iterační charakter vývoje je zjevný u tak
různých programových systémů jako je grafické uživatelské rozhraní (GUI
- Graphic User Interface), databázové standardy, a jazyky 4GL.
To se týká i ostatních problémů a aplikací. V prvním kroku se problémy
řeší "ad hoc". Postupné zkušenosti ukazují, že některá řešení jsou lepší
než jiná, vytvářejí srozumitelnější systémy a postupně se jejich použití
ustaluje. Pro zavedený systém se začne vytvářet počítačová podpora. To
umožní vytvářet systémy o třídu složitější. Při řešení stále
složitějších systémů přestane být podpora účinná a začne být nutné
vytvářet nové "ad hoc" přístupy. Cyklus se opakuje.
Inkrementální a iterativní povaha klasifikace se týká také konstrukce
tříd a objektové hierarchie. Na základě postupně rostoucí zkušenosti
dochází k vývoji, kdy vytváříme nové podtřídy z existujících tříd
(odvozování - derivace), rozdělení velkých tříd na několik menších
(faktorizace), nebo vytváření větších tříd z několika menších
(kompozice). Někdy se stane, že objevíme dříve netušené společné
vlastnosti a vytvoříme novou abstrakci - novou třídu.
Klasifikace objektů je obtížná z důvodů stejných jako je obtížná
klasifikace v reálném světě. Existuje tolik "stejně dobrých přístupů,
kolik je řešitelů. Inteligentní klasifikace vyžaduje mimořádné množství
tvůrčího nazírání.

(Obr. 4.2).

4.2. Identifikace tříd a objektů

4.2.1. Klasický a moderní přístup
Problémem klasifikace se v historii zabývalo mnoho filosofů, matematiků,
jazykozpytců a jiných vědců. Obecně se rozeznávají tři obecné přístupy:

 > klasická kategorizace
 > konceptuální sdružování (conceptual clustering)
 > prototypová teorie

4.2.1.1. Klasická kategorizace
říká, že "všechny entity, které mají společnou vlastnost nebo souhrn
společných vlastností vytvářejí kategorii". Tyto vlastnosti jsou
postačující k definici kategorie. Např. osoby vytvářející manželství
konstituují kategorii: každá osoba je buď manželským partnerem a pak
patří do této kategorie, nebo není a pak tam nepatří. Naopak lidé vysocí
nevytvářejí kategorii, pokud nestanovíme kriterium, kdo je a kdo není
vysoký.

Klasická klasifikace vychází z Platonovy a z Aristotelovy klasifikace
rostlin a živočichů, která je podobná známé dětské hře, která má pomocí
maximálně 20 otázek uhádnout konkrétní objekt. Začíná se otázkou: "Je to
živočich, rostlina nebo neživá věc?" Klasický přístup kategorizace
odráží moderní teorie o mentálním vývoji dítěte, kdy okolo 1 roku
začíná dítě nabývat schopnosti klasifikovat jednotlivé objekty jako
balón, pejsek, kočička. Později začíná chápat pojmy jako zvířátka,
hračky ap.

Klasická kategorizace používá hodnocení vlastností podle jejich
existence a neexistence a vytváří tak disjunktní množiny objektů. Minsky
navrhuje, že nejužitečnější jsou vlastnosti, které nemají příliš velkou
interakci, což vysvětluje oblíbené kategorizační vlastnosti jako
velikost, barva, tvar, druh materiálu objektu ap. Protože tyto
vlastnosti navzájem nesouvisí, lze vytvořit různé kombinace.
Vlastnosti objektů se vybírají na základě studia problémové domény. Pro
některé problémy může být barva důležitá, zatímco pro jiné je zcela
bezvýznamná. Proto lze říci, že obecně není žádné schema kategorizace
významnější z pohledu representace struktury nebo řádu reálného světa.
Vždy odráží potřeby, zájmy a přístup osoby, která kategorizaci provádí.

4.2.1.2. Konceptuální (pojmové) sdružování (concept = pojem)

je moderní variace klasického přístupu. V tomto přístupu se shluky
(třídy) generují formulací pojmového popisu a klasifikací entit podle
tohoto popisu. Definujme pojem "zamilovaná písnička"; je to spíše pojem
než vlastnost, protože "zamilovanost" není vlastnost, kterou lze měřit
empiricky. Jestli se však rozhodneme, že některá písnička je spíše
"zamilovaná" než "nezamilovaná", pak ji zahrneme do této kategorie.
Konceptuální sdružování tak representuje více pravděpodobnostní
sdružování objektů.

Tab 4-1 
V tab 4.1  je 10 různých vláčků označených písmeny A
až J. Tyto vláčky (z publikace Stappa a Michalskiho) byly vytvořeny pro
studii konceptuálního sdružování. Podobně jako v reálném životě,
neexistuje "správný" způsob kategorizace. Nejpopulárnější způsob je
kategorizace podle délky vláčku. Jiný způsob zohlední barvu kol
lokomotivy či vagónků. Autoři našli celkem 93 různých způsobů
kategorizace z nichž 40 je zcela jedinečných.

Kromě nejpopulárnějších přístupů však mohou být i neobvyklé, jako např.
dvě skupiny podle toho, zda písmena, která je označují jsou složena
pouze z přímek (A,E,F,H,I) nebo oblouků (B,C,D,G,J). Je to případ
"nelineárního" myšlení, kreativního, ale poněkud bizardního.

Zkusme ale zavést předpoklad, že obsah vozíků ve tvaru kruhu představuje
toxické chemikálie, pravoúhelníky stavební dřevo a ostatní představuje
osoby. Většina lidí, kteří řeší takto stanovený úkol, dělí vlaky na ty,
které vezou toxický náklad a které ho nevezou. Na základ tohoto
předpokladu se rozdělování do tříd změnilo velmi radikálně. Z toho
vyvodit, že více znalostí o problémové doméně je velmi významné pro
dosažení inteligentní klasifikace.

4.2.1.3. Prototypová teorie

Klasická kategorizace a konceptuální sdružování je dostatečně účinné při
hledání klasifikace v běžných případech složitých programových systémů.
Pro některé případy je však tento přístup neadekvátní. Existují
abstrakce, které nemají společné ani vlastnosti ani pojmy. Wittgenstein
tvrdí, že neexistuje jediná skupina vlastností, která by kategorizovala
všechny hry. Přesto, že taková skupina neexistuje, existuje kategorie
"hra", která je sjednocena něčím, co Wittgenstein nazývá "rodinná
podobnost". Všiml si, že kategorie "hra"nemá přesně stanované hranice.
Kategorie může být rozšířena o nové hry za předpokladu, že jsou původním
hrám podobné určitým odpovídajícím způsobem. Proto se tento přístup
nazývá "prototypový". Třída objektů representovaná prototypovým
objektem, a do třídy zahrnujeme nové objekty, když se prototypu podobají
významným způsobem.

Ke kategorizaci přistupujeme nejčastěji s využitím uvedených tří metod
ve vyznačeném pořadí. Nejčastěji používáme pro první přístup klasickou
metodu klasifikace, při níž vycházíme z vlastností entit problémové
domény. Když tento přístup nedává dostatečné výsledky, pokoušíme se o
konceptuální sdružování. Když žádný z uvedených dvou přístupů neuspěje,
pokoušíme se klasifikovat s využitím asociace, která hledá bližší
podobnost prvků, z nichž některý představuje prototypický objekt.

4.2.2. Objektově orientovaná analýza

Hranice mezi aktivitami, které zařazujeme do analýzy problému a
do návrhu systému řešícího daný problém nemají vždy ostrou konturu. V OO
analýze se snažíme modelovat svět identifikací tříd a objektů ze
slovníku problémové domény a v OO návrhu se snažíme vymyslet abstrakce a
mechanismy, které postihují chování podle požadavků modelu.
Shlaer a Mellor navrhují, aby se kandidáti na třídy a objekty odvozovaly
např. od následujících zdrojů:

 > Věci, které jsou hmatatelné - auta, údaje, snímače veličin ap.
 nebo měřitelné entity
 > Role (funkce) - matka, učitel, politik
 > události  -přistání, přerušení, požadavek
 > interakce - půjčka, schůze, průnik

Ross navrhuje následující seznam:
 > lidi - osoby, které mají jistou funkci
 > místa - prostor vyhrazený lidem nebo věcem
 > věci fyzické - (hmatatelné) objekty nebo
 jejich skupiny
 > organizace - formálně organizované skupiny lidí,
 zdrojů, prostředků a kapacit s určeným posláním, jejichž existence závisí
 na jednotlivcích
 > pojmy, principy nebo ideje, které nejsou samy o
 sobě hmatatelné; používají se k organizaci
 nebo ke sledování aktivit a/nebo  komunikace
 > události Věci, které se staly, obvykle v
 souvislosti s něčím, v daném čase, seřazeny
 v určitém sledu

Coad a Yourdon navrhuje takový soubor potenciálních objektů:
 > struktura vztah "druh něčeho" nebo "část něčeho"
 > ostatní systémy externí systémy s nimiž má aplikace interakce
 > zařízení  s nimiž má aplikace interakce
 > pamatované události, historické události, které je nutné uchovávat v paměti
 > místa fyzická místa, lokality, prostory důležité  pro aplikaci
 > organizační jednotky skupiny, do nichž náleží uživatel

4.2.3. Doménová analýza

Zatím co OO analýza se soustřeďuje na daný problém v daném čase,
doménová analýza se zaměřuje ne hledání objektů a tříd typických pro
danou aplikační doménu. Ty jsou společné pro mnoho aplikací z podobné
domény. Doménová analýza vychází z předpokladu, že jen zřídka kdy existují
zcela jedinečné programové systémy a že většinou existuje vždy celá
skupina či třída podobných aplikací, vytvářejících doménu. Doménová
analýza je pak vyhledávání a určování objektů, operací a vztahů, o
nichž se odborník pro danou doménu domnívá, že jsou podstatné. Moore a
Baili navrhují tyto kroky v doménové analýze:

 > Vytvoření kostry generického modelu domény na základě konzultace s
 odborníkem pro danou doménu

 > prozkoumání systémů existujících uvnitř domény a jejich representace
 ve zvolené notaci nebo formátu

 > nalezení podobností a odlišností mezi systémy v doméně

 > zjemnění generického modelu

Doménová analýza může postupovat "vertikálně" - po podobných aplikacích
v dané doméně nebo "horizontálně" po jednotlivých částech dané
aplikace. Navrhujeme-li např. nový monitorovací systém pacienta, je
užitečné zkoumat strukturu stávajícího systému, probrat jeho klíčové
abstrakce a mechanismy, určit, které byly užitečné a využívané a
užitečnost kterých byla sporná.

Doménovým expertem je obvykle kompetentní uživatel, jako např. dispečer
v železniční dopravě, pro návrh kontrolního systému železnice apod.

4.2.4. Jiné přístupy

Existují i jiné přístupy k analýze. Jedním z nich je "neformální popis v
mluveném jazyce" a druhým je "strukturální přístup".
Neformální jazykový popis je triviálně jednoduchý. Poprvé ho navrhl
Abot, který používal jazykový popis ("povídka" - "narrative") k popisu
problému. V popisu podtrhl všechna podstatná jména a slovesa. Podstatná
jména považoval za kandidáty na objekty a slovesa za kandidáty na
operace nad objekty. Tento přístup je velmi užitečný, protože nutí
návrháře pohybovat se ve slovníku problémové domény. Nicméně tato metoda
je velmi nekonvenční a docela slušně funguje jen u problémů s malou
složitostí a rozsáhlostí. Mluvený jazyk je totiž velmi nepřesný nástroj;
navíc z každého podstatného jména lze udělat sloveso a naopak.
Strukturní analýza se často používá pro počáteční stadium OO analýzy.
Existuje řada konstruktérů, kteří ji ovládají a řada CASE nástrojů,
které ji podporují.

Analýza začíná tvorbou základního modelu systému, popsaného tokovými
diagramy dat (data-flow diagram) a ostatními produkty strukturní
analýzy. Tyto diagramy dávají slušně formalizovaný popis systému.
McMenamim a Palmer navrhují začínat s analýzou slovníku údajů a potom
přejít na kontextový diagram modelu. Procházíme-li slovníkem dat,
zamýšlíme se nad každou položkou a hledáme co vyjadřuje. Je-li to např.
"sloveso" ve větě, hledáme které "podstatné jméno" ovlivňuje.
Jedním z přístupů, jak hledat objekty a třídy navrhuje, že kandidáty na
objekty lze hledat resp. odvodit z:
 > externích entit
 > datových struktur
 > řídicích struktur
 > řídicích transformací

Kandidáty na třídy lze odvodit ze dvou zdrojů:
 > toky údajů (data flow)
 > toky řízení (control flow)
Zůstávají datové transformace, které interpretujeme jako operace nad
existujícím objekty nebo jako chování objektů, které jsme určili jako
nositele transformačních datových změn.

4.3. Klíčové abstrakce a mechanismy

4.3.1. Identifikace klíčové abstrakce
Nalezení klíčové abstrakce

Klíčová abstrakce je třída nebo objekt, který tvoří část problémové
domény. Jejich nalezení ohraničuje a vymezuje celý problém. Soubor
klíčových abstrakcí podtrhuje relevantní chování a smysl systému a
potlačuje nepodstatné elementy. Odpovídající volba klíčových abstrakcí
závisí na specifice problému a na "granularitě" - tedy úrovni, na které
systém zkoumáme. Klíčové abstrakce získáváme dvěma postupy: objevením a
vymyšlením. K objevení dojde obvykle v konsultaci s doménovým
odborníkem. Vymyšlené abstrakce jsou nové třídy a objekty, které nejsou
obvykle skutečnými a viditelnými součástmi domény, ale jsou to užitečné
součásti návrhu systému. Uživatel, který používá bankomatový přístroj
používá klíčové abstrakce jako "heslo", "číslo úctu", "velikost výběru"
a "zůstatek", zatímco konstruktér programového systému musí vymyslet
abstrakce jako "databáze", "správce obrazovky" atd. Tyto pojmy jsou z
pohledu domény umělé elementy konkrétního návrhu a nepatří do ní.

4.3.1.1. Zjemňování klíčové abstrakce
Nalezenou klíčovou abstrakci musíme vyhodnotit podle pravidel uvedených
v předcházejících kapitolách. Konstruktér se musí zamýšlet nad otázkami
jako: "jak se vytvářejí objekty takové třídy?", "lze je kopírovat a
destruovat?" "jaké operace nad nimi mohou být definovány?". Nejsou-li
odpovědi na podobné otázky jasné, je vhodné o problému dál uvažovat, a
nepokoušet se hned o tvorbu objektů jejich kódováním.
Když zkoumáme novou abstrakci, musíme ji umístit do kontextu
existujících tříd a třídní hierarchie. To není ani přístup "shora-dolů"
ani "zdola-nahoru". Velmi zřídka se postupuje u návrhu tak, že se
vytvoří "supertyp" a ten se dekomponuje na "podtypy". Nejčastěji se
vytvářejí souběžně typy odpovídající problémové doméně a pak se hledají
jejich hierarchické a třídní vazby.
Umístění třídy či objektu na správnou úroveň abstrakce není snadné.
Někdy nalezneme velmi obecnou podtřídu a budeme uvažovat o jejím posunu
směrem k vyšší abstrakce - tomu se říká "povýšení třídy" (class
promotion". Jindy shledáme, že třída je příliš obecná, a mezi ní a
podtřídou je velká mezera, takže jsou problémy s dědičností - tomu se
říká "grainsize conflict" (konflikt ve velikost stavebních granulí
tříd).

Při tvorbě nových objektů, tříd a mechanismů musíme dbát na to, aby
jejich pozice a funkce v navrhovaném systému byla vždy dostatečně
srozumitelná. S tím souvisí i navrhované identifikátory objektů, tříd a
operací. Objekt by měl mít identifikátor např. v jednotném čísle, aby
označoval určitý objekt (v anglickém jazyce s členem, např. TheSensor,
AShape). Třída by mohla mít jméno postihující celou skupinu např.
Snimace, Tvary (Sensors, Shapes). Někdy se používají systematické
předpony identifikátorů určitých elementů programu jako T pro typy,
P pro ukazatele, O pro objekty, C pro třídy.

4.3.2. Identifikace mechanismů.

4.3.2.1. Nalezení mechanismů

Podobně jako v Jacsksonově vývojové metodě (Jackson System Development -
JSD) se v OO návrhu napřed vyhledají klíčové abstrakce. Teprve potom se
přidává chování jednotlivých abstrakcí, která rozšiřují chování celého
systému. Mechanismem zde nazýváme, v souhlasu s předchozí kapitolou,
libovolnou strukturu, která zajišťuje, že objekty spolupracují pro
zajištění jistého chování, vyhovujícímu požadavkům na práci celého
systému.

Vezměme si příklad z automobilu. Stisknutí pedálu plynu způsobí
rychlejší chod motoru a jeho uvolnění způsobí zpomalení motoru. Čím je
to způsobeno, to řidiče vůbec nezajímá. Je možno vytvořit několik
mechanismů a výběr toho pravého závisí na konstruktérovi. V naše případě
lze:
 > použít mechanického propojení plynového pedálu s karburátorem
 > elektronické spojení tlakového snímače pod pedálem s ovládáním
 karburátorové klapky (a drive-by-wire mechanism)
 > neexistuje žádné vzdálené ovládání; pedál přímo ovládá klapku či
 ventil v potrubí paliva, které teče samospádem z nádrže umístěné na
 střeše automobilu do karburátoru; pedál ovlivňuje průtok paliva.
Volba mechanismu může záviset na řadě faktorů, které konstruktér
zvažuje, ať již je to cena, spolehlivost, obtížnost výroby, bezpečnost
apod.

Zatímco objekty vytvářejí slovník problémové domény, mechanismy vytvářejí
podstatu návrhu. Konstruktér musí zvažovat nejen návrh jednotlivých tříd
ale i způsobů, kterým budou objekty těchto tříd vzájemně spolupracovat.
Každé jednotlivé rozhodnutí o mechanismu se dotýká řady ostatních
objektů. Proto má rozhodnutí o mechanismech velmi často přímo
strategický význam. Podobně strategický význam má rozhodnutí o struktuře
třídy; naopak rozhodnutí o rozhraní třídy má menší - taktický význam v
daném procesu návrhu.

4.3.2.2. Příklady mechanismů
Představme si jeden z častých mechanismů - kreslicí mechanismus
používaný v grafických uživatelských rozhraních (GUI). Zde spolupracuje
při vykreslení celého obrazu několik objektů: okno, pohled, model a
nějaký klient, který určuje kdy (ale neví jak) zobrazit tento model.
Napřed klient sdělí oknu, aby se samo zobrazilo. To sestává z několika
dílčích částí (subviews) a proto okno sdělí jednotlivým podoknům aby
se postupně zobrazila. Každé podokno sdělí svému modelu, aby se zobrazil
s tím, že nakonec se zobrazí i model určený uživateli. V tomto případě
je model zcela vyčleněn z okna a z jeho podoken. Pohledy (podokna) mohou
zasílat zprávu modelu, ale model nemůže zasílat zprávu pohledům.
Smalltalk používá velmi podobný mechanismus, nazývaný "model-view-
controller" (MVC).
Mechanismus tak representuje jinou úroveň znovupoužití návrhu, vyšší, než
znovupoužití jednotlivých tříd. Mechanismus MVC je např. základem pro
rozhraní se kterým pracuje Smalltalk. Princip MVC je postaven na jiném
mechanismu, kterému se říká "mechanismus závislosti", který je vestavěn
jako chování bázové třídy Smalltalku - třídy "object". Tento mechanismus
proniká celou knihovnou tříd Smalltalku.
Příklady mechanismu najdeme ve strukturách operačních systémů, v
souvislosti s jeho mechanismem ovládání programů. Určitý návrh systému
může být monolitický (jako MS DOS) nebo může využívat jádra (kernel)
jako Unix, nebo procesní hierarchii (jako operační systém THE). řada
zajímavých mechanismů byla vytvořena v souvislosti s umělou inteligencí.
Jedním z velmi známých mechanismů je mechanismus černé tabule", v níž
jednotlivé zdroje znalostí nezávisle na sobě aktualizují tabuli. Zde
neexistuje žádné ústřední řízení, ale každá změna na tabuli může
spouštět jinou akci, která zkoumá a řídí nový problémově orientovaný
proces.

4.4. Souhrn kapitoly

> Identifikace tříd a objektů je základní činností OO návrhu;
identifikace nejčastěji vychází z objevení a z vynalezení.
> Klasifikace je principiálně problém sdružování
> Klasifikace je inkrementální a iterativní proces. Potíže s klasifikací
spočívají ve skutečnosti, že může být provedena velkým množstvím různých
a podobně správných způsobů.
> Jsou známy tři základní způsoby klasifikace: klasická kategorizace
(podle vlastností), konceptuální sdružování (klasifikace na základě
pojmů) a prototypová teorie (sdružování na základě asociace s
prototypem).
> Objektově orientovaná analýza navrhuje, aby se kandidáti na třídy a
objekty odvozovaly z hmatatelných věcí, z rolí, událostí a z interakcí.
> Doménová analýza se snaží identifikovat třídy a objekty, které jsou
společné pro podobné aplikace v dané doméně nebo pro části dané
aplikace.
> Klíčové abstrakce vycházejí ze slovníku problémové domény a mohou být
objeveny v této doméně nebo mohou být vytvořeny jako součást návrhu
> Mechanismy představují základ návrhu a representují ta základní
strategická rozhodnutí o návrhu, která se týkají vzájemných
spolupracujících aktivit různých druhů objektů.