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:

1200x700

https://javatutorial.net/java-encapsulation-example