Dědičnost dnes

Re:Dědičnost dnes
« Odpověď #645 kdy: 30. 01. 2017, 21:54:01 »
Určetě je efektivnější,
Určitě? :)))

když můžete při procházení grafu skočit rovnou na odkazovaný vrchol namísto hledání id v nějaké immutable datové struktuře reprezentující množinu vrcholů (asi strom?).
K čemu propánajána strom? Mám dva listy - v jednom je seznam vrcholů, ve druhém seznam hran - tj dvojic (from,to). Právě proto, že jsou data imutabilní a identitu není potřeba řešit, můžu mít klidně v obou listech nejenom nějaká idéčka (nepřímé reference), ale i přímé reference, nebo klidně i "instance" samotné (protože nemají identitu, stejné hodnoty mají z definice tutéž identitu).

To, že data můžou ukazovat jenom "zpětně" v tomhle případě znamená jediné - všechny "instance" musím mít k dispozici předem, abych z nich ty dva listy mohl vytvořit.

Při implementaci běžných grachových algoritmů se bez muttable datových struktur obejdete jen dost těžko.
A proto jsou grafové algoritmy většinou ty příklady, na kterých se demonstruje rekurze ;)

Ale jo, máš částečně pravdu, některé věci jsou s imutabilními daty dost nešikovné, třeba vkládání do stromu je trochu peklíčko, in situ se to dělá daleko snáz. No a? (jenom pro připomenutí: otázka zněla: a jak se v FP modelují kruhové odkazy)


BoneFlute

  • *****
  • 2 047
    • Zobrazit profil
Re:Dědičnost dnes
« Odpověď #646 kdy: 30. 01. 2017, 22:50:35 »
Ani ne, v Javě se už dávno nepoužívá. Možná jinde je pořád cool.
Pokud se v Javě dávno nepoužívá, jenom dobře. Pokud tedy jde o tu variantu s private konstruktorem, to bych jako anti-pattern bral.

Přesně tak. Jde o všechny varianty. Vtipné je, že většina lidí, když se ptá na pohovorech, ani neumí všechny a zároveň umí jen ty nepoužitelné. Ale pořád se na to ptají :D Alespoň člověk ví, co tam bude za lidi.

Singleton sa nezvykne pouzivat, ak je k dispozicii dependency injection framework. Ale inac neviem si predstavit, ako by sa riesila jedna jedina zdielana instancia pre celu aplikaciu v plain jave ... 
Omluv můj sarkasmus: já si nedovedu představit situaci, kdy bych potřeboval sdílenou instanci pro celou aplikaci.

HTTP request, FileSystem, DB connection - u ničeho z toho nepovažuji za žádoucí vynucovat si jen jednu jedinou instanci by design.

Takze vezmime si konfiguraciu aplikacie, ktora sa kazdych x minut obnovuje. A budem mat 50 nekonzistentnych konfiguracnych objektov, lebo pan riesi Http request a filesystem. Alebo spravi sa singleton a budem mat konfiguraciu na jednom mieste, pre vsetkych rovnaku.

Dalsi priklad mam rozhranie rs232, tam nie je httprequest alebo databaza, problem je vsak, ze je len jedno. Bud vymyslim neviem ake zamykanie cez 50 instancii, alebo si proste spravim singleton.

Potrebujem nieco serializovat von do nejakeho mrdkoveho suboru, co nema http request ani databazu, a je potrebne aby sa do neho nezapisovalo z 50 miest. Takze bud spravim sialene zamykanie cez 50 instancii, alebo spravim singleton. Pripadne sa zahram na to, ze som jouda a singleton nepoznam a ten isty objekt odovzdavam vo vsetkych metodach. To je potom "super", zbytocne to tam zavadzia.

Dalsi relevantny pripad. Chcem sa vyhnut "statickej" triede, lebo je to vlastne zkripleny objekt a ja chcem normalny, pouzijem singleton.

