Mnozí programátoři a „programátoři“ se staví k OOP (objektově orientované programování ne „Organizace pro Osvobození Palestiny“) jako k všeléku na všechny jejich problémy při vývoji. Mnozí, i přestože používají plně objektový jazyk, píší neobjektový kód, kdy vše co potřebují napíší do jediného objektu a vytvoří pouze strukturovaný kód.
Jaké jsou výhody používání OOP?
Objektově orientované programování stojí na několika pilířích:
- Objekty – jednotlivé prvky modelované reality (jak data, tak související funkčnost) jsou v programu seskupeny do entit, nazývaných objekty. Objekty si pamatují svůj stav a navenek poskytují operace (přístupné jako metody pro volání).
- Abstrakce – programátor, potažmo program, který vytváří, může abstrahovat od některých detailů práce jednotlivých objektů. Každý objekt pracuje jako černá skříňka, která dokáže provádět určené činnosti a komunikovat s okolím, aniž by vyžadovala znalost způsobu, kterým vnitřně pracuje. Toto je velká výhoda objektového přístupu.
- Zapouzdření – zaručuje, že objekt nemůže přímo přistupovat k „vnitřnostem“ jiných objektů, což by mohlo vést k nekonzistenci. Každý objekt navenek zpřístupňuje rozhraní, pomocí kterého (a nijak jinak) se s objektem pracuje.
- Skládání – Objekt může využívat služeb jiných objektů tak, že je požádá o provedení operace.
- Dědičnost – objekty jsou organizovány stromovým způsobem, kdy objekty nějakého druhu mohou dědit z jiného druhu objektů, čímž přebírají jejich schopnosti, ke kterým pouze přidávají svoje vlastní rozšíření. Tato myšlenka se obvykle implementuje pomocí rozdělení objektů do tříd, přičemž každý objekt je instancí nějaké třídy. Každá třída pak může dědit od jiné třídy (v některých programovacích jazycích i z několika jiných tříd).
- Polymorfismus – odkazovaný objekt se chová podle toho, jaký je jeho skutečný typ. Pokud několik objektů poskytuje stejné rozhraní, pracuje se s nimi stejným způsobem, ale jejich konkrétní chování se liší. V praxi se tato vlastnost projevuje např. tak, že na místo, kde je očekávána instance nějaké třídy, můžeme dosadit i instanci libovolné její podtřídy (třídy, která přímo či nepřímo z této třídy dědí), která se může chovat jinak, než by se chovala instance rodičovské třídy, ovšem v rámci mantinelů, daných popisem rozhraní.
Proč je tedy nepoužívám v PHP?
Jsem zastánce jednoduchosti a rychlosti. Nepracuji na PHP kódu ve velikém teamu, proto nemám problém s prací s funkcemi a proměnými tak jak jsou v jednoduchém kódu.
Rychlost je pro mě hlavním důvodem, proč je nepoužívat. Režie vytváření instancí a mnohonásobných dědění je poměrně značná. PHP je interpretovaný jazyk používaný v drtivé většině případů pro vývoj webových stránek (ano vím, lze v něm psát i CLI, nebo GUI programy), což znamená, že každé načtení stránek vytváří objekty a po ukončení scriptu jsou tyto rušeny a uvolňovány z paměti. PHP v tomto případě nevytváří objekty, které by byly perzistentní v paměti.
Edit: Po čase používám
Nakonec jsem objektovému programování v PHP podlehl. Od PHP4 uplynula tak dlouhá doba, že nemusím řešit kompatibility a PHP7 má natolik dobře přepsané jádro, že „výkonostní penalizace“ je naprosto zanedbatelná.