Dědičnost dnes

spasitel

Re:Dědičnost dnes
« Odpověď #240 kdy: 20. 01. 2017, 17:32:17 »

Nemusíte mě přesvědčovat. Já narozdíl od vás znám javascript velice dobře a prakticky ho používám. V těch příkladech se nic neklonuje. Pouze se nastavuje odkaz na prototyp.
tak to vam nezavidim, ze v tom delate. to je tak na kulku


gll

Re:Dědičnost dnes
« Odpověď #241 kdy: 20. 01. 2017, 17:43:33 »

Nemusíte mě přesvědčovat. Já narozdíl od vás znám javascript velice dobře a prakticky ho používám. V těch příkladech se nic neklonuje. Pouze se nastavuje odkaz na prototyp.
tak to vam nezavidim, ze v tom delate. to je tak na kulku

na kulku je část JS komunity. Stačí si jich nevšímat a nepoužívat každou blbost, která je zrovna in. Jazyk za to nemůže.

balki

Re:Dědičnost dnes
« Odpověď #242 kdy: 20. 01. 2017, 17:49:49 »

https://en.wikipedia.org/wiki/Prototype-based_programming#Object_construction

Nemusíte mě přesvědčovat. Já narozdíl od vás znám javascript velice dobře a prakticky ho používám. V těch příkladech se nic neklonuje. Pouze se nastavuje odkaz na prototyp.

Takze wikipedia klame?

gll

Re:Dědičnost dnes
« Odpověď #243 kdy: 20. 01. 2017, 17:58:46 »

https://en.wikipedia.org/wiki/Prototype-based_programming#Object_construction

Nemusíte mě přesvědčovat. Já narozdíl od vás znám javascript velice dobře a prakticky ho používám. V těch příkladech se nic neklonuje. Pouze se nastavuje odkaz na prototyp.

Takze wikipedia klame?

nevím, nečetl jsem tu stránku celou. Vidím tam dva příklady vytváření objektu:

Kód: [Vybrat]
Object.setPrototypeOf(bar, foo);

provede

Kód: [Vybrat]
bar.__proto__ = foo;

a

Kód: [Vybrat]
var bar = Object.create( foo );

provede

Kód: [Vybrat]
var bar = {__proto__:foo};

příklad klonování tam nevidím.

balki

Re:Dědičnost dnes
« Odpověď #244 kdy: 20. 01. 2017, 18:27:13 »
příklad klonování tam nevidím.

Kód: [Vybrat]
var foo = {one: 1, two: 2};

var bar = Object.create( foo );

bar.three = 3;

bar.one; // 1
bar.two; // 2
bar.three; // 3

Opravte ma ak sa mylim, ale klonovanie je o tom, aby obsahoval vzniknuty objekt vlastnosti prototypu. Ak to maju na wikipedii zle, mate volne ruky si to s autormi clanku na wikipedii vydiskutovat.  Myslim, budu radi, ak nebudu uvadzat nepravdy.


gll

Re:Dědičnost dnes
« Odpověď #245 kdy: 20. 01. 2017, 18:36:49 »
příklad klonování tam nevidím.

Kód: [Vybrat]
var foo = {one: 1, two: 2};

var bar = Object.create( foo );

bar.three = 3;

bar.one; // 1
bar.two; // 2
bar.three; // 3

Opravte ma ak sa mylim, ale klonovanie je o tom, aby obsahoval vzniknuty objekt vlastnosti prototypu. Ak to maju na wikipedii zle, mate volne ruky si to s autormi clanku na wikipedii vydiskutovat.  Myslim, budu radi, ak nebudu uvadzat nepravdy.

Kód: [Vybrat]
var foo = {one: 1, two: 2};

var bar = Object.create( foo );

bar.one; // 1
foo.one = 5;
bar.one; // 5

asi si pod slovem klon každý představujeme něco jiného.

balki

Re:Dědičnost dnes
« Odpověď #246 kdy: 20. 01. 2017, 18:44:09 »
příklad klonování tam nevidím.

Kód: [Vybrat]
var foo = {one: 1, two: 2};

var bar = Object.create( foo );

bar.three = 3;

bar.one; // 1
bar.two; // 2
bar.three; // 3

Opravte ma ak sa mylim, ale klonovanie je o tom, aby obsahoval vzniknuty objekt vlastnosti prototypu. Ak to maju na wikipedii zle, mate volne ruky si to s autormi clanku na wikipedii vydiskutovat.  Myslim, budu radi, ak nebudu uvadzat nepravdy.

