Grady Booch: Object Oriented Design with Applications
Rational
The Benjamin/Cummings Publ. Company,Inc., 1991
ISBN 0-8053-0091-0

(Text aktualizován podle stejnojmenné knihy ve druhém vydání )
Grady Booch: Object Oriented Design with Applications
Rational
SantaClara, California
Addison Wesley, 1994
ISBN 0-8053-5340-2
---------------------------------------------------
Pozn: Většina pozorovatelných změn se týká přepisu příkladů s využitím jazyka C++.

1. Složitost
 (Poslední úprava 3.3.2000)

Obsah kapitoly
1.1. Vrozená složitost programu
1.1.1. Vlastnosti jednoduchých a složitých systémů
1.1.2. Proč je software složitý ze své podstaty
1.1.2.1. Složitost problémové domény
1.1.2.2. Složitost zvládnout proces vývoje a tvorby programu
1.1.2.3. "Tvárnost" daná programovými vlastnostmi produktu
1.1.2.4. Problémy charakterizujícími chování diskrétních systémů
1.1.3.Důsledky nekontrolované složitosti
1.2. Struktura složitých systémů
1.2.1.Příklady složitých systémů:
1.2.1.1. Struktura rostlin a živočichů
1.2.1.2. Struktura hmoty
1.2.1.3. V sociálním systému
1.2.2. Pět atributů složitého systému
1.2.3 Organizovaná složitost
1.3. Vnesení řádu do chaosu.
1.3.1. Role Dekompozice.
1.3.2. Role abstrakce
1.3.3. Role hierarchie
1.4. Navrhování složitých systémů
1.4.1. Inženýrství jako věda a jako umění
1.4.2. Význam návrhu
1.4.2.1. Použití modelů
1.4.2.2. Nástroje a prvky návrhových metod
1.4.2.3. Modely OO návrhu
1.5. Souhrn kapitoly:

1. Složitost
1.1. Vrozená složitost programu

1.1.1. Vlastnosti jednoduchých a složitých systémů
====================================================
Hvězda v kolapsu, dítě učící se číst a buňka bílé krvinky útočící na
virus, jsou tři objekty světa. Každý z nich je děsivě složitý. Einstein
tvrdil, že každé vysvětlení přírody musí být jednoduché, protože Bůh
není ani ješitný ani panovačný. Programátoři však nejsou tak
důvěryhodní. Většina složitosti, kterou programátor musí zvládnout není
omezená.

Existují skutečně jednoduché systémy. Jsou to vesměs opomenutelné
aplikace specifikované, vytvořené a udržované stejnou osobou, amatérem,
nebo isolovaným profesionálem.

Komplexní, profesionálně využívané programy, používané mnoha různými
uživateli, programy, které musí vykazovat vysokou spolehlivost,
robustnost s funkční správnost budeme nazývat "průmyslové programy".
Tím je odlišíme od programů, na jejichž funkci tak moc nezáleží. jejich
charakteristikou je, že většinou není možné, aby takový program vytvořil
jednotlivec. Ne, že by takový génius nemohl existovat. Géniů je však
málo a není důvod k tvrzení, že v programování jich je více než v jiných
oblastech činnosti.

1.1.2. Proč je software složitý ze své podstaty ?

Podle Brookse (Mythical Men-month) je složitost programů věcí zákonitou
a ne náhodnou. Složitost software vychází ze čtyř příčin:

•	složitost problémové domény

•	složitost zvládnout proces vývoje programu

•	"tvárností" danou programovými vlastnostmi produktu

•	problémy charakterizujícími chování diskrétních systémů

1.1.2.1. Složitost problémové domény

Již samostatný problém - elektronický systém letadla, telefonní systém,
autonomní robot - to jsou již dostatečně složité systémy. K nim se
přidávají požadavky, jako snadná použitelnost, výkonnost, cena,
dlouhodobá životnost, udržovatelnost atd. je to složitost dalších
dimenzí problému které tvoří složitost celého systému neomezenou.
Složitost vyplývá ze špatné komunikace mezi zadavateli a řešiteli.
Zadavatel nejčastěji nedovede vyjádřit a specifikovat své potřeby.
Nejčastější formou je hromada textu s několika schématy či obrázky, což
vede snadno k různým interpretacím.