Ked robim webku pre jouda sro v php, mozno singletony nie su treba. Ale pri roznych IRL aplikaciach potreba nastava. U vas toho polku zariadi webserver a ani o tom neviete.  Ja osobne, kde mozem, pouzijem framework, co sa o instancie stara za mna. Ale su pripady, ked nemozem, lebo kodim zrovna lib-ku, co ma mat zavislost iba na java api. Tam singleton vyuzijem.
Nesmysl. Takhle bych to nikdy neudělal. V žádném z uvedených příkladů bych nepoužil singleton, není nutný. A rozhodně bych neměl problémy které popisuješ.

HTTP Request nebo FS jsem jen uváděl jako příklad, který by někoho mohl napadnout, že by se na to rozhodně singleton použil. Tak holt jsi přišel s půl tuctem dalších, stejně validních, u kterých tvrdíš, že je to nastopro kandidát na singleton. OK, já s tebou nesouhlasím.

gll

Re:Dědičnost dnes
« Odpověď #647 kdy: 30. 01. 2017, 23:37:03 »
Určetě je efektivnější,
Určitě? :)))

Nejsem expert na podobné problémy a už vůbec ne na jejich řešení ve funkcionálních jazycích. Možná jsem napsal blbost.

když můžete při procházení grafu skočit rovnou na odkazovaný vrchol namísto hledání id v nějaké immutable datové struktuře reprezentující množinu vrcholů (asi strom?).
K čemu propánajána strom? Mám dva listy - v jednom je seznam vrcholů, ve druhém seznam hran - tj dvojic (from,to). Právě proto, že jsou data imutabilní a identitu není potřeba řešit, můžu mít klidně v obou listech nejenom nějaká idéčka (nepřímé reference), ale i přímé reference, nebo klidně i "instance" samotné (protože nemají identitu, stejné hodnoty mají z definice tutéž identitu).

To, že data můžou ukazovat jenom "zpětně" v tomhle případě znamená jediné - všechny "instance" musím mít k dispozici předem, abych z nich ty dva listy mohl vytvořit.

jak v takové reprezentaci efektivně najdete všechny hrany incidující s danným vrcholem, případně všechny sousední vrcholy?

Představoval jsem si reprezentaci grafu jako seznam vrcholů, kde každý vrchol odkazuje na seznam svých hran. Hrany odkazují zpět na vrcholy. V takové reprezentaci se cykly vyskytují. Přidat hranu, která vytváří cyklus nejde, protože můžete přidávat hrany jen do dosud nevytvořených vrcholů.

Při implementaci běžných grachových algoritmů se bez muttable datových struktur obejdete jen dost těžko.
A proto jsou grafové algoritmy většinou ty příklady, na kterých se demonstruje rekurze ;)

Ale jo, máš částečně pravdu, některé věci jsou s imutabilními daty dost nešikovné, třeba vkládání do stromu je trochu peklíčko, in situ se to dělá daleko snáz. No a? (jenom pro připomenutí: otázka zněla: a jak se v FP modelují kruhové odkazy)

Myslel jsem nějakou slovníkovou datovou strukturu. Ty jsou ve funkcionálních jazycích často implementované nějakým stromem a přístup má logaritmickou složitost. Imutabilní jsem myslel ve smyslu implementovatelné pomocí immutable n-tic. Ne neměnnou.

balki

Re:Dědičnost dnes
« Odpověď #648 kdy: 30. 01. 2017, 23:39:55 »
Nesmysl. Takhle bych to nikdy neudělal. V žádném z uvedených příkladů bych nepoužil singleton, není nutný. A rozhodně bych neměl problémy které popisuješ.

HTTP Request nebo FS jsem jen uváděl jako příklad, který by někoho mohl napadnout, že by se na to rozhodně singleton použil. Tak holt jsi přišel s půl tuctem dalších, stejně validních, u kterých tvrdíš, že je to nastopro kandidát na singleton. OK, já s tebou nesouhlasím.

Beriem na vedomie, ze so mnou nesuhlasite a viete pouzivat slovo "nesmysl".

JS