Kód: [Vybrat]
var foo = {one: 1, two: 2};

var bar = Object.create( foo );

bar.one; // 1
foo.one = 5;
bar.one; // 5

asi si pod slovem klon každý představujeme něco jiného.

Ok, uznavam, ze sa vam moze definicia klonu z wikipedie nepacit. Prototype-based programming, nie je zas az tak bezna zalezitost. Nie je to velmi popularne medzi pragmatikmi, aby sa to rozsirilo viac a umoznilo sirsiu polemiku.

gll

Re:Dědičnost dnes
« Odpověď #247 kdy: 20. 01. 2017, 18:50:28 »
příklad klonování tam nevidím.

Kód: [Vybrat]
var foo = {one: 1, two: 2};

var bar = Object.create( foo );

bar.three = 3;

bar.one; // 1
bar.two; // 2
bar.three; // 3

Opravte ma ak sa mylim, ale klonovanie je o tom, aby obsahoval vzniknuty objekt vlastnosti prototypu. Ak to maju na wikipedii zle, mate volne ruky si to s autormi clanku na wikipedii vydiskutovat.  Myslim, budu radi, ak nebudu uvadzat nepravdy.

Kód: [Vybrat]
var foo = {one: 1, two: 2};

var bar = Object.create( foo );

bar.one; // 1
foo.one = 5;
bar.one; // 5

asi si pod slovem klon každý představujeme něco jiného.

Ok, uznavam, ze sa vam moze definicia klonu z wikipedie nepacit. Prototype-based programming, nie je zas az tak bezna zalezitost. Nie je to velmi popularne medzi pragmatikmi, aby sa to rozsirilo viac a umoznilo sirsiu polemiku.

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


balki

Re:Dědičnost dnes
« Odpověď #248 kdy: 20. 01. 2017, 18:57:56 »
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

Kód: [Vybrat]
Object construction

In prototype-based languages there are no explicit classes. Objects inherit directly from other objects through a prototype property. The prototype property is called prototype in Self, proto in Io and __proto__ in JavaScript. There are two methods of constructing new objects: ex nihilo ("from nothing") object creation or through cloning an existing object. The former is supported through some form of object literal, declarations where objects can be defined at runtime through special syntax such as {...} and passed directly to a variable. While most systems support a variety of cloning, ex nihilo object creation is not as prominent.[4]

balki

Re:Dědičnost dnes
« Odpověď #249 kdy: 20. 01. 2017, 18:59:04 »
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

Kód: [Vybrat]
Object construction

In prototype-based languages there are no explicit classes. Objects inherit directly from other objects through a prototype property. The prototype property is called prototype in Self, proto in Io and __proto__ in JavaScript. There are two methods of constructing new objects: ex nihilo ("from nothing") object creation or through cloning an existing object. The former is supported through some form of object literal, declarations where objects can be defined at runtime through special syntax such as {...} and passed directly to a variable. While most systems support a variety of cloning, ex nihilo object creation is not as prominent.[4]

Sorry este raz dal som code miesto quote.

Object construction

Citace
In prototype-based languages there are no explicit classes. Objects inherit directly from other objects through a prototype property. The prototype property is called prototype in Self, proto in Io and __proto__ in JavaScript. There are two methods of constructing new objects: ex nihilo ("from nothing") object creation or through cloning an existing object. The former is supported through some form of object literal, declarations where objects can be defined at runtime through special syntax such as {...} and passed directly to a variable. While most systems support a variety of cloning, ex nihilo object creation is not as prominent.[4]

gll

Re:Dědičnost dnes
« Odpověď #250 kdy: 20. 01. 2017, 19:12:29 »
Citace
In prototype-based languages there are no explicit classes. Objects inherit directly from other objects through a prototype property. The prototype property is called prototype in Self, proto in Io and __proto__ in JavaScript. There are two methods of constructing new objects: ex nihilo ("from nothing") object creation or through cloning an existing object. The former is supported through some form of object literal, declarations where objects can be defined at runtime through special syntax such as {...} and passed directly to a variable. While most systems support a variety of cloning, ex nihilo object creation is not as prominent.[4]

jako zdroj je uveden nějaký pseudovědecký článek o hovně. Nepsal jste ho vy? Jasně, že lze objekty i klonovat. Ale zrovna v JS to není nejběžnější způsob jejich vytváření a s prototypy to nemá nic společného. Object.create(foo) nic neklonuje.



n