Velmi často se původní zadání mění v průběhu vývoje. Protože náklady na
vývoj software jsou vysoké, není možné zrušit vše co je již vyvinuto,
když se změní zadání. Proto má údržba programu kardinální postavení v
životopisu programu. Přesněji:

•	údržbou označíme odstraňování chyb

•	vývojem nazveme změny v programu reflektující změny v zadání

•	záchovou nazveme proces snažící se speciálními prostředky uchovat
 přestárlý program ve funkci

 1.1.2.2. Složitost zvládnout proces vývoje a tvorby programu

Základním cílem tvorby software je udržet dojem pro uživatele, že
program je jednoduchý. Většinou se této vlastnosti říká "user
friendliness" - uživatelský komfort. Každý rys této vlastnosti stojí
obrovské množství programových řádků. Před 20 lety byl rozsah programu
omezen několika tisíci řádků v assembleru. V současné době nejsou
výjimkou stovky tisíc či milióny zdrojových řádků. Takový kolos
nezvládne žádný jedinec! I když program rozdělíme na menší části,
dostaneme stovky a někdy tisíce malých modulů. Takový problém vyžaduje
tým řešitelů - ideálně tak malý tým, jak jen je možné. Hlavním úkolem
vedoucího týmu je udržet jednotnost a integritu celého návrhu.

1.1.2.3. "Tvárnost" daná programovými vlastnostmi produktu

Většina výrobců nevytváří sama nástroje, pomocí nichž vyrábí. Software
je však tak tvárný, že svádí mnohé programátory k touze vytvářet své
vlastní nástroje. Zatím co v průmyslu existuje jednotnost a normy pro
nástroje, které mohou zaručovat kvalitu výsledného produktu, v oblasti
software je to řídkým jevem.

1.1.2.4. Problémy charakterizující chování diskrétních systémů

Parnas říká:".. říkáme-li, že systém je popsán spojitými funkcemi, říkáme
tím, že systém neobsahuje žádná skrytá překvapení. Malé změny na vstupu
způsobí odpovídající malé změny na výstupu". To se nedá říci o
diskrétních systémech. Diskrétní systémy mají konečný počet svých
stavů; ve velkých systémech to vede kombinatoricky k velkým počtům
stavů. Proto se snažíme vytvářet systémy s oddělením vlivů tak, aby
chování jedné části mělo minimální vliv na chování jiného. Nicméně,
přechod z jednoho stavu do druhého nelze modelovat spojitě. Každý vnější
jev je potenciálním původcem změny stavu systému. V nejhorším případě
může vnější systém vést ke zhroucení systému. Představme si letadlo,
jehož letová dráha a prostředí kabin jsou ovládány jediným počítačem.
Pak se může eventuálně stát, že si pasažér rozsvítí žárovku na sedadlem
a důsledkem toho se letadlo uvede do vývrtky. Ve spojitých systémech by
se něco podobného nestalo, ale v diskrétních systémech může každá vnější
událost potenciálně ovlivnit vnitřní stav systému. Protože nemáme ani
matematické nástroje ani intelektuální kapacitu k modelování kompletního
chování velkých diskrétních systému, musíme používat speciálních postupů
a metod a přijímat určité hladiny důvěry s ohledem na správnost chování
takového systému.

1.1.3.Důsledky nekontrolované složitosti

Zřídkakdy se stane, že se stavitel rozhodne vybudovat další sklepní
úrovně 100 poschoďové budovy. Bylo by to drahé a riskantní. S podivem
lze sledovat, že v oblasti software nejsou podobné akce výjimkou.

Nejčastějšími důsledky složitosti jsou:
•	zpoždění dokončení projektu
•	nedodržení plánované ceny
•	nedodržení plánovaných požadavků

