Dědičnost dnes

SB

Re:Dědičnost dnes
« Odpověď #270 kdy: 22. 01. 2017, 14:34:58 »
Javascript...

Objekty se vytváří konstruktorem. Nic se při tom neklonuje. Prototyp zůstává jen jeden.

No, ono je to trochu schizofreničtější - tím konstruktorem je obyčejná, prašivá funkce, jejíž kontext se po vzniku použije jako objekt, ale to pouze při použití klíčového slova new. Samotné klonování objektu sice nějak ukvedlat jde, ale samotný jazyk na to přímočarou metodu nemá - je třeba to řešit docela složitě. Znalí vědí. Takže jako teda nic moc. Tohle je jedno z dalších implementačních zklamání jinak dobře myšleného jazyku.


SB

Re:Dědičnost dnes
« Odpověď #271 kdy: 22. 01. 2017, 14:49:08 »
...jaký obsah má čtverec, kterému nastavím strany 2 a 3? ... do databáze perzistuji hovadinu...

JASNĚ jsem uvedl, že třída čtverce zajišťuje shodu délek stran a i b, tudíž není možno mít a=2 a b=3. Data pro uložení pak buďto poskytuje sama instance čtverce, takže dostačuje jedna strana, nebo je řešeno v mapovači čtverce do DB, který pro uložení čtverce vede jen jednu stranu.

Re:Dědičnost dnes
« Odpověď #272 kdy: 22. 01. 2017, 14:54:52 »
...jaký obsah má čtverec, kterému nastavím strany 2 a 3? ... do databáze perzistuji hovadinu...

JASNĚ jsem uvedl, že třída čtverce zajišťuje shodu délek stran a i b, tudíž není možno mít a=2 a b=3. Data pro uložení pak buďto poskytuje sama instance čtverce, takže dostačuje jedna strana, nebo je řešeno v mapovači čtverce do DB, který pro uložení čtverce vede jen jednu stranu.

Pocitam, ze se porad bavime o mutable variante, jinak je to trivialni zalezitost?

A jak se v tom pripade chova tahle posloupnost prikazu?

Kód: [Vybrat]
final Obdelnik o = new Ctverec(1)
o.setA(2)
o.setB(3)
print o.obsah()

?

SB

Re:Dědičnost dnes
« Odpověď #273 kdy: 22. 01. 2017, 15:01:38 »

v tom článku na wikipedii se o žádném klonování nepíše. O klonování objektů v javascriptu si přečtěte třeba zde:

http://stackoverflow.com/questions/728360/how-do-i-correctly-clone-a-javascript-object

Taky si myslím, že to tam mají nějaké pošukané - to, co popisují, je "prototypování", neboli vytvoření objektu s vazbou na svůj uvedený prototyp pro účely delegování. Klonování je vytvoření prosté kopie, která se mimo identity ve všem shoduje s originálem, ale nemá na něj jakoukoliv vazbu - uvedeno v odkazu na Stackoverflow.
Ale možná ty termíny taky chybně chápu.

Honza

Re:Dědičnost dnes
« Odpověď #274 kdy: 22. 01. 2017, 15:03:28 »
Kód: [Vybrat]
final Kruh k = new Kruh(1)
k.setPrumer(2)
k.setPolomer(3)
print k.obsah()


Re:Dědičnost dnes
« Odpověď #275 kdy: 22. 01. 2017, 15:13:33 »
Kód: [Vybrat]
final Kruh k = new Kruh(1)
k.setPrumer(2)
k.setPolomer(3)
print k.obsah()

Nebudes tomu verit, ale je to uplne jiny pripad. Chces si za domaci ukol vymyslet, v cem je rozdil, nebo radeji napovedu? ;)

Honza

Re:Dědičnost dnes
« Odpověď #276 kdy: 22. 01. 2017, 15:29:57 »
Kód: [Vybrat]
final Kruh k = new Kruh(1)
k.setPrumer(2)
k.setPolomer(3)
print k.obsah()

Nebudes tomu verit, ale je to uplne jiny pripad. Chces si za domaci ukol vymyslet, v cem je rozdil, nebo radeji napovedu? ;)
To je záměr, u tohoto případu se totiž nikdo neptá, jak se to bude chovat.

SB

Re:Dědičnost dnes
« Odpověď #277 kdy: 22. 01. 2017, 15:31:58 »
Omlouvám se tedy za nepochopení termínů, tomu, čemu říkám "prototypování", je tedy klonování.