Re:Dědičnost dnes
« Odpověď #251 kdy: 20. 01. 2017, 20:21:12 »
Kiwi povídá píčoviny. Asi zažil první semestr na škole a je z toho úplně mimo ;D

To spíš vy mi připadáte jako děcka s mlíkem na bradě, co v životě nemusela přidávat nějakou funkcionalitu do existujícího projektu, protože zatím si jen patlala párřádkové školní projektíky jakožto one-man-show from scratch.

Takže ještě jednou:

1. Netvrdím, že chování, kdy změním A, ale pod rukama se mi změní i B, je optimální. Takto bych to já nejspíš nenavrhnul, kdyby to bylo na mně. Jenže většina mých zkušeností plyne z praktického života, v němž přijdete k existující věci, která je málokdy navržená optimálně.

2. Pokud někdo navrhne třídu "obdélník" jakožto třídu měnitelných objektů, z níž je navíc dovoleno odvozovat podtřídy, tak je třeba se srovnat s tím, že někdo může potřebovat čtverec jako speciální případ obdélníku, a tedy s výše popsaným "záhadným" chováním setSideA, setSideB; nemusí to končit čtvercem; další bude potřebovat zlatý obdélník (tedy se stranami v poměru zlatého řezu) a nakonec přijde někdo, kdo bude chtít modrý obdélník (dopad na chování v případě poslání zprávy setColor takovému objektu tu doufám nemusím rozebírat). Znovu zdůrazňuji, že netvrdím, že takto udělaný program je optimálně navržený. Nejspíš by to byl jen jeden z mnoha návrhů, kdybych opět kroutil hlavou, točil oči v sloup a ptal se sám sebe "pro boha, proč takhle", ovšem bez znalosti konkrétního kontextu těžko soudit. Ale:

3. Pokud někdo další bude takto navržený program dále rozvíjet s předpokladem, že přece setSideA nemůže mít za žádných okolností vliv na druhou stranu, nebo že setColor zaručeně povede ke změně barvy na požadovanou, tak veškerou nešikovnost původního návrhu povýší na kvadrát. Protože tak přidá další nadbytečné vazby na úrovni, na níž je nikdo při návrhu nepředpokládal. A kvůli tomuto jeho redundantnímu předpokladu, kterým se mu možná, někde, něco trochu zjednodušilo, se další věci velmi zkomplikují. Stačí, aby obdélník byla netriviální třída, a z přidání triviálního čtverce se stane noční můra jen kvůli tomu, že zas někdo "myslel" a místo aby se obdélníka explicitně dotázal na jeho vlastnosti, jak se sluší a patří, tak si myslí, že si je spočítá lépe než on sám. Což rozhodně je bezprecedentní porušení principu zapouzdření!
A mimochodem to, že objekt reaguje na zprávu podle svého uvážení, je jedním ze základních pilířů objektově orientovaného programování. Proto se tomu taky neříká procedura. To nebyl jen nějaký terminologický fetiš otců-zakladatelů OOP. Různé objekty mohou na stejnou zprávu reagovat různě. Stejný objekt může na stejnou zprávu za různých okolností reagovat různě. Pošlete třídě GeometrickýÚtvar zprávu new #rectangle withA: 10 withB: 10 a obdržíte objekt třídy čtverec (například z důvodu optimalizace). Pošlete mu zprávu setSideB: 20, které samozřejmě čtverec nebude rozumět, tak ji deleguje o úroveň výš, kde se rozhodne o změně třídy na obdélník. To všechno transparentně. A právě o tomto a jiných podobných obratech je objektové programování, má-li to doopravdy ulehčovat práci. A ne o tom, že nacpu funkce a proměnné do tříd a budu dědit do bezvědomí.

