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

8.8 KiB
Raw Blame 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