No, ve skutečnosti jsem to dělal pomocí zástupných commandů, ale ten princip, ať si to nekomplikujem je ten, že jsem funkci předal celou scénu, a vrátil novou.
Na tom je krásně vidět, jak tě funkcionální omezení dotlačilo do prakticky asi nejhoršího řešení. Neber to jako kritiku, ta úloha ve funkcionálním přístupu nemá žádné dobré řešení
.
Vidiš to. Já bych naopak řekl, že je na tom krásně vidět, jak těžké je opustit mutable svět a začít přemýšlet funkcionálně.
Co je na tom zásadně špatně:
1) Funkce by měla pracovat jen s daty, která opravdu potřebuje. Ty předáváš celou scénu, i když s ní funkce provede jen nějakou omezenou operaci. Vůbec nevíš, co se kde zpracovává za data.
2) Nejde to paralelizovat. Jednotlivé funkce musíš spouštět sekvenčně.
Zmínil jsem ty zástupné commandy. Protože to vypadá, že si si to nedomyslel, tak popíšu:
V rámci tiku, každý objekt dostal stejnou scénu. Jeho úkolem bylo určit a vrátit co chce na té scéně změnit. Toto se dá velice dobře paralelizovat. Výsledkem byl seznam commandů, který se mají uplatnit na scéně. Toto je kritická sekce, která se paralelizuje hůř, ale taky to de. Například můžu rozdělit scénu na části, které se nemohou ovlivňovat. Třeba když je to rozděleno zdí. Pak můžu tyto dvě scény paralelizovat zcela bez problému. A dá se na tom najít další a další způsoby, jak to optimalizovat.
Proč to dělat takto a ne jinak? Protože vždycky vím, co se mění. Díky tomu, že vím kde je kritická sekce, můžu vyhmátnout, zda nejde změnit, nebo nějak optimalizovat. Což většinou jde. A to zcela bez rizika, že se mi budou množit pomeranče. Nemůže dojít k deadlocku. Nemůže se mi nic rozjet.
3) Vytvářet kvůli každé jedné izolované změně novou scénu je neefektivní.
Nevím jak v jiném jazyce, ale v Haskellu je to zadarmo. (Samozřejmě nebavíme se o vytváření nové scény od nuly, ale to už tu Prímek vysvětloval.)
Kdybys to napsal rovnou imperativně, bylo by to přehlednější, rychlejší a udržovatelnější.
Opravdu nevidím důvod si něco takového myslet. Můžeš mi to vysvětlit? Bohužel výše uvedené tři argumenty pouze naznačují, že nemáš zkušenosti jak FP funguje.