funkcionálně.cz

Přední český blog o funkcionálním programování, kde se o funkcionálním programování nepíše
««« »»»

Co je vůbec objektové a funckionální programování?

6. 9. 2013 (před 6 lety) — k47

Dlou­hou dobu jsem ne­chá­pal ob­jek­tové pro­gra­mo­vání. Věděl jsem, co to je a jak ho po­u­ží­vat, ale ne­chá­pal jsem ho na zá­kladní úrovni, chyběl mi hlu­boký vhled do hlav­ních myš­le­nek, tedy to, o co se vždycky snažím: ne­klouzat po po­vrchu, ale pro­nik­nout přímo do epi­cen­tra a odtud se pro­pra­co­vá­vat směrem ven.

Zá­sadní myš­lenky jsou to nej­dů­le­ži­tější, a musíme je znát, abychom sku­tečně po­cho­pili, co nám to které pa­ra­digma při­náší. Bo­hu­žel tyhle zá­klady často vní­máme po­krou­cené skrz optiku jazyka, které se k danému pa­ra­dig­matu hlásí. Ideu na­hra­zu­jeme ar­te­fak­tem. In­ter­face im­ple­men­tací.

Java je po­pu­lární ob­jek­tově ori­en­to­vaný jazyk, takže když známe Javu známe OOP, žejo?

Ani v nejmen­ším. Javě jako jazyku a kul­tuře, která kolem něj vy­rostla, se po­da­řilo zde­for­mo­vat pojem OOP. Za­vedla vlastní ter­míny a pojmy a abs­trakce a ar­te­fakty a vzory, které se OOP týkají jenom okra­jově, ale vět­ši­nové pu­b­li­kum je při­jalo jako pod­statu OOP. Já jsem nebyl vý­jim­kou.

Jaké jsou tedy ty hlavní myš­lenky OOP a FP?

Jsou to ty, kterým se daný styl pro­gra­mo­vání od­li­šuje od všech ostat­ních.


Nej­dů­le­ži­tější ideou ob­jek­to­vého pro­gra­mo­vání je po­ly­mor­fis­mus (a s ním spo­jený late bindind).

Někdo uvádí, že gró OOP leží v po­jmech iden­tita, za­pouz­dřeníkom­po­zice, ale myslím si, že to není tak úplně pravda.

Za­pouz­dření je fakt, že objekt má svůj pro­to­kol, který spe­ci­fi­kuje mno­žinu zpráv na které umí od­po­vět a není jiný způsob jak se po­dí­vat přímo do útrob ob­jektu. Ale aby to mělo smysl, po­tře­buje po­ly­mor­fis­mus – tedy mož­nost, že na jednu zprávu může každý objekt od­po­vě­dět po svém. Kdy­bychom ho něměli, pak by za­pouz­dření ne­dá­valo smysl, pro­tože by šlo jenom o jiný fixní pohled na in­terní data. Každý po­ly­morfní objekt může být in­terně re­pre­zen­to­ván zcela od­lišně, ale s osta­ními částmi sys­tému ko­mu­ni­kuje stej­ným pro­to­ko­lem.

Kom­po­zice je způsob jak or­ga­ni­zo­vat části pro­gramu a je to zase po­ly­mor­fis­mus, který umož­ňuje, aby jeden objekt od­po­ví­dal přímo a jiný akci de­le­go­vat na jiný objekt.

Iden­tita je zá­keřná mrcha, která neje­nom, že není zá­sadní, ale je do­konce na škodu. Jde o pro­ble­ma­tický kon­cept, pro­tože nás nutí pře­mýš­let v rámci ob­jektů, které exis­tují jako kon­krétní místa v paměti a ne v rámci uni­ver­zálně plat­ných dat a faktů. Také přímo navádí k pro­gra­mo­vání s mě­ni­tel­ným stavem (a po­zo­ro­va­telný mě­ni­telný stav je špatný, pro­tože do pro­gramů vnáší zby­teč­nou slo­ži­tost, často způ­so­be­nou tím, že spolu nějaké části pro­gramu ko­mu­ni­kují změ­nami sdí­le­ného stavu a ko­mu­ni­kaci by v OOP měla pro­bí­hat jedině pro­střed­nic­tvím zpráv). Iden­tita se dá si­mu­lo­vat v sys­té­mech, které ji nemají (id sloupce v re­lač­ních da­ta­bá­zích) a naopak se dá za­po­me­nout v sys­té­mech, které ji mají (de­fi­nuji vlastní pro­to­kol, který se k ob­jek­tům chová jako k hod­no­tám). Za­jí­mavě se k tomuto pro­blému staví Con­cept-ori­en­ted pro­gra­m­ming, které zcela od­dě­luje pojmy objekt a iden­tita.

