FAV-ZCU/KIV PPA1/20. Objektové a procedurální programování.md

126 lines
8.8 KiB
Markdown
Raw Permalink Normal View History

# 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