Podobné jevy se spojují s pojmem "softwarová krize". Jedním z řešení
této situace je studium chování a organizace složitých systémů v jiných
oblastech lidské činnosti. Opravdu najdeme dosti příkladů dobré
organizace rozsáhlých a složitých systémů. Některé systémy jsou dílem
člověka (kosmoplán, tunel pod kanálem La Manche, obchodní organizace
jako IBM apod),  jiné jsou dílem přírody jako lidský oběhový systém nebo
struktura rostliny.

1.2. Struktura složitých systémů

1.2.1.Příklady složitých systémů:

•	počítač
•	živá příroda
•	neživá příroda
•	společnost

Personální počítač

je systém střední složitosti. Počítač je sestaven z několika
samostatných prvků jako CPU, monitor, klávesnice, pevný disk, disketová
jednotka. Každou z uvedených jednotek lze dále dekomponovat na prvky na
nižší úrovni. Vidíme, že složitější soustava má hierarchickou strukturu.
Počítač pracuje správně, protože je spolupráce jeho jednotek správná.
Chování každé jednotky můžeme studovat izolovaně od ostatních. Každá
úroveň v hierarchii představuje určitou úroveň abstrakce. Jedna úroveň
staví na druhé a každá je pochopitelná sama o sobě. Při řešení problému
volíme úroveň hierarchie. Chceme-li sledovat časové závislosti signálů v
paměti, můžeme sledovat výstupy odpovídajících hradel. Tato úroveň
abstrakce je neadekvátní pro hledání chyby v aplikaci typu tabulkový
procesor.

1.2.1.1. Struktura rostlin a živočichů

je studována již po staletí. Botanici, biologové studují jejich
morfologii - tj. tvar a strukturu. Rostlina je složitý mnohabuněčný
organismus. Ze spolupráce skupin buněk vzniká tak složité chování jako
je fotosyntéza nebo vypařování. Rostlina sestává ze základních částí -
kořen, stonek, listy. Každá část má opět své podčásti s danou
strukturou. Podobně jako na počítači nalezneme hierarchickou strukturu.
Prvky na každé úrovni hierarchie velmi úzce spolupracují. Kořeny
absorbují vodu a minerály, stonek dopravuje tento materiál do listů,
listy provádějí fotosyntézu z vody a minerálů. Každá úroveň hierarchie
má jasně vytvořenou hranici, oddělující ji od jiné úrovně. Přesto lze ve
všech úrovních najít podobné stavební principy - buňky. Při studiu
morfologie buňky nenajdeme individuální části, které by byly zodpovědné
za byť malý, samostatný krok ve jednom rozsáhlejším procesu, jakým je
třeba fotosyntéza. Nenajdeme zde centrální část, která by přímo řídila
činnost na nižších úrovních. Místo toho najdeme oddělené části, které
mají složité chování a přispívají do mnoha vyšších úrovní. Vyspělé
chování rostliny je dáno vzájemnou spoluprací skupin takových elementů.
Živočich je také mnohabuněčný organismus. V jeho hierarchické struktuře
vytvářejí skupiny buněk pleteně, pleteně vytvářejí orgány, skupiny
orgánů vytvářejí systém (např. zažívací) atd. Všimněme si úsporných
vyjadřovacích prostředků přírody. Živočichové i rostliny jsou postaveny
z buněk, i když je mezi nimi rozdíl. Rostlinné buňky jsou obaleny tuhými
celulózovými stěnami, zatímco živočišné nejsou. Přesto zůstává buňka
společným rysem výstavby živé přírody. Existují i jiné jevy společné pro
živočichy i rostliny, jako je cévní dopravní systém, rozlišení pohlaví u
jedinců téhož typu ap.

1.2.1.2. Struktura hmoty

má společné rysy na galaktické i nukleární úrovni. Charakteristickým
rysem je opět hierarchie elementů a hierarchie sil - vazeb mezi nimi.

1.2.1.3. V sociálním systému

