Dědičnost dnes

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Dědičnost dnes
« Odpověď #105 kdy: 17. 01. 2017, 17:08:41 »
Puvodni Karel ma pravdu - OOP (jak se bezne chape, treba v Jave) micha tri koncepty dohromady (zapouzdreni, dedicnost, polymorfismus) do jednoho - trid. Je to omyl a zpetne to vidime. Konkretne, dedicnost dava smysl pro data, nikoli pro funkce, a naopak, polymorfismus dava smysl pro funkce, nikoli pro data. A potreba neco zapouzdrit jeste neznamena, ze musime vytvaret novy typ.

Treba Haskell (jako vetsina funkcionalnich jazyku) to ma rozdelene pomerne jasne. Zapouzdreni se realizuje pomoci modulu, dedicnost pomoci treba algebraickych typu (nebo obecne typu vyssiho radu) a polymorfismus pomoci typovych parametru a typovych trid.
Naopak dědičnost dává smysl pro funkce, u dat to často skřípe.


JS

Re:Dědičnost dnes
« Odpověď #106 kdy: 17. 01. 2017, 17:28:06 »
Naopak dědičnost dává smysl pro funkce, u dat to často skřípe.

To si nerozumime. Ale jelikoz tvuj komentar nema moc obsahu, tezko rict v cem. Mozna proto, ze chapes slovo dedicnost prilis uzce, prave jen v souvislosti s tridami.

Treba jazyk Go ma take ty tri koncepty rozdelene, a dedeni dat (a jen dat!) tam jde delat pomoci vnorene struktury, zatimco na polymorfismus slouzi interfaces.

JS

Re:Dědičnost dnes
« Odpověď #107 kdy: 17. 01. 2017, 17:37:26 »
Nebo jinak to reknu: Koncept dedeni samotnych funkci (nikoli metod vazanych k nejakemu datovemu typu) nedava velky smysl, snad jedine pokud by slo o zuzeni definicniho oboru (ale proc by to nekdo delal?). V ostatnich pripadech by se porusil LSP.

JS

Re:Dědičnost dnes
« Odpověď #108 kdy: 17. 01. 2017, 17:43:45 »
Ah, chyba, pri dedeni by muselo jit o rozsireni definicniho oboru, aby se neporusil LSP.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Dědičnost dnes
« Odpověď #109 kdy: 17. 01. 2017, 18:13:20 »
Naopak dědičnost dává smysl pro funkce, u dat to často skřípe.

To si nerozumime. Ale jelikoz tvuj komentar nema moc obsahu, tezko rict v cem. Mozna proto, ze chapes slovo dedicnost prilis uzce, prave jen v souvislosti s tridami.

Treba jazyk Go ma take ty tri koncepty rozdelene, a dedeni dat (a jen dat!) tam jde delat pomoci vnorene struktury, zatimco na polymorfismus slouzi interfaces.
Možná je to nedorozumění. Psal jsem o tom, že "dědění" dat (proměnných, resp. vlastností) zhusta nedává smysl, např. čtverec IS A obdélník, ale obdélník se popisuje dvěma čísly, kdežto čtverec jen jedním. Veškeré operace typické pro obdélník ale fungují stejně, akorát obdélník má všechny strany stejně velké, což je ovšem funkcím putna. Jinými slovy když řeknu "Square extends Rectangle", tak čtverec najednou bude mít taky dvě proměnné, což je špatně, protože redundance, neelegance atd. A tento problém žádné přímočaré řešení nemá (aspoň v současných jazycích), ledaže člověk funkce rozčlení do rozhraní, což se právě čím dál více rozmáhá. Pak dědičnost jako taková zmizí, ale zůstane sdílený kód a stejná množina relevantních proměnných, byť implementovaných různě. V konečném důsledku pak mám, co chci, zejména polymorfismus a sizeof(square) = sizeof(rectangle) / 2.


JS

Re:Dědičnost dnes
« Odpověď #110 kdy: 17. 01. 2017, 18:51:52 »
Psal jsem o tom, že "dědění" dat (proměnných, resp. vlastností) zhusta nedává smysl, např. čtverec IS A obdélník, ale obdélník se popisuje dvěma čísly, kdežto čtverec jen jedním.

To mas sice pravdu, ale to je spis tim, ze dedeni proste neresi dobre vsechny druhy IS-A vztahu. Kazdopadne, moje pointa byla, ze tridy smesuji tri ruzne koncepty, jestli jednomu z nich rikame dedeni nebo nejak jinak neni az tak podstatne. Jinak dedeni dat se taky pouziva v relacnich databazich, takze to jde i bez polymorfismu.

anonym

Re:Dědičnost dnes
« Odpověď #111 kdy: 17. 01. 2017, 20:11:55 »
Ctverec dedi obdelni je typicky priklad OOP hovna, diky za něj. Mohlo by se to jmenovat OOP Shit
Rectangle Paradox.

Já tady jako jediný nebudu říkat, jestli čtverec dědí odbelník nebo ne - to totiž vůbec není nějak předem dáno. Prostě není. Čtverec dědí v naší aplikaci obdelník - a říkám v naší aplikaci, protože v reálném světě takovéhle sračky neřešíme - právě v případě, kdy to SPLŇUJE ÚČEL. Není žádné apripori sračka pravidlo (díky bohu), jestli čtverec dědí obdelník, ikdyž je čtverec brán jako případ obdelníku.

Někdo totiž může říct, že obdelník může být speciální případ cltverce. Máš čtverec, hodíš na něj botu a je z něho obdelník.

Kd říká že je to tak či onak, sám je nerozumí OOP, viz Zboj.

anonym