Typy pak v OOP světě slouží jako (sta­ticky ově­ři­telná) kla­si­fi­kace ob­jektů. Když objekt má daný typ, zna­mená to, že umí od­po­ví­dat na danou mno­žinu zpráv.

Mi­mo­cho­dem všim­něte si, že jsem k popisu OOP ne­po­u­žil slova jako třída, in­ter­face, metoda nebo dě­dič­nost. Nejsou zá­sadní a do­ká­žeme se bez nich obejít.


Na­proti tomu hlavní ideou funk­ci­o­nál­ního pro­gra­mo­vání je re­fe­renční transpa­rent­nost. Nejsou to funkce vyš­ších řádů, monády, lamba kalkul, ani žádné po­kro­čilé ma­te­ma­tické kon­cepty. Je to jenom tenhle jeden pojem.

Funkce je re­fe­renčně transpa­rentní, když její vý­sle­dek je daný jedině jejími ar­gu­menty a ničím jiným. To má spoustu im­pli­kací: volání funkce můžeme na­hra­dit jejím tělem nebo rovnou vý­sled­kem a na cho­vání pro­gramu se nic ne­změní, o pro­gramu pak můžeme začít uva­žo­vat jako o sou­stavě rovnic, funkce jsou funk­cemi v ma­te­ma­tic­kém slova smyslu a ne­mů­žou mít žádné ve­d­lejší účinky a všechny hod­noty jsou ne­měnné. To všechno vy­plývá z hlavní myš­lenky FP.

Díky tomu jsou funk­ci­o­nální pro­gramy pří­mo­čaré a jed­no­dušší na po­cho­pení. Stačí sle­do­vat vstupy a vý­stupy, ne­mu­sím si pa­ma­to­vat, jaké ve­d­lejší účinky má daná funkce a jak to ovlivní cho­vání celého sys­tému. Spousta sta­rostí jed­no­duše zmizí. Ne­měnné typy zcela od­straní mut­nost de­fen­ziv­ního pro­gra­mo­vání, pro­tože ne­měn­nou věc nikdo ne­změní. Všichni můžou mít kopii a pro­gra­má­toři můžou v klidu spát. To je po­žeh­nání pro pa­ra­lelní kód, ale má svoje místo i v kla­sic­kém nudném jed­no­vlák­no­vém kódu.

Kvůli těmto pra­vi­dlům FP jazyky můžou být líné, snadno pa­ra­le­li­zo­va­telné a uži­tečné pro pa­ra­lelní pro­gra­mo­vání. Když je hod­nota ne­měnná, ne­mu­sím hlídat, kdo ji kde a jak změní, ale můžu ji zcela volně sdílet mezi li­bo­vol­ným počtem vláken (což je také dobré pro CPU cache, které si mezi sebou nemusí pře­ha­zo­vat horkou cache-line pro zápis). Tohle je hlavní z důvodů, proč funk­ci­o­nální pro­gra­mo­vání v po­sled­ních letech zís­kává na po­pu­la­ritě.

Pokud si teď říkáte: „to všechno je pěkné, ale mě se to netýká, pro­tože pro­gra­muji v PHP/Javě/C“, tak vězte, že funk­ci­o­nálně se dá pro­gra­mo­vat v každém jazyce. V ně­kte­rých je to snažší, ale jde to ve všech. Stačí psát kód, který se opírá o tu jednu stě­žejní myš­lenku re­fe­renční transpa­rent­nosti.


Takže co dál? Ob­jek­tově nebe fun­ci­o­nálně? Od­po­věď zní pře­kva­pivě: obojí. V ná­sle­du­jí­cích letech se masově roz­šíří ob­jek­tově funk­ci­o­nální pa­ra­digma, které spo­juje to nej­lepší z obou světů: OOP pro or­ga­ni­zaci a mo­du­la­ri­zaci pro­gramů a FP kvůli re­fe­renční transpa­rent­nosti, ne­měn­ným typům a snaz­šímu pa­ra­lel­nímu pro­gra­mo­vání.

Dále k tématu:

@kaja47, kaja47@k47.cz, deadbeef.k47.cz, starší články