Objektově orientované programování

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Drobné opravy, vzhled, dědičnost a spol. do vlastní stránky)
(Zdroje: Doplněno ITnetwork.cz.)
 
(Není zobrazeno 5 mezilehlých verzí od 1 uživatele.)
Řádka 4: Řádka 4:
 
* Objektově orientované programování (OOP, anglicky Object-Oriented Programming) je to ''[[Pojmy Softwarového inženýrství#Metodika|metodika vývoje softwaru]]''.
 
* Objektově orientované programování (OOP, anglicky Object-Oriented Programming) je to ''[[Pojmy Softwarového inženýrství#Metodika|metodika vývoje softwaru]]''.
 
*Zároveň se jedná o ''[[Pojmy Softwarového inženýrství#Paradigma|paradigma]]'': popisuje ''způsob vývoje a zápisu programu a způsob uvažování o problému''.
 
*Zároveň se jedná o ''[[Pojmy Softwarového inženýrství#Paradigma|paradigma]]'': popisuje ''způsob vývoje a zápisu programu a způsob uvažování o problému''.
 +
  
 
== Základní paradigma OOP ==
 
== Základní paradigma OOP ==
Řádka 13: Řádka 14:
 
*Pro srovnání: strukturované programování
 
*Pro srovnání: strukturované programování
 
**Řešení úlohy jako posloupnost příkazů, řídících struktur a volání metod.
 
**Řešení úlohy jako posloupnost příkazů, řídících struktur a volání metod.
 +
  
 
== Cíle ==
 
== Cíle ==
Řádka 28: Řádka 30:
 
To samozřejmě lze napsat do dokumentace. OOP je však vedeno snahou, aby zodpovězení těchto otázek bylo přirozenou součástí kódu.
 
To samozřejmě lze napsat do dokumentace. OOP je však vedeno snahou, aby zodpovězení těchto otázek bylo přirozenou součástí kódu.
 
</div>
 
</div>
 +
  
 
== Model systému pohledem OOP (konstrukty OOP) ==
 
== Model systému pohledem OOP (konstrukty OOP) ==
Řádka 53: Řádka 56:
 
; Stav objektu
 
; Stav objektu
 
*aktuální hodnoty jeho atributů.
 
*aktuální hodnoty jeho atributů.
 +
  
 
== Rysy OOP ==
 
== Rysy OOP ==
Řádka 79: Řádka 83:
 
* dědičnost používáme pouze tehdy, kdy objekt přebírá (a případně rozšiřuje o nové zprávy) CELÉ rozhraní jiného objektu (jinak používáme skládání + delegování)
 
* dědičnost používáme pouze tehdy, kdy objekt přebírá (a případně rozšiřuje o nové zprávy) CELÉ rozhraní jiného objektu (jinak používáme skládání + delegování)
 
* potomek může zároveň kdykoli zastoupit předka
 
* potomek může zároveň kdykoli zastoupit předka
 +
  
 
== Použití konstruktů OOP v programovacích jazycích ==
 
== Použití konstruktů OOP v programovacích jazycích ==
Řádka 119: Řádka 124:
 
; Instanční proměnné
 
; Instanční proměnné
 
*Každá instance má svoji vlastní hodnotu.
 
*Každá instance má svoji vlastní hodnotu.
<div class="Priklad">Například třída UcebniSkupina může mít atribut počet žáků (kteří do dané skupiny chodí). Odpovídající proměnná musí být instanční, protože každá učební skupina může mít jiný počet žáků. (Je to vlastnost konkrétní skupiny.)</div>
 
 
*Zabírají paměť tolikrát, kolik instancí třídy vytvoříme.
 
*Zabírají paměť tolikrát, kolik instancí třídy vytvoříme.
 +
<div class="Priklad">Například třída <code>UcebniSkupina</code> může mít atribut <code>počet žáků</code> (kteří do dané skupiny chodí). Odpovídající proměnná musí být instanční, protože každá učební skupina může mít jiný počet žáků. (Je to vlastnost konkrétní skupiny.)</div>
 
; Třídní proměnné
 
; Třídní proměnné
 
* klíčové slovo <code>static</code>
 
* klíčové slovo <code>static</code>
 
*Hodnota je společná pro všechny instance dané třídy.
 
*Hodnota je společná pro všechny instance dané třídy.
<div class="Priklad">Například je-li maximální počet žáků v učební skupině dán zákonem (pro všechny učební skupiny stejný), pak tento atribut budeme realizovat třídní proměnnou třídy UcebniSkupina.</div>
 
 
*Zabírají paměť jen jednou, bez ohledu na počet instancí.
 
*Zabírají paměť jen jednou, bez ohledu na počet instancí.
 +
<div class="Priklad">Je-li <code>maximální počet žáků</code> v učební skupině dán zákonem (tedy pro všechny učební skupiny stejný), pak tento atribut budeme realizovat třídní proměnnou třídy <code>UcebniSkupina</code>.</div>
 +
 +
Více o vztahu mezi instančními a třídními proměnnými viz: [[Platnost proměnných]].
  
 
=== Přístupnost metod a proměnných ===
 
=== Přístupnost metod a proměnných ===
Řádka 135: Řádka 142:
 
* Přístupnost určují obvykle modifikátory (viz syntaxe v Javě v [[Java: Modifikátory přístupu]]).
 
* Přístupnost určují obvykle modifikátory (viz syntaxe v Javě v [[Java: Modifikátory přístupu]]).
  
== Dědičnost ==
+
=== Dědičnost ===
 
* V mnoha jazycích se omezuje dědičnost na dědění maximálně z jedné třídy. Tím se vyhneme některým problémům při implementaci.
 
* V mnoha jazycích se omezuje dědičnost na dědění maximálně z jedné třídy. Tím se vyhneme některým problémům při implementaci.
  
Řádka 147: Řádka 154:
  
 
=== Abstraktní třída ===
 
=== Abstraktní třída ===
*Klíčové slovo <code>abstract</code>
 
 
*Některé metody jsou abstraktní:
 
*Některé metody jsou abstraktní:
 
**nemají tělo
 
**nemají tělo
Řádka 158: Řádka 164:
 
*„Čistě abstraktní třída“.
 
*„Čistě abstraktní třída“.
 
*Všechny metody jsou abstraktní.
 
*Všechny metody jsou abstraktní.
*Klíčové slovo <code>implements</code>.
 
 
*Třída může implementovat více rozhraní.
 
*Třída může implementovat více rozhraní.
 +
* Viz [[Java: Abstraktní třídy, dědičnost a rozhraní]]
 +
 
<div class="Poznamka">
 
<div class="Poznamka">
 
Nepleťte s pojmem „rozhraní třídy“ ve smyslu souhrnu všech metod!<br />
 
Nepleťte s pojmem „rozhraní třídy“ ve smyslu souhrnu všech metod!<br />
 
Pokud implementujeme interface, pak „slibujeme“, že součástí rozhraní třídy jsou minimálně metody, zahrnuté v interface.
 
Pokud implementujeme interface, pak „slibujeme“, že součástí rozhraní třídy jsou minimálně metody, zahrnuté v interface.
 
</div>
 
</div>
* Viz [[Java: Abstraktní třídy, dědičnost a rozhraní]]
 
  
 
<div class="Priklad">
 
<div class="Priklad">
Řádka 187: Řádka 193:
 
** některé komponenty delegují volání na další vnořené komponenty.
 
** některé komponenty delegují volání na další vnořené komponenty.
 
-->
 
-->
 +
 +
== Související stránky ==
 +
* [[Platnost proměnných]], [[Java: Zápis tříd]]
 +
  
 
== Zdroje ==
 
== Zdroje ==
 
* [http://cs.wikipedia.org/wiki/Objektově_orientované_programování Wikipedia.org > Objektově orientované programování]
 
* [http://cs.wikipedia.org/wiki/Objektově_orientované_programování Wikipedia.org > Objektově orientované programování]
 
* [http://jaksenaucitprogramovat.py.cz/cztutclass.html JakseNaucitProgramovat.py.cz > Cztutclass]
 
* [http://jaksenaucitprogramovat.py.cz/cztutclass.html JakseNaucitProgramovat.py.cz > Cztutclass]
 +
* [http://www.itnetwork.cz/java/oop ITnetwork.cz Objektově orientované programování v Javě &mdash; materiály k placenému kurzu, ale spousta materiálů je zdarma]

Aktuální verze z 3. 2. 2017, 14:09


Obsah

Co je to OOP?


Základní paradigma OOP


Cíle

Představte si, že někdo vytvořil knihovnu, která řeší obecnou úlohu (třeba ArrayList v Javě, fungující jako úložiště objektů).

Když tuto knihovnu chcete použít, potřebujete vědět:

  • hodnotu kterých proměnných můžete měnit,
  • které metody/funkce/procedury smíte volat.

To samozřejmě lze napsat do dokumentace. OOP je však vedeno snahou, aby zodpovězení těchto otázek bylo přirozenou součástí kódu.


Model systému pohledem OOP (konstrukty OOP)

Objekt
Zpráva
Rozhraní objektu/třídy
Třída
Instance
Atributy
Stav objektu


Rysy OOP

Abstrakce (abstraction)
Zapouzdření (encapsulation)
Polymorfismus (polymorphism)
Skládání (agregation)
Delegování (delegation)
Dědičnost (inheritance)


Použití konstruktů OOP v programovacích jazycích

Syntaxe Javy viz Java: Zápis tříd.

Objekty, třídy

Vytváření objektů (instancí třídy)
Konstruktor

Zprávy → metody

Metoda má
Přetěžování metod (overloading)
Překrývání metod (overlaying)
Atomizace metod

Atributy → proměnné

Instanční proměnné
Například třída UcebniSkupina může mít atribut počet žáků (kteří do dané skupiny chodí). Odpovídající proměnná musí být instanční, protože každá učební skupina může mít jiný počet žáků. (Je to vlastnost konkrétní skupiny.)
Třídní proměnné
Je-li maximální počet žáků v učební skupině dán zákonem (tedy pro všechny učební skupiny stejný), pak tento atribut budeme realizovat třídní proměnnou třídy UcebniSkupina.

Více o vztahu mezi instančními a třídními proměnnými viz: Platnost proměnných.

Přístupnost metod a proměnných

Dědičnost

Zastupitelnost tříd

Abstraktní třída

Rozhraní (interface)

Nepleťte s pojmem „rozhraní třídy“ ve smyslu souhrnu všech metod!
Pokud implementujeme interface, pak „slibujeme“, že součástí rozhraní třídy jsou minimálně metody, zahrnuté v interface.

Dědičnost × Skládání — Čítač příchodů
  • Představme si, že máme již vytvořenou třídu Kalkulacka s metodou pricti(cislo).
  • Máme vytvořit třídu CitacPrichodu, která při každém průchodu dveřmi přičte do pomocné proměnné jedničku.
  • Napadne nás, že bychom mohli použít už fungující kód třídy Kalkulacka
  • Použijeme tedy instanci třídy Kalkulacka jako atribut třídy CitacPrichodu.
  • Metoda priselZakaznik() bude delegovat volání na kalkulacka.pricti(1).
  • Dědičnost by zde nebyla vhodná, ostatní metody třídy Kalkulacka nemají být součástí rozhraní třídy CitacPrichodu.

Operátory this a super


Související stránky


Zdroje

Osobní nástroje
Jmenné prostory
Varianty
Akce
Výuka
Navigace
Nástroje