se jednotlivci a skupiny lidí slučují do organizací, které mohou plnit
úkoly, na které jednotlivec nestačí. Některé organizace jsou pomíjivé
(manželství), některé mají mnohagenerační trvání (armáda, církev).
Jakmile organizace roste, objevuje se hierarchie. Nadnárodní organizace
sestávají ze společností, společnost z divizí, divize z lokálních
oddělení atd. Má-li organizace dlouhou životnost, hranice mezi jejími
komponentami se mohou měnit v čase, aby vytvářely stabilnější
hierarchii. Mezi prvky sociálního systému najdeme stejné vazby jako mezi
prvky rostlin, živočichů, počítače či materiálu. Interakce mezi prvky na
stejné hierarchické úrovni jsou častější  než mezi prvky různých
úrovní. Účetní obvykle nekomunikuje s generálním ředitelem, ale častěji s
ostatními účetními. Přesto jsou oba placeni stejnou organizací a
používají některé společné prostředky, jako je např. telefonní ústředna.

1.2.2. Pět atributů složitého systému

Mezi pět nejvýraznějších vlastností složitého systému lze uvést:
1.	Složité systémy jsou nejčastěji sestaveny z hierarchie subsystémů, které mají opět své subsystémy až po jistou nejnižší elementární úroveň.
2.	Volba, které komponenty v systému jsou základní je relativně libovolné a záleží na postoji pozorovatele systému.
3.	Vnitřní vazby uvnitř komponenty jsou obecně silnější než vnější vazby mezi komponentami. Tato skutečnost se projevuje dynamikou s vyšší frekvencí u komponent vytvářejících vnitřní strukturu od dynamiky s nižší frekvencí interakce mezi komponentami.
4.	Hierarchické systémy jsou nejčastěji sestaveny z mála různých druhů subsystému v různých kombinacích svých konfigurací.
5.	Složitý systém, který funguje správně byl vždy vyvinut z jednoduššího fungujícího systému. Složitý systém, který je navržen od zeleného stolu nebude fungovat a ani dodatečné úpravy ho k funkčnosti nepřivedou. Musí se začít od začátku, od jednoduchého fungujícího systému.

1.2.3 Organizovaná složitost

Většina složitých systémů obsahuje současně několik hierarchických
systémů. Např. letadlo má hierarchii řídicího systému, hierarchii
pohonného systému atd. K systému však můžeme přistoupit také ortogonálně
(pravoúhle) a hodnotit např. pohonný systém - motor, jako prvek
hierarchie struktury motorů - např. turbovrtulový motor je typ proudového
motoru a Pratt and Whitney TF30 je typ turbovrtulového motoru. Hovoříme
tedy "o částech" - "prvcích" systému ( OBJEKTOVÁ struktura systému) a o
typu "části" - "prvku" systému (TŘÍDOVÁ nebo TŘÍDNÍ struktura). 
Je prověřenou zkušeností, že dobré projekty se vyznačují návrhem s
explicitně vytvořenou strukturou objektů a tříd, které mají všech 5
atributů složitých systémů.
Lidský intelekt má omezené prostředky pro zvládání složitých a
rozsáhlých systémů. Psychologické studie ukazují, že lidská krátkodobá
paměť ovládne průměrně 7 (2) paměťových položek současně. Nelze tedy
současně sledovat více jevů. Tím je stanovena kapacitní šíře kanálu.
Studie také ukazují na rychlostní průchodnost kanálu. Ty ukazují na
potřebu 5 vteřin na přijetí další paměťové položky.

1.3. Vnesení řádu do chaosu.

1.3.1. Role Dekompozice.

Významná role dekompozice je známa již od starověku : "Divide et impera"
- "Divide and conquer".

Většina současných programátorů je zvyklá na provádění algoritmické
dekompozice "shora-dolů". (Obr.1.2 ukazuje dekompozici problému při
zpracování - aktualizaci sekvenčního souboru.)