Každý, kdo prakticky programuje v JS, si pod klonováním představuje něco jiného než kopii prototypu. Kopírují se vlastnosti samotného objektu, prototyp se většinou jen předává.

Žádná shallow copy prototypu při vytváření nevzniká. To je princip prototypového OOP.

Takhle si "prototypování" taky představuju - stavy musí mít objekt vlastní, ale metody je možno sdílet v prototypu (obdobně jako v třídách). Proto taky v případě přepisu metody v prototypu se změní chování všech klonů. Oproti třídně-instanční implementaci OOP je v Javascriptu (nevím, jak jinde) ale jeden FATÁLNÍ implementační problém - metoda prototypu (při spuštění) nevidí dovnitř klonu, ale vidí jej pouze zvenku (tj. jako jakýkoliv jiný objekt), tj. jen veřejné vlastnosti a metody!!! Tím padá použití zapouzdření v modelech a tím i použití Javascriptu na vážné modelování. Toto je okolnost, ke které bych rád slyšel od někoho, kdo Javascriptu OPRAVDU(!) rozumí, komentář.

Re:Dědičnost dnes
« Odpověď #278 kdy: 22. 01. 2017, 15:36:14 »
Kód: [Vybrat]
final Kruh k = new Kruh(1)
k.setPrumer(2)
k.setPolomer(3)
print k.obsah()

Nebudes tomu verit, ale je to uplne jiny pripad. Chces si za domaci ukol vymyslet, v cem je rozdil, nebo radeji napovedu? ;)
To je záměr, u tohoto případu se totiž nikdo neptá, jak se to bude chovat.

Neni to zamer ale nepochopeni.

Ten kruh neni potomek nejake jine tridy T, kde je jejim kontraktem nezavisle setPrumer a setPolomer.

Zkus si prepsat ten priklad pro Kruh a Elipsu a uvidis...

Re:Dědičnost dnes
« Odpověď #279 kdy: 22. 01. 2017, 15:43:42 »
@SB - V sedmé přednášce to myslím i řešil (ale už jsem to nějakou dobu neviděl) - https://slideslive.com/s/ondrej-zara-675

@Javaman() - Nevím, jestli na tebe má vůbec cenu reagovat, ale u JS je venku ES6 a ten jazyk se vyvíjí... hodně rychle.

SB

Re:Dědičnost dnes
« Odpověď #280 kdy: 22. 01. 2017, 15:51:52 »

Jsou tam nové verze jako v ostatních jazycích? Protože jsem ho znal někdy v roce 98, což na skriptování docela šlo. Pak jsem to zkoušel o něco později a o moc lepší to nebylo.

Java splňuje normání OOP a to tvoje pure nikdo nepotřebuje, ale chtěl jsem vědět, o co přicházím :)

Ahaaa, takže vlastně všechno máme, ne?

Javascript (JS) má novou verzi, teď myslím 7, ale mimo (ne moc povedeného) pokusu o řešení asynchronních operací jsou tam jen pičoviny typu pseudotřídy.
Na takové to jednoduché skriptování je JS supr, ale na modelování velké domény to dře.

No, mně by se to pure hodně hodilo, např. takové smalltalkové doesNotUnderstand je nenahraditelné. Javascript měl něco pdobného (__noSuchMethod__), ale už je to nahrazeno komplikovaným Proxy (a kdoví, zda to vůbec funguje).

...Normální OOP totiž vypadá daleko lépe a pure znamená horší, což obvykle bývá naopak.

Tak já tady dlouze vysvětluju, že v Javě a C# a dalších nefunguje posílání zpráv, tudíž rozhodování na straně cílového objektu padá, a vy vzápětí napíšete, že "normální OOP" (tj. např. v té vaší Javě) vypadá daleko lépe. Zaprvé matně tuším, co znamená daleko lépe, zadruhé to je deklarativní prohlášení a je třeba jej podložit argumenty, jinak je bezcenné. Já už svoje tvrzení doložil.

SB

Re:Dědičnost dnes
« Odpověď #281 kdy: 22. 01. 2017, 16:00:40 »
Pocitam, ze se porad bavime o mutable variante, jinak je to trivialni zalezitost?

A jak se v tom pripade chova tahle posloupnost prikazu?

Kód: [Vybrat]
final Obdelnik o = new Ctverec(1)
o.setA(2)
o.setB(3)
print o.obsah()

?

Jasně, mutable.
Konstruktor i metody setA i setB nastavují vždy obě strany, protože musejí dodržet podmínku shody stran. Vzniklý čtverec má velikost 1 (obsah 1), po setA(2) má čtverec velikost 2 (obsah 4), po setB(3) má čtverec velikost 3 (obsah 3x3=9).