Re:Dědičnost dnes
« Odpověď #649 kdy: 31. 01. 2017, 01:00:17 »
JS, poprosim k Vasim tvrdeniam literaturu. Funkcionalne programovanie je momentalne moje hobby, a rad by som si teda precital.

Nejsem si jisty, zda k tomu existuje formalni literatura - je to trochu mimo oblast zajmu akademiku, hadat se o OOP. :-)

Ale klasika na tohle tema je Norvig http://www.norvig.com/design-patterns/design-patterns.pdf a pak jsem nasel tenhle blogpost http://blog.ezyang.com/2010/05/design-patterns-in-haskel/ (coz obcas pouziva trochu slozitejsi koncepty, ale vsechno jsou to v podstate zase jen kombinace funkci).

IMHO ale nejlepsi je trochu se naucit Haskell. Cloveka to trochu hodi do vody, a je z toho pomerne zrejme, proc se v FP veci delaji jak se delaji; v jinych jazycich, ktere jenom prejimaji prvky FP (treba Scala nebo Java) mohou nektere veci vypadat podivne. No a kdyz ziskas trochu zkusenost, uvidis sam, jak se ty veci, na ktere se ptas, daji realizovat pres skladani funkci, bude ti to proste pripadat prirozene a naopak pristup pres tridy a interfacy uvidis jako zbytecne tezkopadny. (Bohuzel se to tezko sdeluje..)

Citace
o tom, ako je enkapsulacia zbytocna

Uz jsem to trochu naznacil v jednom z predchozich prispevku, dalsi moznost v FP (ktera se taky casto praktikuje, jak uz jsem psal driv) je jista forma inversion of control. Napr. mam-li strukturu (objekt) s tremi poli A, B a C, a potrebuji neco provest jen s A a B. V OOP bych mohl napsat interface, ktery vystavuje A a B a predat ten objekt necemu, co zna ten interface - pak bude C skryte. V FP bych to mohl udelat obracene tak, ze dostanu funkci ktera pracuje s A a B, a te predam ta pole jako argument.. Jinak receno, co se nepredava neni potreba skryvat.

Citace
ako robi FP zo vzorov trivialne veci, co nemaju pomenovanie

Vezmi si treba funkci map, v Haskellu se signaturou:
Kód: [Vybrat]
map :: (a->b) -> ([a] -> [b])
To je funkce, ktera bere funkci transformujici hodnoty typu a na hodnoty typu b, a vraci funkci, ktera aplikuje danou funkci nad kazdym prvkem seznamu (a vraci seznam). Pro nekoho, kdo trochu zna Haskell, je to velmi zrejma a bezna vec - funkce se chovaji jako kazda jina hodnota a lze je predavat jinym funkcim jako parametry. Take je to ovsem, z pohledu OOP, pouzity strategy pattern; protoze kazda funkce, ktera bere jako argument funkci, je v podstate strategy pattern. Ale neni duvod pro to zavadet novy termin, je to proste specialni pripad funkce, a to cim je specialni je dane jeji signaturou. Kdyz sdelis jeji signaturu, sdelil jsi i, ze jsi "pouzil strategy pattern", neni potreba to zminovat nejak navic. Z toho vyplyva, ze nepotrebujes ani ten termin, "strategy pattern". Staci proste rict - funkce se signaturou ... a je to dokonce vystiznejsi.

Predstav si analogickou situaci - kdybych misto "funkce, ktera bere za parametr pointer", rikal treba "pouzil jsem vzor neprimeho odkazu". Pusobilo by to smesne - je to mene deskriptivni a zbytecna terminologie. Tim chci ilustrovat, jak ten termin "strategy pattern" vidi nekdo, kdo zna FP.

Podobny rozbor je mozne udelat temer se vsemi design patterny (protoze, jak spravne rika ta prednaska, co poslal ava, vetsinou jde jen o triky, jak nekam predat funkci).

Citace
ako robia abstrakcie funkcionalneho programovania objektove abstrakcie zbytocnymi

