Úvod do OOP

OOP

SSŠVT


Objektově orientované programování

V objektově orientovaném programování (OOP) je základní jednotkou programu objekt, respektive jeho třída. Jak se historicky k OOP dospělo, se dozvíte v následujících odstavcích.

  1. Úvod
  2. Procedurální programování
  3. Přechod k objektům

Úvod

Se vznikem počítačů někdy v polovině minulého století vznikaly první programovací jazyky. Nejprve se tedy programovalo "napřímo" v tzv. strojovém kódu, později vznikl assembler (jazyk symbolických adres), to ovšem bylo stále programování ve strojovém kódu, jen se instrukce procesoru zapisovaly symbolicky, svými názvy.

Příklad kódu v assembleru:

            LD HL,01af
            LD (HL),10
STARTOFF:
            XOR A
            LD B,10
            ADD B
            CP 12
            JR NZ, STARTOFF
        

Nástup vyšších programovacích jazyků, jako byly Algol, Cobol, PL1, Fortran apod., práci programátorů značně zjednodušil. Zdrojový kód programů bylo pak snadnější udržovat.


Procedurální programování

Pro řízení toku programu znáte 3 základní postupy:

Posloupnost příkazů je nejjednodušší část programu, příkazy se vykonávají jeden za druhým v tom pořadí, jak jsou v programu zapsané.

Větvení (příkaz if) použijeme, když potřebujeme část kódu provést jen v případě, že je splněna určitá podmínka. Pokud splněna není, uvedená část kódu se přeskočí, nebo se provede jiná část kódu (větev else příkazu if).

Pokud v programu potřebujeme nějakou jeho část vykonat vícekrát, použijeme cyklus. V jeho nejjednodušší formě (for cyklus) např. řekneme, že chceme vypsat na obrazovku prvky nějakého pole, na každý řádek jeden prvek. Pak tedy operace vypsání prvku na obrazovku se v cyklu zopakuje tolikrát, kolik má dané pole prvků.

Někdy se ale může stát, že nějakou část kódu potřebujeme vykonat nyní, potom dělat něco jiného, pak (třeba s malou obměnou) chceme znovu vykonat uvedenou část kódu, pak zas něco jiného a nakonec ještě jednou kód zmíněný na začátku tohoto odstavce. Je tam tedy sice opakování, ale cyklus se na tento typ úlohy nehodí.

To vedlo ke vzniku tzv. podprogramů. Podprogram je část kódu, kterou můžeme zavolat z jiného kódu. Podprogram se vykoná a řízení se potom vrátí do místa, odkud jsme podprogram zavolali. Podprogramům dnes říkáme procedury a funkce.

Rozdíl mezi procedurou a funkcí je v tom, že funkce je podprogram, který vrací hodnotu, kdežto procedura žádnou hodnotu nevrací.

Příklad procedurálního programování s voláním podprogramu (procedury) v pseudojazyce "Karel":

DOKUD NENI ZED
    KROK
KDYZ JE ZED
    OTOC VPRAVO
    KROK
    KROK
ROZHLEDNI-SE
DOKUD NENI ZED
    KROK
ROZHLEDNI-SE
KONEC

PROG ROZHLEDNI-SE
    OTOC VPRAVO
    ZJISTI CO JE PRED TEBOU
    OTOC VPRAVO
    ZJISTI CO JE PRED TEBOU
    OTOC VPRAVO
    ZJISTI CO JE PRED TEBOU
    OTOC VPRAVO
    ZJISTI CO JE PRED TEBOU
KONEC ROZHLEDNI-SE
        

Přechod k objektům

Aby byly procedury a funkce flexibilnější, mohou se do nich předávat hodnoty, kterým říkáme parametry. Parametry mírně, nebo i značně upravují chování podprogramu. Zároveň nemusíme psát na každý konkrétní případ extra podprogram.

Příklad upravené procedury ROZHLEDNI-SE s parametrem směru:

ROZHLEDNI-SE VPRAVO
KROK
KROK
ROZHLEDNI-SE VLEVO

PROG ROZHLEDNI-SE SMER
    OTOC PODLE SMER
    ZJISTI CO JE PRED TEBOU
    OTOC PODLE SMER
    ZJISTI CO JE PRED TEBOU
    OTOC PODLE SMER
    ZJISTI CO JE PRED TEBOU
    OTOC PODLE SMER
    ZJISTI CO JE PRED TEBOU
KONEC ROZHLEDNI-SE
        

Procedurální programování ovšem funguje trochu jako recept na vaše oblíbené jídlo. Když si chcete jídlo uvařit, musíte jít krok za krokem přesně podle receptu. Nic nevynechat, nic neudělat vícekrát, dodržet pořadí kroků.

Reálný svět a jeho problémy, které v programování řešíme, je ale složitější. Je v něm více aktérů (lidé, zvířata, stroje, příroda apod.), kteří se chovají vzájemně nezávisle, rozhodně aspoň částečně.

Objektově orientované programování přišlo s myšlenkou, že v počítačovém programu budeme modelovat náš svět věrněji, a to právě pomocí objektů.

Objekty reprezentují aktéry reálného světa. Například máme dva lidi, muže a ženu, a auto, kterým tito lidé chtějí odjet. Muž požádá ženu, aby odemkla auto, žena auto odemkne, muž ji znovu požádá, aby mu podala klíčky od startéru, žena mu klíčky podá. Muž i žena nastoupí do auta. Muž usedne za volant a nastartuje motor. Potom spolu odjedou.

To, že někdo někomu něco řekne (muž ženě), někdo někomu něco podá (žena muži), nebo někdo s něčím něco udělá (muž nastartuje auto), modelujeme v programu, kde jsou objekty, tím, že tyto objekty si mezi sebou posílají zprávy.

Objekt A (muž) pošle objektu B (žena) zprávu typu Say (něco někomu říci) s parametrem what ("podej mi klíčky, prosím"). Objekt B pošle objektu A zprávu typu Pass (někomu něco podat) s parametrem what ("klíčky"). Objekt A (muž) pošle objektu C (auto) zprávu typu GetOn (nastoupit) a pak ještě objekt A pošle objektu C zprávu typu Start (nastartovat něco) s parametrem what ("motor"). Objekt, kterému zpráva přijde, na ni musí nějak zareagovat. Musí požadavek vyřídit.

Vyřízení zprávy je vlastně opět nějaký postup, nějaký podprogram, třeba procedura. V OOP říkáme místo podprogram, procedura nebo funkce vždy pouze metoda. Posílání zprávy nějakému objektu rovná se v C# volání metody tohoto objektu. Vyřízení zprávy znamená vykonání těla metody (příkazů v jejím bloku).

Pokud se při analýze zadání aplikace podaří části aplikace dobře "rozbít" (rozložit) na rozumně velký počet rozumně velkých objektů, získáme tím minimálně tyto výhody: