1831
Vývoj / Re:Omezená dědičnost (je něco lepšího než OOP?)
« kdy: 13. 09. 2015, 22:23:04 »
No, o výhodách mi vyprávět nemusíš ;-) Mě by spíše zajímaly nějaké problémy, nevýhody, co se v FP řeší výrazně hůř, než v mutable světě.
Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.
Tato diskuze je velmi zajimava.
... Ale pro mě přináší oproti FP dvě zásadní věci, umožňuje mi udržet rozhraní minimalistické (nemusím všude pracovat s celým světem) a umožňuje mi udržet svět v konzistentním stavu.
V programovani her mam zkusenosti jen s tvorbou modu pro Minecraft, je mozne, ze to jde delat i jinak (nebylo by to poprve). Ale to s minimalistickym rozhranim (minimalne v MC) proste neplati. Napr. z kazde entity mohu vytahnout instnaci sveta a delat uplne cokoliv. To je jen iluze minimalniho rozhrani, pokud stejne mohu pristupovat kamkoliv - je to stejne jako f(world) -> world ve FP. Akorat tam je to explicitne receno, ze se s tim svetem neco muze stat, zatimco pri player.setDirection(1,0,0) nepoznam, jestli to nahodou nezasahuje i do jinych casti sveta. Nebo se v "opravdovych" hrach toto takto neresi (zadne zpetne reference atp.)?
Pokud víš o FP tolik, kolik jsi dneska ukázal, tak to, že se ti něco na FP zdá úplně uhozený není vůbec směrodatné.
Budu ignorovat osobní urážky a nebudu je vracet, i když bych mohl.
Jak si to můžeš myslet, když o FP víš tak málo?
Já to nechci začínat znova... Dva lidi nezávisle (BoneFlue a implementátora Pac-Mana), dovedlo funkcionální programování k tomu, že vyrobí seznam eventů pro celou scénu a pak se ho snaží ex-post nějak aplikovat a ještě to považují za výhodu a úžasný nápad. Pro mě je to úplně uhozená představa. Nikdo to tak nedělá, i když by mohl i v imperativním přístupu prakticky zadarmo bez synchronizace.
Když přestanete tvrdit, že funkcionální programování je úplně to nejlepší na vývoj her, i když jste žádnou hru nedělali (teda BoneFlute dělal), tak přestanu reagovat. Já si to totiž nemyslím.
Tohle mě fakt nebaví. Dělal jsem na engine AAA hry (nebyl to Unreal) a žádná kritická sekce tam nebyla. Nechceš ji tam, zamykání stojí výkon. Není tam potřeba. Nastavení pozice je prostě metoda objektu. Nepotřebuješ k tomu scénu. Všichni (kromě funkcionálních fanatikůNevím proč jsem si právě vzpomněl na Larru Croft s rukou ve zdi...), to tak dělají.
Mě fakt baví, jak nechápete podstatu problému. Funkcionálním přístupem s generováním eventů jste tam přidali kompexitu navíc. Netriviální kompexitu navíc, kterou musíte řešit. A podle mě rozumně vyřešit nejde, ty eventy budou kolizní a nemáte deterministický algoritmus na řešení kolizí. Single thread imperativním přístupem žádné eventy nevznikají, nemusím je vůbec řešit. Nezajímají mě. Multi thread imperativním přistupem taky žádné eventy nevzníkají. Nezajímají mě. Musím řešit navíc synchronizaci přístupu ke sdíleným objektům. Mám to ale pořád docela dobře pod kontrolou, protože o tom, co a kdy se bude paralelizovat, rozhoduju já. Za mě je lepší můj způsob. Ale klidně si to dělejte jinak, když se vám to zdá dobré.Podstata problému je, že neumíš počítat (prosím neber to osobně). Ta komplexita je ve FP mnohem menší. Máš nad tím mnohem menší kontrolu. Synchronizaci přístupu musíme řešit oba, ale tobě to půjde hůř (a nebo jsi šikovný programátor, což mi ale nepomůže).
Ukaž mi, jak změníš pozici pomeranče, když budeš mět jen ten pomeranč. Klidně v Javě. Ale musíš mět jen pomeranč, to je podmínka!
Jakoby ty kolize byly jen díky tomu, že to je napsáno immutable. Ve skutečnosti je to takhle velice šikovné, protože se mi ty kolize setřesou na jedno místo, žádná mi neunikne, a mohu volit strategii. Ukaž, jak by jsi to dělal mutable, a snaž se, aby to bylo fakt lepší ;-)
Respektuji tvůj názor, ale nemám důvod s ním souhlasit. Jsem bohužel dost tvrdohlavý, a bez argumentů se mnou nehneš ;-)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ě.
Na tom, co jsi udělal, nic funkcionálního není. Spojuje to nevýhody imperativního a funkcionálního přistupu dohromady. Pracovat ve všech funkcích s celou scénou je totální fail. Formálně je to funkcionální, prakticky je to ale hybrid, imperativní přístup jsi násilně narouboval do funkcionálního světa. Výsledek není dobrý.
A jak si myslíš, že se to normálně dělá?No, já si sem docela pevně jist, že normálně se to dělá tak, že se vezme scéna, a ten pomeranč se na té scéně umístí kam je třeba. A obávám se, že v tomto vesmíru to prostě jinak nejde. Jo, samozřejmě jsou kolem toho různé omáčky, to je jasné. S Unrealengine sice nemám zkušenosti, ale typoval bych, že tam taky bude nějaká kritická sekce, kam se ten Actor, nebo jak to mají pojmenované, doputuje, a to se pak promítne do scény.
To jsi nastavil objektu pomeranc atribut pos na 1,2,3. To není změna pozice.
Nesplnil jsi zadání.
Zkus znova.
A jak si myslíš, že se to normálně dělá? Objekt drží informaci o své poloze a jen jemu se to nastavuje:
https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/GameFramework/AActor/SetActorLocation/index.html
Nebo v Unreal Engine taky nesplnili zadání a mají to předělat podle tvých představ?
Ve funkci, která mění pozici pomeranče, opravdu nepotřebuju celou scénu, stačí mi ten pomeranč.
Mě fakt baví, jak gamer vykládá, jakej je strašnej problém synchronizace eventů, ale když se ho zeptáš, jak by to dělal on, tak odpoví "kdo dřív přijde...". Synchronizovat eventy stylem "kdo dřív přijde" je fakt strašnej problémŘešení s eventy má jako nevýhodu nedeterminismus, rozhodnout které eventy jsou ty pravé není vůbec triviální úloha. Já tohle vůbec dělat nemusím.Ale musíš, musíš. A mnohem víc netriviálně.)
Pokud tam dva paňácové šahali po pomeranči, tak ten první ho dostal, a ten druhej šáhnul do prázdna (v příším tiku by se to dozvěděl). Jednoduše, kdo dřív přijde. Podobně to fungovalo když by se měl ten paňáca hejbat, a vznikla by nějaká kolize (narazil do jiného paňáci).
Ve skutečnosti je to takhle velice šikovné, protože se mi ty kolize setřesou na jedno místo, žádná mi neunikne, a mohu volit strategii.
Kontext!Kluci z facebooku si myslí něco jiného.
A JavaScript library for building user interfaces. To asi nebude na hry, že?
Vy chcete vytvářet seznam eventů o tom, co všechno se změniloTo chci dělat já. Jestli by to tak dělal Prýmek, ...
Já to tak dělat nechci, provádím změny rovnou ve scéně, žádný seznam nevytvářím. Kdo dřív přijde, ten dřív mele. Musím řešit sychronizaci, když mám panáky ve vláknech, tak musím políčko nejdřív zamknout, než na něj panák vstoupí.Ale vždyť tě nikdo nenutí. Já bych to tak sice nedělal, páč mi to přijde hrozně pracný a bordeloizní, ale každému co jeho jest.
Řešení s eventy má jako nevýhodu nedeterminismus, rozhodnout které eventy jsou ty pravé není vůbec triviální úloha. Já tohle vůbec dělat nemusím.Ale musíš, musíš. A mnohem víc netriviálně.
Obojí má svoje nevýhody.Immutable řešení má jedinou nevýhodu. Změnu myšlení.
To jsi nastavil objektu pomeranc atribut pos na 1,2,3. To není změna pozice.Ukaž mi, jak změníš pozici pomeranče, když budeš mět jen ten pomeranč. Klidně v Javě. Ale musíš mět jen pomeranč, to je podmínka!Kód: [Vybrat]pomeranc.SetPos(1,2,3);
Takže dva panácové přijdou k pomeranči. Kdo bude mít pomeranč? Nebo to není kolize?Jakoby ty kolize byly jen díky tomu, že to je napsáno immutable. Ve skutečnosti je to takhle velice šikovné, protože se mi ty kolize setřesou na jedno místo, žádná mi neunikne, a mohu volit strategii. Ukaž, jak by jsi to dělal mutable, a snaž se, aby to bylo fakt lepší ;-)
Ne není to šikovné. V imperativním přistupu kolize vůbec nejsou, nevzniknou. Provedeš výpočet a hned ho aplikuješ na scénu.
Můžeš si nalhávat, že je lepší generovat eventy se změnami a nechat to na později ale není. Zásadně zvyšuješ komplexitu řešení.Kluci z facebooku si myslí něco jiného.