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 má 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