Jedným z hlavných princípov OOP je **princíp zapuzdrenia**, ktorý hovorí, že komplexné problémy by sa mali rozdeliť na mnoho malých problémov, ktoré môžeme riešiť nezávisle a súčasne. Zároveň nás ako používateľov nezaujíma, ako sa to deje, a údaje (vnútorný stav) zostávajú izolované.
Ak napríklad riešime problém, ako vrátiť výsledok 1,6
na základe používateľského dotazu s výrazom (5+3)*(2/(7+3))
, pravdepodobne nikto z nás nedokáže napísať jedinú funkciu alebo metódu, ktorá by tento problém vyriešila naraz.
TIP: Hotové riešenie takéhoto typu príkladu je v článku Spracovanie matematického výrazu ako reťazca, ale pripravte sa na to, že to nie je jednoduché.
Vďaka zapuzdreniu budete môcť objekty používať "ako používateľ", to znamená, že budete volať ich metódy a nebudete sa vôbec starať o to, ako fungujú vo vnútri.
Predpokladajme, že sa zaoberáme výpočtom platu zamestnanca a chceme na to použiť existujúcu triedu od iného programátora. Potrebujeme poznať len povinné parametre konštruktora a môžeme triedu "jednoducho použiť":
$mzda = new MzdaZamestnance(25000, // hrubá mzda6, // počet rokov v spoločnosti10, // počet rokov praxetrue // je to muž?);echo $mzda->getHruba(); // 25000echo $mzda->getCista(); // 17800
Parametre objektu sú fiktívne a reálne nezodpovedajú spôsobu výpočtu mzdy. Tento princíp ilustruje najmä skutočnosť, že stačí poznať všeobecné verejné rozhranie a nemusíme sa zaoberať ani interným stavom objektu, dokonca ani internou implementáciou a už vôbec nie tým, prečo funguje tak, ako funguje. Jednoducho zavoláme metódu getCista()
a získame čistú výplatu.
Je dôležité poznamenať, že samotné zapuzdrenie nie je vlastnosťou alebo syntaxou jazyka. To, že je trieda a aplikácia zapúzdrená, je len záležitosťou programátora, ktorý aplikáciu navrhuje a premýšľa o kóde.
Vždy uvažujte o dizajne triedy týmto spôsobom:
Pre vlastnosti a metódy, ktoré sa týkajú vnútornej logiky, má zmysel nastaviť viditeľnosť ako private
. Hlavnou výhodou je, že nebudú volané zvonku a používateľ bude nútený používať vami navrhnuté rozhranie, čím sa ochránia údaje a vnútorný stav objektu.
Majme napríklad objekt predstavujúci bankový účet, na ktorom chceme zaúčtovať platby a pracovať s aktuálnym zostatkom:
class BankAccount{private int $sum;public function __construct(int $startSum){$this->sum = $startSum >= 0 ? $startSum : 0;}public function getSum(): int{return $this->sum;}public function pay(int $price): void{$newSum = $this->sum - $price;if ($newSum < 0) {throw new \Exception("Nemáš toľko peňazí!);}$this->sum = $newSum;}public function addMoney(int $money): void{$this->sum += $money;}}
Všimnite si, že trieda obsahuje len jednu private
vlastnosť $sum
, ktorá obsahuje aktuálny zostatok.
Ak chceme získať aktuálny zostatok, existuje na to metóda getSum()
, ale nemáme možnosť zmeniť novú hodnotu zostatku. Peniaze môžeme odstrániť len pomocou metódy pay()
alebo pridať pomocou metódy addMoney()
.
Vďaka tomuto princípu máme vždy istotu, že objekt nikto nemôže rozbiť.
Ak sa používateľ pokúsi zaplatiť viac peňazí, ako je v skutočnosti na účte, metóda pay()
to nedovolí, pretože pred prepísaním vlastnosti $sum
vykoná kontrolný výpočet, a ak by mal byť zostatok záporný (menší ako nula), vyhodí sa chybová výnimka a operácia sa zastaví.
Ukázali sme si základný princíp zapuzdrenia, ktorý nám umožňuje lepšie uvažovať o objektovej abstrakcii a prináša úplne nový pohľad.
Keď tento princíp dobre pochopíte, uvidíte, že frameworky začínajú dávať obrovský zmysel, pretože interne zapuzdrujú množstvo šikovnosti, ktorú môžete jednoducho použiť.
Nabudúce sa pozrieme na dedicacy and visibility.
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | sk