javaman ()

Re:Dědičnost dnes
« Odpověď #282 kdy: 22. 01. 2017, 16:03:14 »
@SB - V sedmé přednášce to myslím i řešil (ale už jsem to nějakou dobu neviděl) - https://slideslive.com/s/ondrej-zara-675

@Javaman() - Nevím, jestli na tebe má vůbec cenu reagovat, ale u JS je venku ES6 a ten jazyk se vyvíjí... hodně rychle.

Tak někdo začal pomlouvat OOP v Javě, víš co :D OK, dík za info. Jsem si říkal, že by to bylo divný, pokud by to bylo stále stejné.


Jsou tam nové verze jako v ostatních jazycích? Protože jsem ho znal někdy v roce 98, což na skriptování docela šlo. Pak jsem to zkoušel o něco později a o moc lepší to nebylo.

Java splňuje normání OOP a to tvoje pure nikdo nepotřebuje, ale chtěl jsem vědět, o co přicházím :)

Ahaaa, takže vlastně všechno máme, ne?

Javascript (JS) má novou verzi, teď myslím 7, ale mimo (ne moc povedeného) pokusu o řešení asynchronních operací jsou tam jen pičoviny typu pseudotřídy.
Na takové to jednoduché skriptování je JS supr, ale na modelování velké domény to dře.

No, mně by se to pure hodně hodilo, např. takové smalltalkové doesNotUnderstand je nenahraditelné. Javascript měl něco pdobného (__noSuchMethod__), ale už je to nahrazeno komplikovaným Proxy (a kdoví, zda to vůbec funguje).

...Normální OOP totiž vypadá daleko lépe a pure znamená horší, což obvykle bývá naopak.

Tak já tady dlouze vysvětluju, že v Javě a C# a dalších nefunguje posílání zpráv, tudíž rozhodování na straně cílového objektu padá, a vy vzápětí napíšete, že "normální OOP" (tj. např. v té vaší Javě) vypadá daleko lépe. Zaprvé matně tuším, co znamená daleko lépe, zadruhé to je deklarativní prohlášení a je třeba jej podložit argumenty, jinak je bezcenné. Já už svoje tvrzení doložil.

Ahaaa, OK. Tak to je fajn.

Přijde mi, že spíše hledáš něco více dynamického na bastlení. Cokoli dynamického je z principu špatné u velkých věcí. Proto preferuji Javu. Samozřejmě nepoužívám skoro reflexi a podobné nesmysly, protože tím to celé zkurvíš.

Takže mi přijde, že máš rád hodně dynamické věci a pak se ti líbí i OOP, které se nepoužívá.

Chápu, v poho. Nemusíš tomu věřit :)

SB

Re:Dědičnost dnes
« Odpověď #283 kdy: 22. 01. 2017, 16:05:37 »
Kód: [Vybrat]
final Kruh k = new Kruh(1)
k.setPrumer(2)
k.setPolomer(3)
print k.obsah()

Nebudes tomu verit, ale je to uplne jiny pripad. Chces si za domaci ukol vymyslet, v cem je rozdil, nebo radeji napovedu? ;)
To je záměr, u tohoto případu se totiž nikdo neptá, jak se to bude chovat.

Neni to zamer ale nepochopeni.

Ten kruh neni potomek nejake jine tridy T, kde je jejim kontraktem nezavisle setPrumer a setPolomer.

Zkus si prepsat ten priklad pro Kruh a Elipsu a uvidis...

Pan Honza nedokazoval odvozování kruhu, ale že nastavení velikosti a výpočet jsou vnitřní záležitostí objektu.

Re:Dědičnost dnes
« Odpověď #284 kdy: 22. 01. 2017, 16:06:11 »
Pocitam, ze se porad bavime o mutable variante, jinak je to trivialni zalezitost?

A jak se v tom pripade chova tahle posloupnost prikazu?

Kód: [Vybrat]
final Obdelnik o = new Ctverec(1)
o.setA(2)
o.setB(3)
print o.obsah()

?

Jasně, mutable.
Konstruktor i metody setA i setB nastavují vždy obě strany, protože musejí dodržet podmínku shody stran. Vzniklý čtverec má velikost 1 (obsah 1), po setA(2) má čtverec velikost 2 (obsah 4), po setB(3) má čtverec velikost 3 (obsah 3x3=9).

A ze tim prestanes splnovat kontrakt obdelniku je ti jedno?