OOP prakticky: Úvod

Tento článek není určen pro každého. Měli byste již mít základní představu o tom, co to objekty jsou a znát jejich přibližnou syntaxi v některém z běžných objektových jazyků (C#, Java, C++, stačí i PHP). Stejně tak byste už měli umět programovat, nečekejte, že vám budu vysvětlovat, jak funguje cyklus. Typický čtenář tohoto článku by měl být programátor, který se zrovna pustil do objektů, jakž takž pochopil syntaxi OOP, tuší, že existují nějaké private či public metody, chápe rozdíl mezi třídou a objektem, ale zcela mu uniká smysl OOP; zpravidla si myslí, že objekty jsou pouze zesložitění normálního programování bez žádného přínosu.

V tomto článku opravdu nebudu popisovat syntaxi OOP, článek by měl být maximálně nezávislý na použitém jazyku. Přesto použité ukázky v nějakém programovacím jazyku být musí, to dá rozum. V pseudokódu se mi to psát nechce, výsledek by byl podobný, jak kdybych zvolil nějaký běžně používaný jazyk, akorát pseudokód by si nezkompiloval vůbec nikdo. Po krátkém váhání jsem tedy zvolil C#, protože je to můj oblíbený jazyk a OOP je tam docela čitelné a jasné. Buďte rádi, že vám příklady neukazuju třeba v Lispu ;-). Pokud zrovna C# neovládáte, nebojte se, syntaxe není nijak zásadně odlišná od vašeho oblíbené jazyku, pokud zrovna nepoužíváte nějaký exotičtější jazyky. Lispaři prominou, ti se holt budou muset při čtení zdrojáků trochu víc snažit :-).

Co se v článku dovíte

V průběhu celého článku si sestavíme malou matematickou aplikaci, která bude trochu podobná kalkulačce. Tento program by měl po dokončení být schopen provádět některé jednodušší matematické úkony jako je třeba dosazení hodnoty za proměnnou, zjednodušení daného výrazu nebo třeba derivace výrazu. Celý program bude ryze objektový, aplikace budeme budovat zespoda (bottom-up) a postupně budu vysvětlovat zásadní vlastnosti OOP. Dovíte se tak, proč je výhodné na některé typy úloh používat objekty, co je to zapouzdřenost, dědičnost a polymorfismus. Všechny tyto základní kameny zároveň chytře aplikujeme na naši kalkulačku. Dost bylo planých řečí, jdeme na programování.

Co bude náš matematický editor umět

V prvé řadě bychom si měli stanovit nějaké cíle, abychom věděli, co vlastně programujeme. Naše aplikace by měla být schopna uchovávat v nějaké formě určitý matematický výraz. Pro jednoduchost předpokládejme, že by program měl být schopen rozpoznávat tyto základní matematické prvky: konstanty, proměnné, binární výrazy (třeba součet dvou čísel, či rozdíl…) a funkce. To by mohlo stačit. Dále by aplikace měla mít tyto prostředky:

  • Zjednodušení celého výrazu: Implementace může být jednoduchá – například pokud je v součinu alespoň jedna nulová konstanta, jednoduše výraz zjednodušíme na nulu, nebo může být sofistikovaná – může například převádět zlomky do základního tvaru. V článku popíši jen jednoduchou verzi, ale klidně si metody vylepšete dle libosti.
  • Dosazení hodnoty do proměnné: Aplikace by měla být schopna do výrazu „x + 5“ dosadit za proměnnou x třeba desítku a vrátit tak výraz „10 + 5“. Nemusíme se přitom držet pouze dosazování konstant, ale můžeme dosazovat klidně další výrazy.
  • Derivování: Každý námi definovaný matematický výraz by měl být schopen vrátit svou derivaci. Pokud nevíte co je to derivace, nezoufejte. Je to vcelku triviální operace, která se řídí jednoduchými vzorci. Dokud se budeme držet jednoduchých matematických výrazů (sčítání, násobení, …), bude i derivace jednoduchá a bude se opravdu jednat o pouhou aplikace vzorečku. Ty můžete najít třeba na wikipedii.
  • Textová reprezentace výrazu: Každý matematický výraz musí mít určenou svou textovou reprezentaci, abychom si tyto výrazy mohli jednoduše vypisovat do konzole, případně někam jinam.