Blog | FP a OOP nejsou slučitelné

FP a OOP nejsou slučitelné

Už jsem o tomto tématu jednou psal, ale mám pocit, že to nedorozumění pořád pokračuje.

Dnes se je pokusím znovu vyvrátit.

Jádrem je, že si lidé myslí, že když můžou nad objektem zavolat map, nebo filter, že to je TO funkcionální programování.

Ale ono není.

Tak například příslibem objektového programování je to, že mám objekty, které jsou zaměnitelné, samostatně funkční a mělo by stačit znát jejich public interface k tomu, aby je vývojář uměl použít. O další věci (jako vnitřní stav objektů) se starat nemusí.

Důsledkem toho, že se vystavuje chování, je fakt, že se stav rozdrobuje do třeba stovek objektů.

Funkcionální programování takhle nefunguje. Tam platí jednoznačně to, že vývojáři vytlačují stav ven a koncentrují ho v minimálním počtu míst. Je běžné, že některé služby jsou zcela bezstavové, nebo uchovávají stav v jedné proměnné.

Vytáhnout stav ven z objektů je dokonale antiobjektové chování.

Další důležitou součástí funkcionálního programování jsou důsledky snahy dělat pure funkce.

V pure FP platí, že když zaměním zavolání funkce jejím výsledkem, nic se nestane. I v ne-pure jazycích vývojáři svůj kód organizují tak, aby toto platilo v co největším kusu aplikace.

Je to jeden z důvodů, proč se často říká, že v FP není potřeba Dependency Injection. Funkce je funkce. Matematika a tak. Prostě proč bych si injectoval (pro potřeby testování) vlastní funkci plus? A jako je funkce plus závislá pouze na svých vstupech, tak má naprosto konzistentní a předvidatelné výsledky. To, že ji nevymockuju, mi při vývoji nedělá žádný problém. Není to ale úplná pravda a někdy se DI hodí, ale naštěstí nebývá problém udělat funkci High Order Funkcí a to skutečně potřebné si předávat.

Proti tomu v OOP máme koncept toho, že pošleme objektu zprávu. A objekt je chytrá černá skříňka, která nějak zareaguje. Může se změnit. Může něco vrátit. A pokaždé může vrátit něco jiného. Taky může třeba vteřinu počkat a pak něco vrátit.

Zasílání zpráv, kdy nevíme, co se pak stane a jestli se nám něco vrátí versus zavolání funkce zkrátka není totéž. Mnoho jazyků má podobnou syntaxi pro definici funkce a metody, ale mentálně se jedná o velmi odlišnou věc.

Funkce nezná žádné okolo (ignorujeme-li věci jako globální proměnné). Dostane parametry a vždy vrátí totéž. To není jen věc FP, tohle je slušnost i v Pascalu.

Metoda nějak pracuje s jinými objekty, s atributy a způsob, jak může zareagovat, je mnohem širší.

Ano, i Erlang je v podstatě objektový jazyk. Má actory, kteří si zasílají zprávy. Ale právě ta část kolem actorů a posílání zpráv nemá zase vůbec nic společného s FP. V FP píšete funkce (a pak je ten kód funkcionální) nebo actory (a pak je objektový). Actor, ač sdílí syntaxi s funkcí, není funkce. Je to obvykle rekurzivní stavový automat závislý nejen na parametrech, které si předává, ale i na stavu dalších actorů (obvykle dalších rekurzivních stavových automatů) a na tom, jak „příroda“ seřadí příchozí zprávy na mailboxu daného actora. Tohle fakt nemá s FP nic společného.

V určitou chvíli si vývojář musí vybrat, kterou cestou se vydá.

Buď bude kód rozbíjet do mnoha malých krabiček, které se o sebe postarají samy a navzájem si posílají zprávy. To nemůže nikdo považovat za FP kód.

Nebo se stavu téměř zbaví, dostane do 1 místa to, co ze stavu zbylo a kolem toho vytvoří aparát funkcí, které jsou referenčně transparentní a jen minimum funkcí má nějaké side effecty. To znamená mnohdy porušovat zapouzdření, mainstream OOP je určitě úplně jinde a ikdyž to takhle někdo zkusí udělat, tak mu do toho budou zasahovat stažené knihovny, které to budou porušovat (smutná realita např. světa JS, kdy vy sice můžete uzavřít stav do mori, ale stejně skoro vše, co si z internetu stáhnete, si bude udržovat stav v objektech).

Předejte zkušenosti i dalším a sdílejte tento článek!



Jiří Knesl
Business & IT konzultant

Jiří Knesl poprvé začal programovat v roce 1993. Od té doby, díky skvělým učitelům a později zákazníkům, měl možnost neustále růst v oboru vývoje webových aplikací a informačních systémů. v roce 2002 se přidal zájem o ekonomii a v roce 2006 o organizaci práce. Vším tím se konstantně profesně zabývá jak ve svém podnikání, tak i u zákazníků. Za posledních 5 let vydal na tato témata přes 400 článků.

Prohlédněte si moje reference

Mám zkušenosti z rozsáhlých projektů pro korporace, velké podniky, střední i malé firmy, ale i pro startupy v cloudu. Zvyšoval jsem jejich know-how, pomáhal nastavovat jejich organizační strukturu, byl lektorem a mentorem v náročných situacích. Podívejte se, jak vidí můj přínos samotní klienti.

Sledujte mé postřehy na sociálních sítích