126 lines
No EOL
8.8 KiB
Markdown
126 lines
No EOL
8.8 KiB
Markdown
# Porovnání objektového a procedurálního programování
|
||
|
||
- Programovacích stylů je celá řada
|
||
- Mezi nejběžnější styly patří v současné době objektové a procedurální programování
|
||
|
||
### Základní charakteristiky obou přístupů
|
||
|
||
- Oba přístupy se v některých aspektech podobají a v některých liší
|
||
|
||
#### Objektové programování
|
||
|
||
- Java, kterou jsme se celý semestr zabývali, je primárně objektový jazyk
|
||
- V objektovém programování je řešený problém dekomponován na objekty představující objekty z reálného světa
|
||
- Zdrojový kód je tak členěn na třídy, které obsahují atributy (data) a metody (podprogramy – procedury a funkce), které se těmito atributy pracují
|
||
- Podle třídy lze vytvořit libovolné množství instancí (objektů), každá s vlastním nastavením hodnot atributů
|
||
- Díky použití objektů je program lépe členěn na víceméně samostatné jednotky (třídy)
|
||
- Lepší znuvupoužitelnost kódu
|
||
- Třída se poměrně snadno dá použít v jiném v jiném programu, protože je oddělená od dalších tříd
|
||
- Zapouzdřenost + jasně stanovená identita
|
||
- Díky přístupovým právům (viz Kap. 14.7.1) je zajištěn kontrolovaný přístup k datům (atributům) z vnějšku třídy
|
||
- Vše někomu patří – metody a atributy (proměnné) jsou vždy součástí tříd
|
||
- Kromě zapouzdřenosti existují dva další pilíře objektového programování
|
||
- Skládání (objekt obsahuje jiné objekty) a polymorfizmus
|
||
- Viz předměty KIV/PPA2 a KIV/OOP
|
||
- Objektové programování nabádá programátora k větší disciplíně
|
||
- Obsahuje více pravidel, která by se měla dodržovat
|
||
- Při jejich dodržení by měla vést k přehlednějšímu zdrojovému kódu
|
||
- Objektové programování nabádá k dekompozici problému (na objekty)
|
||
|
||
#### Procedurální programování
|
||
|
||
- V procedurálním programování je problém dekomponován na jednotlivé činnosti
|
||
- Program tvoří jeden celek (ač může být často rozdělen do několika jednotek / zdrojových souborů – modulů) členěný na podprogramy (procedury a funkce)
|
||
- Procedury a funkce rovněž pracují s daty, ale nejsou s nimi přímo svázány v jednom celku jako v objektovém programování
|
||
- Procedury a funkce jsou umístěny „volně“, nejsou v žádné třídě
|
||
- Pro jednoduché problémy mohou být programy kratší, protože není potřeba vytvářet třídy
|
||
- Procedurální programování dává programátorovi větší volnost
|
||
- Pravidel je méně než v objektovém programování
|
||
- Pro složitější programy může být zdrojový kód méně přehledný (ale nemusí – záleží na programátorovi)
|
||
- Kombinace více přístupů
|
||
- Mnohé jazyky umožňují programovat jak procedurálně, tak objektově (a případně mohou obsahovat další přístupy)
|
||
- Programátor pak může kombinovat oba přístupy nebo používat jen jeden z nich podle svého uvážení
|
||
- Např. C++, PHP, Pascal (FreePascal, Delphi)
|
||
|
||
### Jednotlivé rozdíly
|
||
|
||
- V následujících kapitolách budou ukázány hlavní rozdíly mezi objektovým a procedurálním programování
|
||
- Aby nebylo nutné učit se syntaxi nějakého procedurálního jazyka (např. C), budou příklady na procedurální programování ukázány v Javě
|
||
- Procedurální programování v Javě
|
||
- Java je primárně objektový jazyk a byla tak koncipována od svého vzniku
|
||
- Přesto je v ní možné „simulovat“ procedurální programování
|
||
- Celý program napsat do jedné třídy
|
||
- Další třídy používat pouze jako strukturovaný datový typ
|
||
- Používat pouze statické metody
|
||
- POZOR!
|
||
- Tento postup je použit pouze pro porovnání principů objektového procedurální programování
|
||
- Neznamená to, že by se tak v Javě mělo programovat
|
||
|
||
#### Metody, procedury a funkce
|
||
|
||
- V procedurálním i objektovém programování jsou části výkonného kódu rozděleny do podprogramů, které je možné (opakovaně) volat v jiných částech kódu
|
||
- V objektovém programování se nazývají metody
|
||
- Lze je rozdělit na procedury (nemají návratovou hodnotu) a funkce (mají návratovou hodnotu)
|
||
- V procedurálním programování se nazývají rovnou procedury (nemají návratovou hodnotu) a funkce (mají návratovou hodnotu)
|
||
- Toto je pouze rozdíl v terminologii
|
||
- Metody v objektovém programování
|
||
- Jsou součástí konkrétní třídy
|
||
- Metody instance
|
||
- Při dobrém návrhu většina metod
|
||
- Volají se nad konkrétní instancí
|
||
- Mají přístup k atributům instance => díky tomu mají obvykle menší počet formálních parametrů (poměrně často nemají žádné parametry)
|
||
- Metody třídy
|
||
- Je možné je volat bez vytvoření instance
|
||
- Nemají přístup k atributům instance
|
||
- Data, se kterými mají pracovat, musí být do metody předány přes její formální parametry
|
||
- Nebo mohou pracovat s proměnnými třídy
|
||
- Nebo mohou pracovat s tzv. „globálními“ proměnnými
|
||
- Jsou velmi podobné procedurám a funkcím v procedurálním programování
|
||
- Procedury a funkce v procedurálním programování
|
||
- Volají se přímo jen svým jménem a skutečnými parametry
|
||
- Data, se kterými mají pracovat, musí být do procedury/funkce předány přes její parametry
|
||
- Nebo mohou pracovat s „globálními“ proměnnými
|
||
- Předávání parametrů do metody (procedury či funkce)
|
||
- Předání parametrů odkazem
|
||
- Ve formálním parametru se předá proměnná a s její hodnotou se v metodě (proceduře či funkci) pracuje
|
||
- Změna hodnoty provedená v metodě se projeví i vně metody
|
||
- Předání parametrů hodnotou
|
||
- Ve formálním parametru se předá kopie hodnoty proměnné a s touto hodnotou se v metodě (proceduře či funkci) pracuje
|
||
- Změna hodnoty provedená v metodě se neprojeví vně metody, protože se mění kopie
|
||
- Tento postup používá Java (a mnoho dalších jazyků)
|
||
- Způsob, který se použije, nezáleží na tom, zda se jedná o procedurální nebo objektové programování
|
||
- Způsob závisí na konkrétním jazyce
|
||
- Některé jazyky umožňují jeden nebo druhý způsob, přičemž druhého (neumožněného) způsobu je obvykle možno nějak dosáhnout
|
||
- Některé jazyky explicitně umožňují oba způsoby (např. C#, Pascal)
|
||
- Těla metod (procedur či funkcí)
|
||
- Těla metod, procedur a funkcí se v obou přístupech (objektový a procedurální) nijak neliší
|
||
- V obou případech obsahují výkonný kód metody (tj. příkazy, které provedou činnost metody/procedury/funkce)
|
||
|
||
#### Globální proměnné
|
||
|
||
- V procedurálním programování je potřeba předat všechna potřebná data do procedur a funkcí pomocí parametrů
|
||
- Na rozdíl od objektových jazyků, kde metody instance mají přístup k atributům instance
|
||
- Často však také existuje možnost mít tzv. „globální proměnnou“, která je viditelná ve všech procedurách a funkcích programu
|
||
- Tato možnost často existuje v procedurálních i objektových jazycích explicitně (např. PHP), nebo se dá různými způsoby dosáhnout
|
||
- Např. v Javě jsou veřejné (statické) proměnné třídy viditelné odevšad
|
||
- Mimo třídu, kde jsou definovány, je potřeba volat je s názvem třídy
|
||
- Obecně platí, že metody, procedury a funkce mohou s takovou proměnnou pracovat, pokud není zastíněná lokální proměnnou se stejným jménem
|
||
|
||
#### Homogenní strukturované datové typy (pole)
|
||
|
||
- S poli se pracuje v podstatě stejně, bez ohledu na to, zda používáme procedurální či objektové programování
|
||
- Konkrétní implementace pole závisí spíše na programovacím jazyku než na přístupu k programování
|
||
- Např. v Javě je pole instance speciální třídy, která kromě samotných prvků obsahuje i délku pole a další data
|
||
- Např. v C je pole jen posloupnost prvků stejného typu, které jsou umístěny za sebou v paměti počínaje určitou adresou délka pole není v poli uložena
|
||
- POZOR!
|
||
- Pokud v daném jazyce není součástí pole i jeho délka, je potřeba mít délku uloženou zvlášť (typicky v celočíselné proměnné)
|
||
- Nutné, abychom věděli, jak je pole dlouhé a nedostali jsme se při práci s polem mimo platné indexy
|
||
|
||
#### Heterogenní strukturované datové typy
|
||
|
||
- Pokud je v objektovém jazyce potřeba uložit data různých datových typů do jednoho celku, použije se typicky objekt (instance třídy)
|
||
- V procedurálním jazyce objekty nejsou, ale možnost ukládat heterogenní data do společných celků typicky existuje
|
||
- Typicky se používají strukturované datové typy, které mají položky různých datových typů (podobně jako atributy instance), ale neobsahují žádné metody
|
||
- Lze si je představit jako třídy s veřejnými proměnnými instance bez metod
|
||
- Běžný obecný název je záznam (record) nebo struktura (struct)
|
||
- Konkrétní názvy a způsob deklarace se liší jazyk od jazyka |