Zatímco algoritmická dekompozice člení systém podle postupných aktivit a
jejich podčástí, "objektově orientovaná" (dále se pro tuto dvojici slov
bude používat většinou zkratka "OO") dekompozice člení systém podle
prvků, které jsou součásti slovníku problémové domény - tedy pojmy z
reálného světa problému. Při této dekompozici nahlížíme na systém jako
na množinu autonomních elementů, které vzájemně spolupracují za účelem
provádění určité vyšší činnosti. Každý objekt našeho řešení představuje
prvek se samostatným, přesně definovaným chováním a každý modeluje prvek
reálného světa. Objekty provádějí činnost ke které jsou vyzvány
"zasláním zprávy".

Porovnáváním obou metod dekompozice lze dospět k závěru, že v rozsáhlém
systému je vhodné používat obou postupů, přičemž "objektově orientovaný"
přístup preferuje objektovou dekompozici jako první. Zatím co
algoritmická dekompozice dává přednost uspořádání "akcí", OO dekompozice
upřednostňuje elementy, které tyto akce provádí, nebo které jsou
předměty těchto akcí. Jak bude patrné z dalšího výkladu, jednou z
předností OO dekompozice je možnost znovupoužití vytvořených objektů v
problémech, ve kterých se podobných objektů používá. OO návrh významně
usnadňuje změny a je tedy flexibilnější - pružnější. Podporuje vytváření
systémů od jednoduchých ke složitějším. OO dekompozice zvládá vrozenou
složitost systémů, protože usnadňuje inteligentní rozhodování týkající
se oddělení sfér zájmů v rozsáhlém stavovém prostoru problémové domény.

1.3.2. Role abstrakce

Abstrakce je významný nástroj pro zjednodušení složitosti a pro
zvládnutí omezených možností přijmout, zapamatovat a zpracovávat více
paměťových položek současně. Abstrahovat znamená ignorovat nepodstatné
detaily a vytvořit zjednodušený, idealizovaný model s obecnými a
nejpodstatnějšími vlastnostmi. Při studiu fotosyntézy u rostlin se
můžeme zaměřit na některé biochemické reakce v některých buňkách listů a
zcela ignorovat procesy v kořenech a stonku rostliny. Při abstrakci
snižujeme počet paměťových položek tím, že používáme položky s vyšším
sémantickým obsahem. Z mnoha položek vytvoříme jednu položku např."mnoho
stromů = les".

1.3.3. Role hierarchie

Jiným způsobem jak zvýšit sémantický obsah položky je použití objektové
a třídové hierarchie. Objektová struktura je důležitá z toho pohledu, že
ukazuje kolik různých objektů spolupracuje pomocí interakce, které se
také říká "mechanismus". Třídová struktura zdůrazňuje redundanci
(nadbytečnost) v systému. Umožňuje nestudovat fotosyntézu každé buňky
zvlášť, ale studovat chování jedné takové buňky a předpokládat, že
stejné chování budou mít všechny buňky téže třídy. Klasifikací
objektů do skupin spojených touž abstrakcí dospíváme ke společným a
odlišným vlastnostem různých objektů, což umožňuje lépe ovládnout jejich
vrozenou složitost. Nalézt hierarchické uspořádání není ve složitém
systému vždy jednoduché. Stanovením hierarchií se však rozsáhlý systém
velmi zjednoduší.

1.4. Navrhování složitých systémů

1.4.1. Inženýrství jako věda a jako umění

Vztah mezi intuicí a neexaktní kreativitou na jedné straně a vědeckým,
exaktním a disciplinovaným přístupem na straně druhé je často
diskutovaným tématem. Při návrhu nového systému je pro vytvoření jeho
celkového konceptu nebytný výrazný podíl tvůrčí imaginace a syntetické
zkušenosti. Jakmile je systém specifikován inženýrem-umělcem, ne nutné
podrobit ho analýze inženýrem-vědcem, s použitím exaktních metod a
inženýrských nástrojů. Většina složitých systémů, zejména z oblasti
řízení a reálného času jsou pro své jedinečné soustavy požadavků vždy
nové a proto je kreativní schopnost tvůrců velmi důležitá. Přitom se
velmi často používá souborů prověřených nástrojů a prvků, seskupených do
knihoven. Konstruktér jich používá novým inovativním způsobem, aby
splnil zadání, které žádá, aby navržený systém byl výkonnější, rychlejší
nebo rozsáhlejší než podobný, již používaný systém. V mnoha případech
však neexistují knihovny nástrojů na dostatečně rozvinuté abstraktní
úrovni a návrhář musí začít na poměrně primitivní hladině abstrakce.