Je to trochu naznacene v tech odkazech. Ale predevsim diky tomu, ze vsechno je jen nejake skladani funkci, dava ti to mnohem unifikovanejsi pohled na vec a nepotrebujes znat design patterns - stanou se z nich (a mnoha dalsich) proste zcela zrejme veci, ktere prirozene vyplynou ze situace.

Jinak existuji skutecne "design patterns" v FP. Jsou to veci jako treba funktor, nebo monada, nebo monoid, nebo traversable.. typicky (v Haskellu) definovany pres nejakou typovou tridu a zakony, ktere pro ne plati. Ale to uz je o necem trochu jinem, a v jistem smyslu je to mnohem zajimavejsi (protoze lepe definovane) nez design patterns z GoF book.


zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Dědičnost dnes
« Odpověď #650 kdy: 31. 01. 2017, 01:17:31 »
Jinak existuji skutecne "design patterns" v FP. Jsou to veci jako treba funktor, nebo monada, nebo monoid, nebo traversable.. typicky (v Haskellu) definovany pres nejakou typovou tridu a zakony, ktere pro ne plati. Ale to uz je o necem trochu jinem, a v jistem smyslu je to mnohem zajimavejsi (protoze lepe definovane) nez design patterns z GoF book.
To nejsou vzory, ale normální matematické koncepty.

SB

Re:Dědičnost dnes
« Odpověď #651 kdy: 31. 01. 2017, 08:30:27 »
Ale inac neviem si predstavit, ako by sa riesila jedna jedina zdielana instancia pre celu aplikaciu v plain jave ... 

Často nepotřebujete vytvářet instanci. Stačila by vám statická třída, která si drží stav.

Stačila, ale možná ve Smalltalku (viděl jsem), v Javě se (rádoby)třídní metody (čti static) chovají nějak divně a ještě u nich nefunguje polymorfismus.

SB

Re:Dědičnost dnes
« Odpověď #652 kdy: 31. 01. 2017, 08:34:47 »
Sranda je, ze on by se mozna pouzival, kdyby Java nevznikla.. Zacatkem 90.let to byla pomerne silna konkurence C++ a psaly se v tom i business aplikace (IBM do toho treba hodne investovala).

Ale Java prisla a byla zdarma.. a jak uz to tak v IT byva, otevrene veci zvitezi, i kdyz jsou horsi. S kvalitou to nema moc co delat.

Jo, to IBM projebala.https://en.wikipedia.org/wiki/IBM_VisualAge

SB

Re:Dědičnost dnes
« Odpověď #653 kdy: 31. 01. 2017, 08:36:39 »
Přece těm nesmyslům sám nevěříš. Kdyby byla Java tak špatná, tak se toho už někdo všiml. Já v ní dělám řadu let a nevšiml jsem si, že by byla špatná...

To bude rozhledem.

Re:Dědičnost dnes
« Odpověď #654 kdy: 31. 01. 2017, 08:38:53 »
jak v takové reprezentaci efektivně najdete všechny hrany incidující s danným vrcholem, případně všechny sousední vrcholy?
Každá reprezentace je efektivní pro nějaké použití a neefektivní pro jiné. Reprezentace, která by byla optimální pro každé myslitelné použití, typicky neexistuje.

Ta reprezentace s kruhoými odkazy je zase neefektivní, pokud budu chtít seznam všech vrcholů - já to mám s časovou složitostí 0, vy s n.

Pokud by můj primární use case bylo hledat sousedící hrany, tak bych zvolil jinou reprezentaci, nejspíš tuhle:
Kód: [Vybrat]
%{vrchol1: [vrchol2, vrchol3], vrchol3: [vrchol4]}
- tj. asociativní pole vrchol=>seznam sousedů.

