126 lines
8.8 KiB
Markdown
126 lines
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
|