1.4.2. Význam návrhu

Návrh je velmi důležitou inženýrskou etapou tvorby, která představuje
cestu od požadavků ke vlastní implementaci. Smyslem návrhu je podle
Mostowa, splnění těchto požadavků:
•	splnění (často neformálně specifikovaných) požadavků funkčnosti
•	respektování omezení cílového média (prostředí)
•	splnění explicitních nebo implicitních požadavků na výstupní výkon a
možnosti zdrojů na vstupu
•	splnění požadavku na vnější formu - tvar produktu
•	vyhovění omezení daných vývojovým procesem samým, jako je cena a
doba tvorby, dostupné nástroje tvorby ap.

1.4.2.1. Použití modelů

Častým nástrojem vývoje je tvorba modelů. Podporuje principy
dekompozice, abstrakce a hierarchie. Umožňuje vývoj složitějších modelů
z jednodušších fungujících modelů. Model umožňuje realizovat mezní stavy
i chybné zákroky za řízených podmínek. U složitých systémů se někdy
používá několik různých nezávislých modelů, které modelují daný systém z
určitého pohledu. Častými pohledy jsou statické a dynamické chování
modelovaného systému.

1.4.2.2. Nástroje a prvky návrhových metod

Existuje mnoho nejrůznějších metod a metodik pro tvorbu rozsáhlých
programových systémů. Již jejich počet ukazuje, že žádná z metod není
všeobecně nejlepší a univerzální. Všechny významnější metody mají tři
základní rysy:
•	Notace - representovaná vhodným jazykem pro popis modelu
•	Proces - návod na uspořádané vytvoření modelu
•	Nástroje - pomůcky, které usnadňují výstavbu modelu, zvýrazňují
 zákonitosti výstavby tak, aby bylo snadnější odhalit chyby a nekonzistence

Významné metody jsou založeny na solidním teoretickém základu, zůstávají
však otevřeny intuitivním inovačním nápadům kon
struktéra.

1.4.2.3. Modely OO návrhu

I když nelze toto tvrzení zcela zevšeobecnit, zdá se, že značné množství
složitých a rozsáhlých systémů je užitečné modelovat OO přístupem. OO
návrh vede k OO dekompozici. Model snadněji přístupný ke změnám a
většinou je vytvořen úsporně z hlediska nákladů. Vzhledem k rozdělení
stavového prostoru se dosahuje větší důvěry ve spolehlivost modelovaného
systému. Vytváření OO modelu zdůrazňuje objektovou o třídovou hierarchii
návrhu složitého systému.

1.5. Souhrn kapitoly:

•	Software je vrozeně složitý; jeho složitost často převyšuje kapacitu lidského intelektu. Úlohou tvůrce software je vytvořit iluzi jednoduchosti produktu
•	Složitost má často formu hierarchie; je užitečné modelovat jak "prvkové" tak "druhové" hierarchie složitého systému
•	Jsou známa omezení kapacity lidského vědomí; tato omezení zvládáme použitím dekompozice, hierarchie a abstrakce.
•	Na složité systémy lze nahlížet jako na prvky nebo na procesy; existují důvody ke zdůrazňování OO dekompozice, v níž na svět nahlížíme jako na soubor elementů, spolupracujících pro dosažení jistého vyššího chování
•	OO návrh vede k OO dekompozici; OO návrh definuje notaci a proces k vytváření složitých systémů a nabízí řadu logických i fyzických modelů, na nichž můžeme zkoumat různé aspekty chování systému za specifikovaných okolností