Představoval jsem si reprezentaci grafu jako seznam vrcholů, kde každý vrchol odkazuje na seznam svých hran. Hrany odkazují zpět na vrcholy. V takové reprezentaci se cykly vyskytují. Přidat hranu, která vytváří cyklus nejde, protože můžete přidávat hrany jen do dosud nevytvořených vrcholů.
Asi ne seznam hran, ale seznam vrcholů. Ano, to skutečně v FP pro obecný graf udělat nejde. Ale nevadí to, protože máme jiné možné reprezentace. A je otázka, jestli to, že to v ostatních jazycích jde, za to skutečně stojí. Plynou z toho totiž pak např. takové věci, jako že když chce Ruby udělat GC, musí zastavit celý svět. Velice nepříjemná vlastnost pro produkci...

Myslel jsem nějakou slovníkovou datovou strukturu. Ty jsou ve funkcionálních jazycích často implementované nějakým stromem a přístup má logaritmickou složitost. Imutabilní jsem myslel ve smyslu implementovatelné pomocí immutable n-tic. Ne neměnnou.
Jinak normální slovník (hashmap) je třeba v Elixiru first class citizen, takže je implementovaný v runtimu nejefektivnějším možným způsobem - maximální složitost pro čtení i zápis je log(n).

Horší je to právě s tím stromem - v FP musím při zápisu někde dole zpětně "přeskládat" celý strom, nemůžu jenom najít list, zapsat do něj a mám hotovo. To je pravda. Ale opakuju: No a? Co z toho plyne? Že FP není ve všem lepší? No jasně, to přece nikdo netvrdí.

JS

Re:Dědičnost dnes
« Odpověď #655 kdy: 31. 01. 2017, 08:39:43 »
Jinak existuji skutecne "design patterns" v FP. Jsou to veci jako treba funktor, nebo monada, nebo monoid, nebo traversable.. typicky (v Haskellu) definovany pres nejakou typovou tridu a zakony, ktere pro ne plati. Ale to uz je o necem trochu jinem, a v jistem smyslu je to mnohem zajimavejsi (protoze lepe definovane) nez design patterns z GoF book.
To nejsou vzory, ale normální matematické koncepty.

Rypes do toho pekne (zbytecne), ale jsou to vzory podle te puvodni Alexanderovy definice.

Kazdopadne, spis to byl povzdech nad tim, ze to co se nazyva "software design patterns" jsou triviality, ktere zpopularizovala GoF knizka, pritom lepe by bylo, kdyby doslo k tomu, ze si programatori uvedomi Howard-Curry korespondenci, a dojde jim, ze kazdy vzor v programovani ma svuj odraz v matematice a naopak. Neblamuji za to ani tak autory, ti proste sami moc nevedeli, co delaji (ja sam jsem o FP jeste pred par lety nic moc nevedel, na druhou stranu, ja aspon nepisu knihy, jak psat software a nestudoval jsem puvodne computer science), spis kolektivni nevedomi programatoru, ktere se vyse uvedenym prispevkem snazim napravit.

Jak uz jsem psal, vyvoj v IT probiha od slozitejsiho k jednodussimu, a chvili trva, nez si uvedomime, ze nejake pojmy popisuji totez a zjistime, ze vlastne cast z nich nepotrebujeme.

SB

Re:Dědičnost dnes
« Odpověď #656 kdy: 31. 01. 2017, 08:47:46 »
Nikdo přece nevyžaduje, aby všechny třídy byly v jednom stromu.
Ne "všechny", to jsem nepsal, ale ty, které mají mít společné vlastnosti.

Ani ty ne.

Supr, tak se k tomu začínáme posunovat: V runtime se nějakým způsobem udržují stavy. Od tohoto se můžeme odpíchnout.
To klidně můžeme. Vy jste říkal, že něco nevíte, já se vám to snažím přiblížit, jak nejlíp umím. Odpíchněte se tedy k další otázce na to, co vám dál není jasné.

Myslím, že si nyní nejdřív nastuduju nějaký matroš, to bude nejlepší.

Chápu. Tím se objevuje další otázka, jak se modelují vzájemné závislosti (cykly) v datech.
To je konečně opravdu zajímavá otázka (bez ironie). Museli bysme říct, co konkrétně bysme chtěli modelovat. Co v reálném světě má kruhové závislosti? (jedině konkrétní příklad prosím)

