OOP po lopate - Kapsulácia
Tento pojem je niekedy spojovaný aj s “data hiding”, teda so skrývaním dát. Aby sme porozumeli tomu prečo to tak je, použijeme na to ukážku v pythone.
class User:
def __init__(self, name, age):
self.name = name
self.age = age
def set_name(name):
self.name = name
def get_name():
return self.name
def set_name(name):
self.name = name
def get_name():
return self.name
Všimnime si, že na to aby sme mohli pracovať s name, age
, nám trieda poskytuje get a set metódy. Tieto metódy
označujeme logicky gettery a settery, no načo sú nám dobré?
Nachvíľu budeme ignorovať čo je to viditeľnosť, tak ako python, pozrime sa na nasledujúci príklad.
jozko = User('Jozko Mrkvicka', 22)
# Niekde hlbšie v programe
jozko.age = "asd" # Toto nechceme
jozko.set_age('asd')
# Thrown exception....
Tento kód hovorí, o tom, že niekde v našom kóde nastala situácia, kedy sa do atribútu age dostal string, čo reálne nechceme, pretože chceme, aby sa s našou triedou User interagovalo cez naše gettery/settery. Kde môžeme mať veci ako napríklad: zmenu jozko mrkvicka na Jozko Mrkvička, alebo by naša trieda držala ešte nejaký vnútorný objekt, cez ktorý by sme vedeli pracovať len cez gettery ako napríklad:
class User:
# ...
def get_number_of_rent_books():
return len(self.rent_books)
print(jozko.get_number_of_rent_books())
Takže v skratke:
Keď nechceme, aby sa nám niekto nehral s atribútmi, zakapsulujeme si naše premenné do triedy a vytvoríme napríklad gettery a settery. A pre úplne ujasnenie ešte obrázok:
https://javatutorial.net/java-encapsulation-example