Re:Dědičnost dnes
« Odpověď #112 kdy: 17. 01. 2017, 20:22:22 »
Protože kupříkladu indiáni z kmene Pičujů berou zásadně čtvrerec jakožto případ kosodelníku, neboť podle jejich víry z kosodelníku dědí všechno, výjma obdelníku. Obdelník se u nich navíc nesmí používat v jiný den, než o Slunovratu, proto by ho žádný chytrý Pičuj programátor nikde neimplementoval do aplikace, neboť by se mohla spouštět jen jednou do roka.

.

Re:Dědičnost dnes
« Odpověď #113 kdy: 17. 01. 2017, 20:53:28 »
Treba jazyk Go ma take ty tri koncepty rozdelene, a dedeni dat (a jen dat!) tam jde delat pomoci vnorene struktury, zatimco na polymorfismus slouzi interfaces.
To není tak úplně pravda, vnořený (embeded) typ si sebou samozřejmě bere všechny metody a lze je používat v rámci vnějšího (outer) typu.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Dědičnost dnes
« Odpověď #114 kdy: 17. 01. 2017, 21:25:42 »
Psal jsem o tom, že "dědění" dat (proměnných, resp. vlastností) zhusta nedává smysl, např. čtverec IS A obdélník, ale obdélník se popisuje dvěma čísly, kdežto čtverec jen jedním.

To mas sice pravdu, ale to je spis tim, ze dedeni proste neresi dobre vsechny druhy IS-A vztahu. Kazdopadne, moje pointa byla, ze tridy smesuji tri ruzne koncepty, jestli jednomu z nich rikame dedeni nebo nejak jinak neni az tak podstatne. Jinak dedeni dat se taky pouziva v relacnich databazich, takze to jde i bez polymorfismu.
Jo, je to trochu mimoběžná poznámka, ale vždy se hodí připomenout, že klasická dědičnost, tak jak je v OOP, je poněkud záludná, protože vždy se najde blb, co je schopen tvrdit, že "Rectangle extends Square".

anonym

Re:Dědičnost dnes
« Odpověď #115 kdy: 17. 01. 2017, 21:34:24 »
Psal jsem o tom, že "dědění" dat (proměnných, resp. vlastností) zhusta nedává smysl, např. čtverec IS A obdélník, ale obdélník se popisuje dvěma čísly, kdežto čtverec jen jedním.

To mas sice pravdu, ale to je spis tim, ze dedeni proste neresi dobre vsechny druhy IS-A vztahu. Kazdopadne, moje pointa byla, ze tridy smesuji tri ruzne koncepty, jestli jednomu z nich rikame dedeni nebo nejak jinak neni az tak podstatne. Jinak dedeni dat se taky pouziva v relacnich databazich, takze to jde i bez polymorfismu.
Jo, je to trochu mimoběžná poznámka, ale vždy se hodí připomenout, že klasická dědičnost, tak jak je v OOP, je poněkud záludná, protože vždy se najde blb, co je schopen tvrdit, že "Rectangle extends Square".

Najde se i blb schopen tvrdit, že jistojistě je tomu tak právě naopak.

anonym

Re:Dědičnost dnes
« Odpověď #116 kdy: 17. 01. 2017, 21:39:06 »
A hele, nějaký chytrý pán se nachazí rovněž i na stackoverflow... nebyl jsem to náhodou já?

http://stackoverflow.com/questions/1030521/is-deriving-square-from-rectangle-a-violation-of-liskovs-substitution-principle

.

Re:Dědičnost dnes
« Odpověď #117 kdy: 18. 01. 2017, 00:20:32 »
Když už jsme u toho dědění, :) čtverec i obdélník jsou zvláštním případem pravidelného čtyřúhelníku, kde např. plocha se vypočítá jako základna * výška a u obou dochází k tomu, že výška splývá s druhou stranou.
 

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Dědičnost dnes
« Odpověď #118 kdy: 18. 01. 2017, 00:25:53 »
Když už jsme u toho dědění, :) čtverec i obdélník jsou zvláštním případem pravidelného čtyřúhelníku, kde např. plocha se vypočítá jako základna * výška a u obou dochází k tomu, že výška splývá s druhou stranou.
Akorát že čtverec je pod obdélníkem, protože je definován více omezeními - relace být podmnožinou množiny omezení (constraints) je kovariantní k dědičnosti. Viz diagram tady s více typy: https://cs.wikipedia.org/wiki/Čtyřúheln%C3%ADk
To se ale učí už na ZŠ (kde někteří intelektuálně zůstali i v dospělosti), nicméně diskuse se týkala isomorfismu "is a" a dědičnosti v OOP. Dědičnost tak, jak je implementována, je prostě moc svazující.

anonym

Re:Dědičnost dnes
« Odpověď #119 kdy: 18. 01. 2017, 00:42:20 »
Když už jsme u toho dědění, :) čtverec i obdélník jsou zvláštním případem pravidelného čtyřúhelníku, kde např. plocha se vypočítá jako základna * výška a u obou dochází k tomu, že výška splývá s druhou stranou.
Akorát že čtverec je pod obdélníkem, protože je definován více omezeními - relace být podmnožinou množiny omezení (constraints) je kovariantní k dědičnosti. Viz diagram tady s více typy: https://cs.wikipedia.org/wiki/Čtyřúheln%C3%ADk
To se ale učí už na ZŠ (kde někteří intelektuálně zůstali i v dospělosti), nicméně diskuse se týkala isomorfismu "is a" a dědičnosti v OOP. Dědičnost tak, jak je implementována, je prostě moc svazující.

Haha, jak mě zboj ignoruje.

Dědičnost není svazující, to ty se svazuješ, přechytračils ses. To se ani nedivím, že máš pořád něco proti Javě, když tě přepere i dědičnost  8)