Napadá mě role rodič, potomek - jejich vzájemné spojení. Zaměstnanec-pracovní místo, ...

SB

Re:Dědičnost dnes
« Odpověď #657 kdy: 31. 01. 2017, 08:55:39 »
Omluv můj sarkasmus: já si nedovedu představit situaci, kdy bych potřeboval sdílenou instanci pro celou aplikaci.

HTTP request, FileSystem, DB connection - u ničeho z toho nepovažuji za žádoucí vynucovat si jen jednu jedinou instanci by design.

Píšete to správně - u uvedených příkladů to ani není vhodné. Ale např. Smalltalk pomocí jedináčka modeluje unikátní hodnoty z důvodu snadného srovnávání identity v celé aplikaci: true, false, nil. (Definice booleových hodnot je ve Smalltalku vůbec špek.)

SB

Re:Dědičnost dnes
« Odpověď #658 kdy: 31. 01. 2017, 09:06:11 »
Takze vezmime si konfiguraciu aplikacie, ktora sa kazdych x minut obnovuje. A budem mat 50 nekonzistentnych konfiguracnych objektov, lebo pan riesi Http request a filesystem. Alebo spravi sa singleton a budem mat konfiguraciu na jednom mieste, pre vsetkych rovnaku.

Dalsi priklad mam rozhranie rs232, tam nie je httprequest alebo databaza, problem je vsak, ze je len jedno. Bud vymyslim neviem ake zamykanie cez 50 instancii, alebo si proste spravim singleton.

Potrebujem nieco serializovat von do nejakeho mrdkoveho suboru, co nema http request ani databazu, a je potrebne aby sa do neho nezapisovalo z 50 miest. Takze bud spravim sialene zamykanie cez 50 instancii, alebo spravim singleton. Pripadne sa zahram na to, ze som jouda a singleton nepoznam a ten isty objekt odovzdavam vo vsetkych metodach. To je potom "super", zbytocne to tam zavadzia.

Dalsi relevantny pripad. Chcem sa vyhnut "statickej" triede, lebo je to vlastne zkripleny objekt a ja chcem normalny, pouzijem singleton.

Ked robim webku pre jouda sro v php, mozno singletony nie su treba. Ale pri roznych IRL aplikaciach potreba nastava. U vas toho polku zariadi webserver a ani o tom neviete.  Ja osobne, kde mozem, pouzijem framework, co sa o instancie stara za mna. Ale su pripady, ked nemozem, lebo kodim zrovna lib-ku, co ma mat zavislost iba na java api. Tam singleton vyuzijem.

Tak to jsou zrovna hodně špatné příklady - to, že potřebujete číst jedinou konfiguraci, používat jedno spojení a komunikovat přes jeden sériák, neznamená, že je musíte vyrobit jako jedináčka. Objekt, který s nimi pracuje, je má dostat při inicializaci nebo spuštění akce (nebo od někoho, koho zná). Co se stane, když budete mít více konfiguráků? Když přidáte další sériák? Když budete komunikovat s 3 servery?
Toto řešení mi spíš zavání globálními odkazy přes třídu. Antivzor znemožňující testování, zvyšující coupling a zabordelující aplikaci!

Že nejdou třídní věci dát do třídy, protože je Java zprasená, je věcí druhou.

SB

Re:Dědičnost dnes
« Odpověď #659 kdy: 31. 01. 2017, 09:08:44 »
Určetě je efektivnější, když můžete při procházení grafu skočit rovnou na odkazovaný vrchol namísto hledání id v nějaké immutable datové struktuře reprezentující množinu vrcholů (asi strom?). Při implementaci běžných grachových algoritmů se bez muttable datových struktur obejdete jen dost těžko.

Určitě je to rychlé (na to ale obvykle sere pes), ale hlavně jednoduché a objektové - využívá to identitu (základní vlastnost OOP), data se neindexují - to je antivzor oblíbený u relačníků.