Objektov orientovaný pístup Softwarové inženýrství (SWI ) je disciplína poítaové vdy (computer science) zabývající se vývojem velkých aplikací. Softwarové inženýrství zahrnuje nejen technické aspekty vytváení softwarových systém, ale i aspekty ízení, ekonomické aspekty a aspekty kvality. Mezi n patí napíklad vedení tým, plánování a ízení prací, definování a používání inženýrských princip. Softwarové inženýrství pedstavuje systematický, kvantifikovatelný pístup k vývoji, provozování a údržb software. Cílem softwarového inženýrství je vytváet užitený software, tj. software, který odpovídá požadavkm uživatel, je dodán v termínu, za stanovenou cenu a pracuje bez chyb. Velké softwarové projekty v minulosti byly asto neúspšné a jejich výsledkem byl špatn navržený, málo dokumentovaný, drahý, uživatelsky nepívtivý software, který asto neodpovídal uživatelským požadavkm. Jako výsledek studií o píinách výše uvedených neúspch vznikla disciplína softwarové inženýrství. Inženýrské postupy jsou dnes bžné ve stavebnictví, strojním i elektroprmyslu, ale pi vytváení software se ješt v masovém mítku nepoužívají. Vývoj software je stále ješt více umním než inženýrským postupem. Tato situace se ovšem zaíná mnit a i software se v souasné dob stává pedmtem výroby a vyvíjejí se pesné inženýrské postupy pro jeho vytváení. Vývoj software prošel nkolika vývojovými stádii, která našla odraz jak v generacích vývojových nástroj, tak v metodách a technikách uplatovaných pi vývoji. Nejvýznamnjší stádia jsou uvedena v tabulce 2.1. Stádium vývoj v nízkoúrovových jazycích programování v jazycích 3.generace (COBOL, PL/1, RPG, BASIC) strukturované programování objektov orientované programování komponentový vývoj webové služby Charakteristika asembler, pozdji fortran zájem o ízení pamti a instrukcí zpracování vtšinou dávkové programy nepenositelné vyšší úrove abstrakce zejména procedurální jazyky od konce 60.let rozvoj strukturovaných metod analýzy a návrhu tyto techniky mají nejvtší vliv na souasné praktiky softwarového vývoje OO analýza a návrh - nastupují novou éru softwarového inženýrství vytváejí se komponenty - spustitelné prvky, které je možné použít v rzných vývojových prostedích komponenty se stávají webowými službami, které je možné využívat prostednictvím internetu Tabulka 2.1: Vývoj softwarového inženýrství Souasné stádium vývoje softwarového inženýrství je velmi úzce spjato s objektov orientovaným pístupem. Objektov orientovaný pístup jako pístup k celému procesu tvorby programového systému, vychází z princip objektov orientovaného programování a dále je zobecuje. Objektov orientovaný pístup je sice vyšším vývojovým stádiem pi tvorb software, ale neznamená to, že by procedurální pístup pestal existovat a ml by být zapomenut. Tyto pístupy existují soubžn a je souástí návrhu rozhodnout se, který pístup pro ešení zadaného problému použijeme. I v dnešní dob existují úlohy, pro které je
vhodnjší použít procedurální pístup. V následujícím odstavci se pokusíme oba pístupy charakterizovat a porovnat. Procedurální a objektov orientovaný pístup Procedurální pístup, nazývaný také algoritmický, znáte, pokud jste programovali napíklad v Pascalu. Procedurální program probíhá od zaátku do konce, provádí píkaz po píkaze, piemž píkazem mže být i volání podprogramu. Procedurální pístup k analýze a návrhu úloh je spojen s funkní dekompozicí a je nazýván také hierarchickým rozkladem. Procedurální pístup je úzce spojen se strukturovaným programováním. Podrobnjší výklad problematiky strukturovaného programování je náplní skript "Základy softwarového inženýrství - jak psát dobe strukturované programy" [ZSWI-SP]. Pro srovnání s objektov orientovaným pístupem je však podstatné, že analyzovaný a navrhovaný systém je rozdlován na dv samostatné oblasti - data a funkce, které se analyzují, navrhují a implementují samostatn. Data se modelují pomocí datových model, které potom mohou vést k návrhu databází. Funkce se analyzují samostatn s využitím funkní dekompozice. V programu se funkce spojují s uritými daty, která jsou však zpravidla globální. Takovéto dlení na data a funkce je však umlé, protože v bžném svt existují objekty reality, které vlastní jak data, tak funkce. Proto pi procedurálním pístupu vlastn provádíme transformaci objekt reality na funkní struktury a datové struktury, což bývá asto dosti nároný proces. Pojetí informaního systému je v objektov orientovaném pístupu mnohem bližší bžnému lidskému uvažování. Objektov orientovaný pístup zavádí místo prvk data a funkce prvek objekt. Rozdíly v procedurálním a objektov orientovaném pístupu se pokusíme ukázat na píklad registrace pedmt na VŠE (obrázek 2.1 a 2.2). Procedurální pístup Funkce Interní data Externí data Zobraz úvodní menu Zadání a kontrola rodného ísla Prohlížení pedmt Zapsání pedmtu... AktualStudent PocetKreditu AktualPredmet Tabulka student Tabulka pedmt... Obrázek 2.1: Procedurální pohled na problémovou oblast Registrace pedmt
Objektový pístup Objekt Student Objekt Pedmt Objekt Studium pedmtu v semestru Objekt Obrazovka Výbr pedmtu Obrázek 2.2: Objektový pohled na problémovou oblast Registrace pedmt Pi procedurálním pístupu nahlížíme na data samostatn. Data jsou uložena v databázových tabulkách nebo souborech a v programu jsou zpístupnna pomocí klíové položky nebo natením vty ze souboru. V rámci jedné funkce, která má pracovat jen s nkterými údaji, máme ovšem zpístupnny i další nerelevantní údaje. Po funkní stránce program vypadá vtšinou tak, že hlavní program vypíše úvodní menu, uživatel si vybere njakou funkci a podle volby se spustí píslušný podprogram. Pi objektov orientovaném pístupu jsou data a funkce zabaleny do jednoho celku - objektu. Napíklad objekt Student má u sebe data, íkáme jim atributy, jako jméno, píjmení, rodné íslo, fakulta, poet kredit, seznam zapsaných pedmt. Má také funkce, které oznaujeme jako metody, napíklad zm poet kredit, vypiš studované pedmty. Další charakteristikou objektov orientované aplikace je ízení na základ událostí. Objekty mohou mít urité události, na které mohou reagovat - napíklad kliknutí na tlaítko Vybrat na obrazovce Výbr pedmtu. Charakteristiky objektov orientovaného pístupu Mezi základní charakteristiky objektov orientovaného pístupu patí: používání abstrakce, existence objekt, definování tíd objekt, zapouzdení, ukrývání implementace, komunikace objekt, ddinost, polymorfismus.
Abstrakce Abstrakce je proces vytváení jednoduché reprezentace složité reality. Abstrakce je základní metodou jak v procedurálním, tak v objektov orientovaném pístupu. Rozdíl spoívá v tom, na co se pi abstrakci zamujeme. Objekty v informaním systému reprezentují objekty, které se nacházejí v realit. Abychom o každém objektu udržovali veškeré informace je jednak nemožné, jednak to nemá píliš smysl. Abychom napíklad napsali výše zmiovaný program pro registraci pedmt, nemusíme u objektu Student držet informace jako - váha, krevní skupina, barva vlas apod. Tyto informace jsou pro naši úlohu irelevantní. Naopak potebujeme informace jako jméno, adresa, rodné íslo, obor studia, fakulta apod. Pi návrhu musíme tedy rozhodnout, které informace jsou dležité a které ne. Krom toho musíme vybrat i nejlepší zpsob jejich reprezentace. Tento proces pedstavuje abstrakci problému pi objektovém návrhu. Abstrakce ovšem velmi závisí na lovku, který ji provádí. Neexistuje tedy jediný "správný" zpsob abstrakce daného objektu. Pi abstrakci je teba pohlížet na objekty, které je teba reprezentovat, a urovat, v em se liší a v em se shodují. Zárove si musíme všímat vztah mezi objekty. Je uritý objekt druhem (typem) jiného objektu? Abstrakce je nároný proces a nikdy jej dobe neudláme napoprvé. Naopak musíme jej provádt v iteracích, postupným zpesováním návrhu. V procesu návrhu objektov orientovaného ešení nám mohou pomoci následující otázky: 1. Jaké druhy objekt potebujeme? (klasifikace) 2. V jakých vzájemných vztazích jsou rzné druhy objekt? (hierarchie, celek-ást) 3. Které informace jsou u každé instance objektu jedinené? (atributy) 4. Co je každý objekt schopen dlat? (metody) 5. Na jaké situace musí objekt reagovat? (události) Objekty a tídy V pedcházejícím výkladu jsme vidli, že základem objektov orientovaného ešení jsou objekty. Pokusíme se o definici objektu [ZaklOOP], grafické vyjádení této definice je zachyceno na obrázku 2.3. Objekt je v programu uzavená struktura s následujícími vlastnostmi: obsahuje zvnjšku neviditelnou vnitní pam (atributy, data), obsahuje metody, tj. procedury a funkce, které vykonávají njakou innost nad vnitní pamtí objektu, má schopnost pijmout a zpracovat zprávu zvnjšku, mže obsahovat jiné objekty. Jak tedy s objektem pracujeme? Objektu pošleme zprávu (požadavek) a objekt na ni reaguje. Každý objekt má pípustné pouze urité zprávy, které jsou definovány v rozhraní objektu. Rozhraní uruje, jaké požadavky mže daný objekt uspokojit. Aby bylo možné požadavek uspokojit, musí existovat programový kód (metoda), který danou innost vykoná. Tento kód vetn ukrytých dat tvoí implementaci. Každý objekt má svou identitu a objekty jsou navzájem rozlišitelné. Dv jablka stejné barvy, tvaru, druhu jsou dv rzná jablka. Podobn teba dvojata, která vypadají stejn, jsou dv rzné osoby. Skutenost, že objekt má svou identitu je velmi dležitou charakteristikou objektu a znamená, že objekty se liší svou existencí, nikoli hodnotami vlastností, které mají. Každý objekt má urité vlastnosti, které nazýváme atributy, urité chování, které je reprezentováno metodami objektu, a má urité vztahy s jinými objekty. Abychom nemuseli pi analýze a návrhu modelovat každý objekt zvláš a pi implementaci jej znovu programovat, je zaveden pojem tída objekt.
Objekt zprávy r o z h r a n í pam metoda Obrázek 2.3: Objekt Tída objekt (class) je abstrakcí objekt se stejnými vlastnostmi, stejným chováním a stejnými vztahy k ostatním objektm. Mžeme definovat tídy Osoba, Firma, Auto, Student atd. Napíklad tída Osoba má atributy rodné íslo, jméno, píjmení. Objekty tídy Osoba jsou pan Novák nebo pan Dlouhý. Objekty téže tídy mají vždy stejné atributy, ale vtšinou se liší hodnotami tchto atribut. Objekty téže tídy mají mít stejný sémantický význam. I když studenti a uitelé mají nkteré stejné atributy, mli bychom definovat samostatné tídy Student a Uitel. Krom jiné sémantiky se budou lišit i chováním. Každý objekt "zná" svou tídu. ada objektov orientovaných jazyk umí urit tídu za bhu programu. Tída je implicitní vlastností objektu. Seskupení objekt do tíd pedstavuje velmi úelnou abstrakci problému, která nám umožuje modelovat tídy a tím urovat atributy a chování všech objekt tchto tíd. Pi implementaci staí definovat atributy a naprogramovat metody jen jednou v definici tídy a mohou je sdílet všechny objekty. Tím dochází ke znovupoužitelnosti kódu. Tída je jakási forma (šablona), podle které se vytváejí objekty. Pokud vytváíme nový objekt, staí uvést, do jaké tídy patí, a tím jsou ureny jeho vlastnosti i chování. Zapouzdení V objektech jsou data a s nimi pracující procedury a funkce zabaleny do jednoho celku. Objekt vlastní všechna relevantní data a všechny metody, které realizují chování objektu. Má tedy u sebe vše potebné pro své fungování v systému. Takto navržené objekty lze snadno znovu využít v jiných programech. Zapouzdení (encapsulation) je tedy technika softwarového návrhu, pi které jsou data a funkce s nimi pracující spojeny do jediné entity. Data objektu jsou skryta ped ostatními objekty a lze k nim pistupovat pouze pomocí metod objektu. To má nkolik podstatných výhod: data jsou chránna ped narušením zvenku, ostatní objekty nemusí znát vnitní strukturu dat, realizace zmny v datech je mnohem jednodušší, protože se projeví jen v jedné tíd. Zapouzdení je nejdležitjším principem objektového pístupu. Nkteré objektov orientované jazyky (napíklad Object Pascal) zavádjí do své syntaxe vlastnosti (property).
Vlastnosti pedstavují zapouzdení atribut objekt. Jedná se o soukromé promnné, které ve své definici mají pímo definovány metody pro nastavení a tení hodnot z tchto promnných. Ukrývání implementace V bžném svt existuje velké množství objekt, mnohé z nich jsou dosti složité, a pesto je mžeme používat. Vezmme napíklad automobil. Staí jej nastartovat, zaadit rychlost, pidat plyn a jet. Nemusíme znát pesn procesy, které tyto funkce realizují uvnit. Automobil je pro nás erná skíka. Uživatele zajímá jen rozhraní tohoto objektu (metody, které objekt zpístupuje navenek). Možnost používat metody objekt bez znalosti jejich implementace se nazývá ukrývání implementace (information hiding). Objektov orientované programování s sebou pináší specializaci programátor na tvrce tíd, kteí vytváejí nové datové typy, a klientské programátory (uživatele tíd, kteí používají již hotové tídy ve svých aplikacích). Cílem tvrce tídy je vytvoit tídu, která poskytuje pouze to, co mže být pro klientské programátory užitené. Ostatní je ukryté v implementaci. Tu mže upravovat jen tvrce tídy a tyto úpravy neovlivní uživatele tídy. Ukrývání implementace má adu podstatných výhod: omezuje možnost vzniku programátorských chyb, umožuje uživatelm tíd zjistit, co je pro n podstatné, umožuje tvrci knihovny zmnit vnitní funknost tídy, aniž by ovlivnil programy, které tuto tídu využívají, umožuje vytváet tídy simulující uritou innost. Aby se urychlil vývoj systému, mohou se nkteré tídy vytvoit tak, že implementují nejjednodušším zpsobem požadovanou funknost. Teprve po ase se vylepší, nesmí se ovšem zmnit jejich rozhraní, aby nedošlo k selhání program, které tyto tídy využívají. Objektová reference Základní vlastností objekt je schopnost vysílat a pijímat zprávy. íkáme, že objekty spolu komunikují. Aby bylo možné takovou komunikaci realizovat, musí mít jeden objekt pístup k druhému - musí mít referenci (odkaz) na druhý objekt (obrázek 2.4). Reference na objekt je vtšinou realizována pomocí typu ukazatel na pam alokovanou objektem. Pokud objekt A "má k dispozici" objekt B, znamená to, že v objektu A se v njaké promnné drží ukazatel na objekt B. Obrázek 2.4: Pístup k rozhraní objektu objekt B objekt A objekt C
Vzájemná pístupnost objekt pomocí reference je ovšem spojena s ukrýváním implementace. To znamená, že každý objekt vytváí kolem sebe vrstvu a dovnit této vrstvy jiné objekty nevidí. Vnjší objekt tak nezasahuje do kompetence vnitního objektu (obrázek 2.4). Ddinost Objektový pístup bývá velmi asto spojován s ddiností. Ddinost není ovšem primárním objektovým principem, i když je dležitým konstruktem objektov orientovaných jazyk. Ddinost pedstavuje znovupoužitelnost na úrovni deklarace tídy. Pokud chceme vytvoit novou tídu, která má podobné vlastnosti jako existující tída, mžeme využít mechanismu ddinosti a tuto tídu odvodit z existující tídy. Tída, od které odvozujeme, se nazývá bázová, rodiovská, nadtída, tída pedka. Tída odvozená se nazývá podtída, dceinná tída, tída potomka. Tída rodiovská obsahuje definici všech charakteristických vlastností a chování, které jsou sdíleny všemi odvozenými tídami. Odvozená tída obsahuje všechny datové položky tídy pedka (pestože soukromé položky jsou ukryty a jsou nedostupné), a kopíruje rozhraní tídy pedka. To znamená, že zprávy, které mžeme posílat objektm tídy pedka, mžeme posílat i objektm potomka. Vzhledem k tomu, že typ tídy rozeznáváme podle zpráv, které jí mžeme posílat, je odvozená tída stejného typu jako výchozí tída. Objekty odvozené tídy ddí i chování tídy výchozí. Chceme-li, aby nová tída mla jiné chování, máme dv možnosti: 1. pidat nové metody, 2. zmnit metody oproti rodiovské tíd (pekrytí, pedefinování metody, overriding). Pokud použijeme druhý zpsob, odvozená tída je tídou pedka, v tom smyslu, že má stejné rozhraní, ale s jinou funkností. V tomto pípad mžeme bez problém nahradit objekt pedka objektem potomka. Pokud však do definice odvozené tídy pidáme njaké metody, mžeme ve vtšin objektov orientovaných jazyk také objekt pedka nahradit objektem potomka, ale toto nahrazení není úplné, nebo objektu pedka nemžeme posílat všechny zprávy, které mžeme posílat objektu potomka. Jde o to zvážit, zda uvedená funknost by nemla být doplnna i do tídy pedka, by v podob abstraktní metody (viz 5.2.5 a 6.5) Polymorfismus I v bžném život se asto setkáme se situací, že s rznými objekty manipulujeme stejným zpsobem. Vtšina elektrických spotebi má metodu Zapni (spína, který uvede pístroj do chodu). Pesto je realizace tchto metod jiná, nebo pi zapnutí televizoru je teba vykonat jiné operace než pi zapnutí vysavae. Podobn je tomu i v objektov orientovaném programování, kdy rzným objektm (tídám objekt) definujeme stejnou metodu, která má však jinou implementaci. Jedná se vlastn o uritý druh abstrakce, kdy abstrahujeme od implementaních rozdíl a zamujeme se na stejný zpsob používání objekt. Jedná se o zjednodušení zejména pro uživatele objekt, kteí s nimi mohou zacházet stejným zpsobem. Tato vlastnost se nazývá polymorfismus (polymorphism) a v OOP znamená, že objekty rzných tíd mají metodu se stejným jménem, piemž její implementace se v jednotlivých tídách mže lišit. Výhody objektov orientovaného pístupu Objektov orientovaný pístup se zrodil ze snahy ešit problémy pi vývoji software. V následujících odstavcích jsou uvedeny nejdležitjší výhody objektov orientovaného pístupu. Zapouzdení objekt a konzistence vnitních stav objektu Jak jsme již uvedli je zapouzdení nejdležitjším rysem a také nejvtším pínosem objektov orientovaného programování. Hodnoty atribut reprezentují možné stavy objektu. Jedinou
možností (pi dodržení zapouzdení) jak hodnotu atributu zmnit, je vyvolat metodu objektu. Z toho vyplývá, že stav objektu je možné mnit jen pes jeho metodu a ne jinak. To znamená, že objekt je sám zodpovdný za zmny svých stav - mluvíme o konzistenci vnitních stav objektu [ZaklOOP]. Znovupoužitelnost Znovupoužitelnost (reuse) nabírá v objektovém pístupu novou dimenzi a je jedním z významných pínos tohoto pístupu. Znovupoužitelnost je vtšinou chápána jako optovné použití zdrojového kódu. Ve skutenosti ji však mžeme chápat mnohem obecnji, tj. jako optovné využití jakékoliv práce (analýzy, návrhu, komponenty apod.) Píklady znovupoužitelnosti [ZaklOOP] jsou uvedeny v tabulce 2.2. Oblast Píklad znovupoužitelnosti strukturované programování opakovan volané procedury teorie datových model pokud se ve dvou tabulkách vyskytují stejné sloupce, vylení se do samostatné tabulky OOP tída jako definice vlastností a chování objekt OOP ddinost Tabulka 2.2: Píklady znovupoužitelnosti Postup pi znovupoužívání kódu je ve všech pípadech obdobný - spoívá v identifikaci ástí, které se opakují, "vytknutí" opakující se ásti vn a provázání s místem pvodního umístní. Dvody zavádní znovupoužitelnosti: úspora práce pi vývoji, úspora práce pi opravách a zmnách systému, zajištní pehlednosti a srozumitelnosti systému. Tída, kterou vytvoíme, by mla pedstavovat njakou znovupoužitelnou ást kódu. Vhodný návrh znovupoužitelného kódu vyžaduje od programátora uritou zkušenost. Nejjednodušší cestou znovupoužití kódu je vytvoení instance dané tídy. Dalším druhem znovupoužití je vložení objektu do definice jiné tídy (skládání objekt, vazba agregace viz 3.1.5.3). Ddinost pedstavuje znovupoužití kódu tídy pedka v tíd potomka.
9