Naopak, az budete psat velke projekty, na kterych spolupracuji desitky lidi a pres ktere tecou miliardy, tak poznate, ze to co tady navrhujete je uplne k hovnu. Mozna proto se Smalltalk v praxi temer nepouziva(minimalne pokud ho porovnate s "velkymi" jazyky jako c++, java, C# atd...) .
Dle vasich argumentu muze napriklad setA() zrusit samotny objekt. V podstate poslanim jakekoli zpravy (ci volanim metody) zajistite, ze stav objektu kteremu jste zpravu poslal je absolutne nedeterminovatelny z volajici strany.
Dle zakladnich zasad programovani volani nejake metody dela pouze a presne to, co metoda deklaruje ze dela (respektive z vnejsku by se tak mela jevit navenek). A ne, opravdu by nemela mit zadne vedlejsi efekty (zvnejsku pozorovatelne). Pokud vedlejsi efekty ma, tak je struktura spatne navrzena.
K dobrym programovacim konvencim patri to, ze jmeno metody jasne rika, co metoda bude delat. Pokud to neni jasne uz z nazvu, tak vetsinou je to opet spatny navrh. Az budete delat na opravdu velkych projektech na kterych dela spousta lidi, tak poznate ze vase predpoklady vedou k hovnu, ktere se neda ani udrzovat ani rozvijet bez zbytecnych nervu. Za to to nestoji. Mozna je dobre ze existuji lide jako vy, kteri jsou ochotni se vrtat v hnoji, ja, dokud je zajimave prace dost, to delat neminim.

čumil

Re:Dědičnost dnes
« Odpověď #252 kdy: 20. 01. 2017, 20:59:42 »
Zas diskuze o klonování? To už jsme tady měli ...
JS ma oop systém hodně zprasenej, takže je tam hodně výkladů co je a není klon.
Obecně se ale bere za klon deep copy + shallow copy prototypu.
Jak tady někdo říkal, nejlíp by chtělo udělat deep copy i prototypu, to by zase ale rozbylo instanceof protože to se orientuje podle referencí a ne jmen construktorů v chainu...
Radim to nehrotit, JS není moc clone friendly, takže tak ...
Nejlíp neklonovat, ale ne vždy to jde.
Leckdy ale může pomoct udělat nějaký handle nebo proxy objekt, pokud je cílem originál nějak odstínit...
Vlastně JS ma ty prototypy tak zprasený,  že nejlíp je nepoužívat vubec a jet na delegační pattern.
Popřípadě pomocí klonovací knihovny a objektových literalu si udělat ten oop systém vlastní ...

balki

Re:Dědičnost dnes
« Odpověď #253 kdy: 20. 01. 2017, 22:13:15 »
Citace
In prototype-based languages there are no explicit classes. Objects inherit directly from other objects through a prototype property. The prototype property is called prototype in Self, proto in Io and __proto__ in JavaScript. There are two methods of constructing new objects: ex nihilo ("from nothing") object creation or through cloning an existing object. The former is supported through some form of object literal, declarations where objects can be defined at runtime through special syntax such as {...} and passed directly to a variable. While most systems support a variety of cloning, ex nihilo object creation is not as prominent.[4]

jako zdroj je uveden nějaký pseudovědecký článek o hovně. Nepsal jste ho vy? Jasně, že lze objekty i klonovat. Ale zrovna v JS to není nejběžnější způsob jejich vytváření a s prototypy to nemá nic společného. Object.create(foo) nic neklonuje.

Uz ste zmenili stanovisko z "nepise sa tam" na "pseudovedecky clanok o hovne". Ja som to nepisal, mna prototype-based programming zaujimalo len okrajovo ako moznost lepenia aspektov symetrickym sposobom.  Clanok nie je pseudovedecky, vyzera, ze je to z publikacie ktora vysla u springera o prototype-based programming, ale uznavam, ze dost davno v roku 1999. Predpokladam, ze ste odvtedy napisali clanok, ktory nezmysly vyvracia.

balki

Re:Dědičnost dnes
« Odpověď #254 kdy: 20. 01. 2017, 22:20:23 »
Zas diskuze o klonování? To už jsme tady měli ...
JS ma oop systém hodně zprasenej, takže je tam hodně výkladů co je a není klon.
Obecně se ale bere za klon deep copy + shallow copy prototypu.
Jak tady někdo říkal, nejlíp by chtělo udělat deep copy i prototypu, to by zase ale rozbylo instanceof protože to se orientuje podle referencí a ne jmen construktorů v chainu...
Radim to nehrotit, JS není moc clone friendly, takže tak ...
Nejlíp neklonovat, ale ne vždy to jde.
Leckdy ale může pomoct udělat nějaký handle nebo proxy objekt, pokud je cílem originál nějak odstínit...
Vlastně JS ma ty prototypy tak zprasený,  že nejlíp je nepoužívat vubec a jet na delegační pattern.
Popřípadě pomocí klonovací knihovny a objektových literalu si udělat ten oop systém vlastní ...

Deep copy sa nerobi kvoli tomu, ze graf referencii nemusi byt zrovna jednoduchy, moze tam byt cyklus, alebo sa vytvorit klon privelkeho poctu objektov.  Nie je sposob, ako to spravne implementovat.