OOP po lopate - Úvod

V prvom rade si musíme povedať na čo nám takéto OOP, alebo slušne povedané Objektovo orientované programovanie vlastne je. Ak ste už niečo programovali, pravdepodobne ste programovali procedúrálne (funkcie = procedúry), inými slovami vytvárali ste funkcie, ktoré volali iné a takto ste vytvárali vaše programy.

Procedurálne programovanie v pythone:

def one_sided_pyramid(size):
  for count in range(1, size + 1):
    print("#" * count)

one_sided_pyramid(4)
"""
#
##
###
####
"""

Ak programujete dlhšie, mohli ste naraziť na problém s tým, že pri oddelovaní logiky programu do menších funkcií, aby sa sprehľadnil kód, musíte predávat iné parametre a uvedomovať si postupnosť prechodu do jednotlivých funkcií. Jednoduchá ukážka:

def soo_cool_strategy(list):
  """
  Gaming strategy
  """
  pass

def another_strategy(list):
  """
  Gaming strategy
  """
  pass


def apply_strategy_to_data(list, strategy):
  """
  Modify list and add given strategy
  """
  pass

def analyse_strategy(strategy):
  """
  Run multiple iterations on generated lists
  """
  for iteration in range(1000):
    apply_strategy_to_data(list(range(iteration, iteration ** 2 - 2 * iteration)), another_strategy)

Toto je celkom dummy príklad, ale ide tu o nasledovné: čím viac premenných, ktoré predávame dalším funkciám tým horšie. Strácame prehľadnosť, čitatelnosť a keď sa na to pozrieme o týžden a máme niečo opraviť, no…

Toto je jeden z problémov, s ktorým ste sa mohli stretnúť, tých problémov je oveľa viac, napríklad:

Poďme sa pozrieť teda na reálne problémy (zaťial pseudo-reálne) a sa riešenia v OOP:

Máme doma psíka dunča, ten nám šteká, papá, má čiernu srsť. V OOP rozmýšlame o dunčovi ako o objekte, ktorý vznikol z triedy, nejakej formičky na psíkov, ktorá vytvorila Dunča ako psíka.

Aby si to lepšie predstavili tú inštanciu, predstavme si Počítačovú hru: Otvoríte ju a spustíte novú kampaň inými slovami novú hru. Tá Počítačová hra je niečo abstrakné, čo dovtedy nemá nič čo by sa dalo hrať, nejako s tým interagovať, dokým nezačneme novú kampaň s menom nášho profilu.

Späť k nášmu príkladu, dunčo má nejaké vlastnosti, napríklad čiernu srsť, nie každý pes má čiernu srsť. Teda ten samotný pojem psíka, je niečo nekonkrétne = abstrakné, ale vieme, že ak sa narodí, vytvorí vznikne nový psík, v našom prípade Dunčo (inštancia) a ten je konkrétnym vyobrazením abstraktného pojmu pes.

Áno viem, znie to ako filozofická otázka, čo je pes, čo je to inštancia, abstraktnosť, no tak to aj je, neskôr si to objasníme.

Poďme si predstaviť, základné koncepty OOP, podrobnejšie si ich ukážeme v samostatných článkoch.

Kapsulácia (Encapsulation)

Psík reaguje na okolitý svet a naopak. A predstavme si, že to robí cez tieto funkcie, avšak pre to, aby sme rozlíšili funkcie v triede používame pojem metódy:

Zapuzdrili sme funkcie dunča do triedy psa, teda trieda Pes má tieto metódy ^. Podobne je to aj s vlastnostami psíka, ako napríklad farba jeho srsti a podobné. Ak chceme s psíkom niečo robiť, použijeme na to naše metódy ako napríklad: eat("meat"), listen(command), getFurColor(). V tomto príklade som použil aj getFurColor a to pretože o tom je enkapsulácia, zabalili sme prístupy k psíkovy do metód.

Abstraktnosť (Abstraction)

Trošku odbehneme od pojmu psíka, predstavme si publikáciu, asi sa pýtate čo pod tým myslím a tu sa dostávame k pojmu abstraktnosti. Publikácie sú rôzne môže ísť o časopis, knížku, článok… Alebo inak písacia potreba (poznámka: toto znie neskutočne čudne, neviem prečo mi to napadlo), tá môže byť rôzna: pero, fixka, ceruzka…

Dedičnosť (Inheritance)

Náš Psík je zvieratko a to má tiež nejaké metódy. Vieme, že zvieratká jedia a hrajú sa, môžeme ich využiť bez toho, aby sme ich museli implementovať do psíka, preto je vhodné použiť dedenie:

**Zviera**
- eat()
- play()

**Pes (Zviera)** # Táto zátvorka znamená, že dedí od Zvieratka
- bark()

Polymorfizmus (Polymorphism)

Ak máme nejakého psíka a mačičku tak čo majú spoločné? Obidve sú zvieratká obidve robia nejaký zvuk. Lenže tento zvuk sa mení podľa toho či je zviaratko psík, mačička, škrečok…

**Pes (Zviera)**
- makeSound() -> buff

**Mačka (Zviera)**
- makeSound() -> meow

**Zviera**
- makeSound()

Tu sme dosiahli jeden z typov polymorfizmu, ajkeď majú rovnakú metódu jej implementácia sa lýši na základe konkretného zvieratka.

Slovníček pojmov