Elementárním prvkem programu vytvořeného pomocí objektového programování je objekt. Objekt je zpravidla koncepčně ucelený soubor proměnných a funkcí pro práci s nimi. Proměnné objektu se nazývají atributy a jeho funkce metody. Programovací jazyk lze považovat za objektový, když podporuje datové abstrakce (1), tvorbu typů (2) a jejich hierarchií (3). Přesněji řečeno:
Objektově orientované programování umožňuje práci v různých úrovních abstrakce. Také dramaticky zvyšuje znovupoužitelnost kódu díky modularitě na úrovni objektů. Každý objekt nebo skupina objektů může být považována za samostatný modul, který lze použít i bez znalosti její vnitřní struktury (ta se může dokonce i v průběhu času nezávisle měnit).
Historie objektově orientovaného programování začala v šedesátých letech 20. století. Prvním programovacím jazykem s třídami a objekty byla Simula 67, za jejímž vznikem stáli dva norští vědci (Kristen Nygaard, Ole-Johan Dahl). Tento jazyk byl původně určen k simulaci interakcí několika lodí.
Simula 67 inspirovala několik vědců z firmy XEROX, kteří následně vytvořili vlastní jazyk Smalltalk a začali jako první používat termín „objektově orientované programování“. Simula 67 silně ovlivnila i Bjarne Stroustrupa při návrhu jazyka C++.
Robustní software by se měl chovat korektně za všech okolností, tedy vracet správné výstupy pro správné vstupy a rozumně reagovat i na ty nesprávné. Program by také pokud možno měl být připraven i na neočekávané události – nekorektní ukončení, ztrátu spojení, nenalezený soubor, nedostatek paměti, apod. Softwarové chyby mohou mít i smrtelné následky. Například v letech 1985 – 1987 ozářil lékařský přístroj Therac-25 šest pacientů, ze kterých tři zemřeli na přímé následky. Všech šest selhání bylo způsobeno nedostatečnou robustností programu.
Některé programy jsou používané nepřetržitě i několik let. Jsou to například bankovní systémy, operační systémy, prohlížeče, ovladače a firmware. Proto musí být možné tento software neustále modifikovat a vylepšovat s minimálním úsilím a rizikem. Přizpůsobitelný software je také možné jednodušeji přenášet na jiné platformy.
Stejný kód použitý v různých částech systému snižuje jeho složitost, a tak i náklady na jeho vývoj. Stejně tak je možné kód přenášet i mezi projekty. Často přenášený kód bývá dobře otestovaný v praxi. Touto cestou jdou různé frameworky, které si kladou za cíl usnadnit vývoj nového softwaru a přispět k vyšší disciplinovanosti vývojářů. Projekty na nich postavené ale na druhou stranu přebírají i všechny jejich nedostatky a zvyšují závislost na třetí straně.
Objekt je základní a nedělitelnou jednotkou objektově orientovaného programování. Každý objekt může představovat skutečný objekt z reálného světa, ale není to podmínkou. Obecně lze však říci, že se jedná o ucelený soubor proměnných a funkcí pro práci s nimi. Každý objekt obsahuje přesně definované veřejné rozhraní, pomocí kterého s ním může komunikovat vnější svět – například zasíláním zpráv nebo voláním metod.
Třída je schéma, které formálně popisuje vnitřní strukturu objektu a jeho vnější rozhraní. Některé jazyky mají schopnost modifikovat třídy za běhu nebo číst jejich strukturu. Tato schopnost se nazývá reflexe.
Instance třídy je datová struktura v paměti počítače, vytvořená na základě dané třídy. Jednotlivé instance se od sebe liší umístěním (adresou) v paměti a hodnotami svých atributů (proměnných). Adresu aktuální instance mívá programátor v objektově orientovaných jazycích k dispozici pod speciálním klíčovým slovem (např. this nebo self).
Typ je velmi abstraktní pojem, který se v objektovém programování používá jako prostředek pro omezení množiny hodnot, kterých může nabývat určitá proměnná . Toto dobrovolné omezení slouží ke kontrole korektnosti programu a jeho dokumentaci. Ve většině programovacích jazyků jsou některé základní typy (řetězec, číslo, objekt, atd.) předdefinovány a nové typy se vytváří jejich rekurzivním skládáním.
Zobecnění potlačuje rozdíly mezi třídami a zdůrazňuje společné vlastnosti.
generalizace versus specializace
Klasifikace potlačuje detaily instancí a zdůrazňuje vlastnosti třídy jako celku.
klasifikace versus instanciace
Kompozice potlačuje detaily komponent a zdůrazňuje rysy celku.
kompozice versus dekompozice
Seskupování potlačuje rozdíly jednotlivých objektů ve skupině a zdůrazňuje skupinu jako celek.
seskupování versus individualizace
Dědičnost je prostředek pro znovupoužití kódu. Umožňuje vytvářet hiearchie mezi třídami. Třída výše v hierarchii se nazývá předek (nadřída, superclass) a třída níže v hierarchii potomek (podtřída, subclass). Potomek může mít i více předků, což někdy vede na tzv. problém diamantu. Proto se ve většině jazyků používá dědičnost jednoduchá. Řešením jsou i tzv. traity, které zjemňují granularitu objektového kódu.
Úspora kódu při vhodném použití dědičnosti je zajištěna tak, že se v potomkovi (C) uvádí jen změny (delta P), které jej odlišují od předka (P).
€€ C = P + \delta P €€Dědičnost umožňuje programátorovi:
Použitím dědičnosti by neměl být porušen tzv. substituční princip Liskové (Liskov substitution principle).
Objektový návrh je proces převedení konkrétní úlohy na množinu tříd. Převod vzniká na základě modelování daného problému pomocí objektů. Tato úloha se ukázala jako natolik obtížná, že se vyvinula v samostatný obor. Při objektovém návrhu se často využívají různé obecné postupy a principy, které mají za cíl pomoci k dosažení vyšší kvality výsledného návrhu.
Následující příklady ilustrují některé zmíněné pojmy v jazyce Java.
Nejprve vytvoříme třídu Car (auto). U auta budeme sledovat jeho značku a typ (type) a rychlost (velocity). Dále se u aut chceme dozvědět, zda uvezou náklad o dané hmotnosti (metoda canCarryCargo()). Obyčejné auto obecné neuveze nic, a tak vždy vrátíme false.
kód v jazyce Java - Zobrazit jako TXT, HTML, HTML (okno)
Nyní využijeme dědičnosti a na základě třídy Car vytvoříme potomka Lorry (dodávka). Tak vytvoříme speciální druh automobilu, který uveze jakýkoliv náklad až do maximální povolené hmotnosti (maxWeight).
kód v jazyce Java - Zobrazit jako TXT, HTML, HTML (okno)
Nejprve nadefinujeme nejobecnější třídu Person (osoba). Každá osoba bude mít jméno (name) a příjmení (surname). Mohli bychom ještě přidat například datum narození, trvalé bydliště, zemi, zájmy… zkrátka vše, co potřebujeme a co lze pozorovat u každé osoby. Není však vhodné přidávat proměnné jako je plat (salary), protože ne každá osoba pracuje – například některé děti nebo křováci.
kód v jazyce Java - Zobrazit jako TXT, HTML, HTML (okno)
Pro vytvoření seznamu zaměstnanců nás zajímá pracovní pozice (job), plat (salary) a oddělení (department). Každý zaměstnanec by měl tyto údaje mít. Zároveň je každý zaměstnanec nepochybně osobou – alespoň do doby, než začneme zaměstnávat roboty nebo mimozemšťany.
kód v jazyce Java - Zobrazit jako TXT, HTML, HTML (okno)
Speciálním druhem zaměstnance je vedoucí či manažer (manager). Ten se od obyčejného zaměstnance vyznačuje tím, že má pod sebou nějaké podřízené. Zároveň je však každý vedoucí i obyčejným zaměstnancem.
kód v jazyce Java - Zobrazit jako TXT, HTML, HTML (okno)
Nyní vytvoříme seznam všech pracovníků a ukážeme si práci s polymorfizmem. Ten umožní se zaměstnanci (Employee) pracovat jako s osobami (Person) a s vedoucími (Manager) jako zaměstnanci i osobami. Všimněte si, že třída A, která dědí od třídy B, od ní zároveň přebírá i veškerou dědičnost.
kód v jazyce Java - Zobrazit jako TXT, HTML, HTML (okno)
Abstraktní třída je speciální třída, která je navržena jako společný základ pro jiné třídy a není možné vytvářet její instance. Navíc je v ní možné definovat tzv. abstraktní metody, což jsou jen hlavičky metod bez implementace. Neabstraktní potomci abstraktní třídy musí tyto metody povinně implementovat.
Nejprve vytvoříme abstraktní třídu Shape (rovinný útvar), který si bude pamatovat svou pozici (x, y). U každého klasického rovinného útvaru lze bezpochyby spočítat obvod (metoda getPerimeter()) a obsah (metoda getArea()). Útvar lze i vykreslit na obrazovku (metoda draw()). U těchto metod však nemůžeme napsat přesnou implementaci, protože se pro každý útvar může lišit. Proto je deklarujeme jako abstraktní (modifikátor abstract).
kód v jazyce Java - Zobrazit jako TXT, HTML, HTML (okno)
Nyní implementujeme třídu Rectangle (obdélník). Ta již abstraktní není a proto musí implementovat všechny abstraktní metody, které zdědila. K výpočtu a vykreslení obdélníku musíme znát šířku (width) a výšku (height).
kód v jazyce Java - Zobrazit jako TXT, HTML, HTML (okno)
Dále naimplementujeme třídu Circle (kružnice). Podobně jako obdélník také musí implementovat všechny zděděné abstraktní metody. K výpočtu a vykreslení kružnice musíme znát její poloměr (r).
kód v jazyce Java - Zobrazit jako TXT, HTML, HTML (okno)
Krátká ukázka použití, například v grafickém editoru.
kód v jazyce Java - Zobrazit jako TXT, HTML, HTML (okno)