Oop

27th Jul 2026

Základné princípy OOP (4 piliere)

  • Abstrakcia (Abstraction)
  • Dedičnosť (Inheritance)
  • Zapuzdrenie (Encapsulation)
  • Polymorfizmus (Polymorphism)

Abstrakcia

  • Skrytie zložitosti a zobrazenie len podstatného
  • Používateľ vidí čo objekt robí, nie ako

Príklad:

  • Auto → vodič používa volant, pedále
  • Nepotrebuje vedieť, ako funguje motor

Kompozícia vs. dedičnosť

  • Dedičnosť → „je typu“ (is-a)
  • Kompozícia → „má“ (has-a)

Príklad:

  • Auto motor → kompozícia
  • Pes je zviera → dedičnosť

Dedičnosť (Inheritance)

  • Znovupoužitie kódu z inej triedy
class Animal:
    def speak(self):
        return "Zvuk"

class Dog(Animal):
    def speak(self):
        return "Haf"

Zapuzdrenie (Encapsulation)

  • Obmedzenie prístupu k interným dátam
  • Použitie chránených / súkromných atribútov
class BankAccount:
    def __init__(self, balance):
        self._balance = balance  # chránený atribút

    def deposit(self, amount):
        self._balance += amount

  • definujeme rozhranie - spôsob práce s objekttom.

Metódy rozdelíme na verejné a súkromné.

Verejné metódy sú súčasťou rozhrania.

Súkromné metódy je možné meniť bez toho aby sa menilo rozhrnaie.


Rozhrania, Viacnásobná dedičnosť


Slide 22 – Duck Typing

  • „Ak to vyzerá ako kačka a kváka ako kačka, je to kačka“
  • Nezáleží na type, ale na správaní
def print_area(obj):
    print(obj.area())
  • Funguje pre každý objekt, ktorý má area()

Polymorfizmus

  • Rovnaké rozhranie, rôzne správanie
for animal in [Dog(), Animal()]:
    print(animal.speak())

Návrhové vzory

Slide 23 – Singleton Pattern

  • Návrhový vzor: iba jedna inštancia triedy
  • Použitie:

    • konfigurácia
    • pripojenie k databáze
    • logging

Slide 24 – Implementácia Singletonu

class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

Slide 25 – Použitie Singletonu

a = Singleton()
b = Singleton()

print(a is b)  # True
  • Vždy dostaneš rovnaký objekt

Slide 27 – Factory Pattern

  • Návrhový vzor na vytváranie objektov
  • Oddelí:

    • vytváranie objektu
    • od jeho použitia
  • Klient nemusí vedieť, ktorú konkrétnu triedu vytvára

Slide 29 – Jednoduchá Factory

class Dog:
    def speak(self):
        return "Haf"

class Cat:
    def speak(self):
        return "Mňau"

def animal_factory(animal_type):
    if animal_type == "dog":
        return Dog()
    elif animal_type == "cat":
        return Cat()
    else:
        raise ValueError("Neznámy typ zvieraťa")

Slide 30 – Použitie Factory

animal = animal_factory("dog")
print(animal.speak())
  • Klient nevie, aká trieda sa vytvorila
  • Používa len spoločné rozhranie (speak())

Best Practices

  • Dodržiavaj princíp SRP (Single Responsibility)
  • Používaj zmysluplné názvy tried
  • Nepreťažuj triedy (keep it simple)
  • Preferuj kompozíciu pred dedičnosťou

Slide 46 – SOLID princípy (prehľad)

  • S – Single Responsibility
  • O – Open/Closed
  • L – Liskov Substitution
  • I – Interface Segregation
  • D – Dependency Inversion

Slide 47 – Príklad porušenia SRP

class User:
    def save_to_db(self):
        pass

    def send_email(self):
        pass
  • Trieda robí príliš veľa vecí → zlá prax

Slide 48 – Lepší návrh

class User:
    pass

class UserRepository:
    def save(self, user):
        pass

class EmailService:
    def send(self, user):
        pass

Next Post

Oop