Kapitola 3: Co je to objektově orientované programování?

Objektově orientované programování (nebo OOP) je paradigma nebo vzorec programování, kdy řešení programovacího problému je modelováno jako kolekce spolupracujících objektů. Objekty spolupracují zasíláním zpráv k sobě navzájem. Je nejvhodnější pro řešení velkých, složitých problémů.

Objekt je entita, která má jak stav (nebo vlastnosti nebo atributy), tak chování. Jinými slovy, objekt zapouzdřuje data a funkce, které s těmito daty pracují. Data jsou obvykle skryta před jinými objekty, takže jediným způsobem, jak je ovlivnit, jsou funkce objektu (nebo metody).

Příkladem objektu je auto. Auto má atributy (např. Barvu, velikost, hmotnost, palivovou kapacitu, počet cestujících atd.). Auto má chování představované jeho metodami (např. Startovací motor, odbočit doleva / doprava, zrychlit, zastavit, zapnout stěrače, atd.).

Třída je zvláštní druh objektu, který se používá jako šablona pro vytváření vlastních instancí. Přemýšlejte o tom jako ořezávač souborů cookie, který vytváří soubory cookie (nebo objekty).

Třída může zdědit atributy a chování jiné třídy (její nadřazené) a může toto chování (tj. Jeho metody) upravit nebo přizpůsobit sama pro sebe. To vede k konceptu polymorfismu. Polymorfismus znamená, že když objekt obdrží zprávu, je volána správná metoda založená na třídě objektu. Tato metoda může patřit rodiči nebo to může být metoda přizpůsobená pro tuto třídu.

Zde je příklad polymorfismu:

Smalltalk umožňuje třídě zdědit pouze jednu třídu. Některé jazyky OOP umožňují třídě zdědit několik tříd; toto je známé jako vícenásobné dědictví. Vícenásobné dědictví způsobuje velkou složitost, a proto se mu obecně vyhýbá. Už nebudeme mluvit o vícenásobném dědictví.

I když dědičnost je důležitým aspektem OOP, není to jediný způsob, jak vytvářet programy. Místo dědičnosti lze použít složení nebo agregaci. Třída může zahrnovat příklady jiných tříd, aniž by zděděla cokoli. Je to „má“ vztah jako v: Třída A má jako člen třídy B. Pokud jste použili dědičnost, pak by třída B byla jakýmsi objektem třídy A; toto je „druh“ vztahu. Pojďme si to ilustrovat příklady ...

Auto je druh motorového vozidla (rodičovská třída). Stejně tak je motocykl. Stejně jako motorový člun. Stejně jako letadlo. Každý z nich může zdědit atributy a chování motorového vozidla. Mohou si však také přizpůsobit atributy a metody nadřazené třídy pro sebe.

Auto má jiné předměty nebo třídy jako součást sebe sama, jako je motor, kola, volant atd. Z těchto tříd nic nedědí.

Syntakticky jsou atributy objektu (data objektu) reprezentovány proměnnými instance. Obvykle pro ně vytvoříte metody „getter“ (získejte hodnotu proměnné instance) a metody „setter“ (nastavte nebo upravte hodnotu proměnné instance), protože proměnné instance jsou skryty před vnějším světem.

V Pharu jsou proměnné instance vytvářeny v definici třídy, například:

Podtřída velikosti: #Time
   instanceVariableNames: 'sekund nanos'
   classVariableNames: ''
   poolDictionaries: 'ChronologyConstants'
   balíček: 'Kernel-Chronology'

Ve třídě #Time (hash v #Time označuje čas jako symbol Smalltalk) existují dvě proměnné instance: „sekundy“ a „nanos“. Metody objektu budou pracovat na těchto proměnných, které představují skrytý a vnitřní stav objektu.

Mimochodem, třída #Time je odvozena od třídy #Magnitude, nebo z ní dědí. Alternativně můžete říci, že třída Magnitude označuje „podtřídy“ třídy Time. Toto je typický Smalltalk parlance.

Objekt připomíná koncept konvenčních modulů, který se používá v jednodušších procedurálních programovacích jazycích, jako je C a Pascal. Modul obsahuje datovou strukturu a funkce, které na ní fungují. Data však nejsou skrytá; kdokoli má přístup k datům. A co je nejdůležitější, moduly nemohou dědit od jiných modulů.

Objekty jsou obvykle mnohem jemnější než moduly. Jsou proto ideální pro modelování složitých systémů.

Tak je to. To je váš úvod do objektově orientovaného programování. Pokud chcete studovat tento zajímavý předmět do větší hloubky, existuje mnoho knih a materiálů věnovaných OOP a Smalltalk, například:

  • Smalltalk podle příkladu, Alec Sharp
  • Smalltalk, Objects and Design, Chamond Liu
  • Pharo by Example, Stéphane Ducasse, Dimitris Chloupis, Nicolai Hess, Dmitri Zagidulin