Omezená dědičnost (je něco lepšího než OOP?)

Kit

Re:Omezená dědičnost (je něco lepšího než OOP?)
« Odpověď #120 kdy: 11. 09. 2015, 04:13:45 »
Nemohou, protože čtverec není obdélník a kružnice není elipsa. Jsou to sourozenci mající společné rodiče.
Pokud tvrdíš, že nějaké entity "jsou sourozenci", tak implicitně používáš nějaké uspořádání. Jaké? Jsi si jistý, že ten, proti komu argumentuješ, nepracuje s nějakým jiným uspořádáním? Nemíjíte se právě proto?

Je tedy správné se zeptat: V jakém kontextu chceš srovnávat čtverec a obdélník? Podle geometrické definice je čtverec skutečně speciálním případem obdélníku. Jenže je ten geometrický kontext skutečně tím kontextem, který chceme používat v aplikaci?

Citace
Podle mě totiž v tomhle je doopravdy ten zakopaný pes: každá OOP učebnice pracuje s tím, že to uspořádání je to, co intuitivně můžeme nazvat "obecnost" (pojmu): Žárovka je Svítidlo, Pes je Savec atd. A všechny tyhle přiblblé debaty pramení z toho, že tohle uspořádání sice výborně funguje v teorii, na ideálních příkladech, ale v praxi máš jiná kritéria => jiné uspořádání => jinou hierarchii.

Že Pes je Savec, to víme všichni a je to i v učebnicích OOP. Opět záleží na kontextu - někdy to prostě platit nemusí. Například hot dog není savec.

Citace
Nebo snad umíš precizně a jednoznačně nadefinovat jediné správné uspořádání objektů, které by vytvořilo tu jedinou správnou hierarchii dědičnosti?

Ne, to nelze. Mohu však nadefinovat v požadovaném kontextu, zda je vazba rodičovská, sourozenecká nebo žádná. Vždy se dopustíme nějaké nepřesnosti, ale rozhodující je, zda nám v daném kontextu pomůže ve vývoji nebo nám naopak bude házet klacky pod nohy.

Výrok "1+1=2" přece také neplatí vždy, ale pouze v určitém oboru matematiky. Stejně tak i tvrzení, že čtverec je obdélník, platí jen v určitém oboru geometrie. Nelze je bezhlavě aplikovat v každém kontextu. Proto když tvrdím, že čtverec není obdélník, snažím se tím vymanit ze skrytých závislostí, které by mi mohly způsobit bolení hlavy například v kreslicím programu.


Re:Omezená dědičnost (je něco lepšího než OOP?)
« Odpověď #121 kdy: 11. 09. 2015, 06:37:18 »
Je tedy správné se zeptat: V jakém kontextu chceš srovnávat čtverec a obdélník? [...] Ne, to nelze. Mohu však nadefinovat v požadovaném kontextu, zda je vazba rodičovská, sourozenecká nebo žádná.
Proto nemůžeš tvrdit, že to jsou sourozenci.

Kit

Re:Omezená dědičnost (je něco lepšího než OOP?)
« Odpověď #122 kdy: 11. 09. 2015, 07:34:40 »
Je tedy správné se zeptat: V jakém kontextu chceš srovnávat čtverec a obdélník? [...] Ne, to nelze. Mohu však nadefinovat v požadovaném kontextu, zda je vazba rodičovská, sourozenecká nebo žádná.
Proto nemůžeš tvrdit, že to jsou sourozenci.

Zdá se, že jsi přesně vystihl, co jsem měl na mysli a chytl jsi mě na větě, která byla zřejmě až příliš zjednodušující.

Tedy kauza čtverec a obdélník. Bez kontextu v zásadě vůbec nemůžeme rozhodnout, zda:
  • čtverec je potomkem obdélníka
  • čtverec je sourozencem obdélníka, mají tedy společného rodiče
  • čtverec a obdélník nemají nic společného
Teprve kontext nám může pomoci se zodpovědně rozhodnout, kterou vazbu máme zvolit. Pokud zvolíme chybně, tak porušíme DRY nebo budeme řešit diamanty.

deepjunkie

Re:Omezená dědičnost (je něco lepšího než OOP?)
« Odpověď #123 kdy: 11. 09. 2015, 07:58:56 »
OOP je zlo. Ja som sa ho tiez dlho drzal. Potom som si vsak uvedomil ze oproti modularnemu programovaniu neprinasa nic navyse.  Zato sposobuje neustale bobtnanie kodu a spomalovanie sa aplikacii. Dnesne aplikacie robia +- to iste ako aplikacie 20 rokov dozadu (s vynimkou hier a multimedii) zato vsak zeru 100 nasobne viac prostriedkov. Tie iste aplikacie mohli byt na dnesnych pocitacoch 100x rychlejsie keby lepsie vyuzivali moznosti hardware. Problem je uz v celkovej fylozofia OOP, abstrakcia, rozne VM, medzivrstvy, kniznice, frameworky a lepenie kodu.

Re:Omezená dědičnost (je něco lepšího než OOP?)
« Odpověď #124 kdy: 11. 09. 2015, 08:29:25 »
chytl jsi mě na větě, která byla zřejmě až příliš zjednodušující.
Příliš silná a proto neplatná. A stejně neplatná je představa, o které jsme se tady bavili nedávno v podobným tématu - že totiž OOP nějakým způsobem odpovídá tomu, jak svět vnímáme, nebo dokonce jaký svět objektivně je (jakási programátorská "ontologie" ve filosofickém smyslu). A protože to není pravda, padá i další bláhová představa o znovupoužitelnosti - že jednou nějaká dobrá duše napíše objekt Person a od té doby se bude už jenom používat.

Kvalitní implementace OOP s posíláním zpráv, opravdovým dynamic dispatchem, možností customizovat existující objekty (kategorie v Objective C) atd. se tomu můžou trochu blížit, protože tam není potřeba to s děděním přehánět. Ale pro mainstreamové OOP, kde se málem o ničem jiným než o dědičnosti nemluví, je to absolutní scifi, návnada na hejly.


Re:Omezená dědičnost (je něco lepšího než OOP?)
« Odpověď #125 kdy: 11. 09. 2015, 08:30:46 »
A stejně neplatná
= kvůli stejným příčinám

JSH

Re:Omezená dědičnost (je něco lepšího než OOP?)
« Odpověď #126 kdy: 11. 09. 2015, 08:49:41 »
OOP je zlo. Ja som sa ho tiez dlho drzal. Potom som si vsak uvedomil ze oproti modularnemu programovaniu neprinasa nic navyse.  Zato sposobuje neustale bobtnanie kodu a spomalovanie sa aplikacii. Dnesne aplikacie robia +- to iste ako aplikacie 20 rokov dozadu (s vynimkou hier a multimedii) zato vsak zeru 100 nasobne viac prostriedkov. Tie iste aplikacie mohli byt na dnesnych pocitacoch 100x rychlejsie keby lepsie vyuzivali moznosti hardware. Problem je uz v celkovej fylozofia OOP, abstrakcia, rozne VM, medzivrstvy, kniznice, frameworky a lepenie kodu.
IMO jeden veliký žrout výkonu v OOP vychází z myšlenky seskupit všechny parametry objektu na jedno místo. Pak když se s objektem nějak pracuje, tak se přistupuje třeba jenom k jednomu intu, ale natáhne se celý řádek cache. Práce s polem takových objektů pak znamená pěkně řídký přístup do paměti. A pokud jsou ty objekty větší, tak se najednou dá použít třeba jen polovina cache.
Jasně, v 80% kódu je to putna. Ale u takových virtuálních funkcí nikoho moc nepřekvapí, když se doví že dělají bugr v pipeline procesoru. Jaký binec může udělat jednoduché seskupení více atributů do jedné struktury je hodně překvapivé.

Vit

Re:Omezená dědičnost (je něco lepšího než OOP?)
« Odpověď #127 kdy: 11. 09. 2015, 09:00:25 »
Podľa mňa sa dedičnosť hodí hlavne tam kde treba dynamic dispatching. Hierarchiu objektov prispôsobím tomu čo s danými objektami chcem robiť. Ak nepotrebujem virtuálne funkcie tak kľudne môžem použiť kompozíciu objektov, mixiny, templaty ...
Ak nevieme čo s danými objektami bude robiť tak sa blbo navrhuje riešenie.

gamer

Re:Omezená dědičnost (je něco lepšího než OOP?)
« Odpověď #128 kdy: 11. 09. 2015, 09:22:03 »
IMO jeden veliký žrout výkonu v OOP vychází z myšlenky seskupit všechny parametry objektu na jedno místo. Pak když se s objektem nějak pracuje, tak se přistupuje třeba jenom k jednomu intu, ale natáhne se celý řádek cache. Práce s polem takových objektů pak znamená pěkně řídký přístup do paměti. A pokud jsou ty objekty větší, tak se najednou dá použít třeba jen polovina cache.

O tom je hezký a názorný článek tady:
http://harmful.cat-v.org/software/OO_programming/_pdf/Pitfalls_of_Object_Oriented_Programming_GCAP_09.pdf

Jinak aby nedošlo k nedorozumnění, nejsem odpůrcem OOP, myslím, že OOP je to nejpraktičtější, co aktuálně máme a na většinu aplikací je to správná volba. Jasně, má to svoje problémy, jenže ostatní neOOP přístupy mají svoje problémy taky.

Re:Omezená dědičnost (je něco lepšího než OOP?)
« Odpověď #129 kdy: 11. 09. 2015, 09:29:58 »
Podľa mňa sa dedičnosť hodí hlavne tam kde treba dynamic dispatching.
Žádný mainstreamový jazyk skutečný dynamic dispatch nemá. Dynamic dispatch znamená, že umím na libovolnou zprávu (předem neznámou) odpovědět "Sorry, tohle neumím".

JSH

Re:Omezená dědičnost (je něco lepšího než OOP?)
« Odpověď #130 kdy: 11. 09. 2015, 09:40:48 »
Žádný mainstreamový jazyk skutečný dynamic dispatch nemá. Dynamic dispatch znamená, že umím na libovolnou zprávu (předem neznámou) odpovědět "Sorry, tohle neumím".
Tohle je IMO jedině dobře :) Tohle totiž znamená taky to že překlepy v kódu se pořádně nekontrolují při překladu ale až při běhu. Nevím jak jiné, ale takový Python je v tomhle jazyk z nejhlubšího pekla.

Re:Omezená dědičnost (je něco lepšího než OOP?)
« Odpověď #131 kdy: 11. 09. 2015, 09:42:24 »
Tohle je IMO jedině dobře :) Tohle totiž znamená taky to že překlepy v kódu se pořádně nekontrolují při překladu ale až při běhu. Nevím jak jiné, ale takový Python je v tomhle jazyk z nejhlubšího pekla.
To není pravda. Objective C dává warningy. S pythonem souhlas.

Vit

Re:Omezená dědičnost (je něco lepšího než OOP?)
« Odpověď #132 kdy: 11. 09. 2015, 09:45:49 »
...
Nemusí to byť "skutočný" dynamic dispatch, aj zjednodušená verzia ako v C++/D/C#/atd má svoje využitie.

LSP

Re:Omezená dědičnost (je něco lepšího než OOP?)
« Odpověď #133 kdy: 11. 09. 2015, 10:03:14 »
Generika? C++ šablony? Makra? Code reuse se přece nemusí omezovat na spustitelný kód. Stačí když potřebné úpravy zvládne překladač sám.

Dokážu si představit že kompilátor místo dědičnosti a virtuálních metod jednoduše definice a kód všech proměnných a nevirtuálních metod zkopíruje z předka, dneska máme paměti dost. Problémy ale zůstanou stejné, změní se to jenom technicky.

Třeba tím, že můžeš dělat "inferenci" (nevím, jaký je v tomhle kontextu správný termín) - pokud existují dané metody, pak je splněn daný protokol. Klidně i v případě, že jsi ty metody napsal deset let před tím a protokol definuješ až teď. (Nejsem si jistý, jestli tohle pro Go platí, jde mi o princip, ne o konkrétní jazyk)

To je v problému čtvercoobdélník splněno :) Čtverec má dané metody obdélníka, tedy je splněn daný protokol, problém zůstává.

OOP je zlo.

Mainstream OOP je zobecněný postup který se dělal ručně před vznikem OOP, nemůže to být zlo samo o sobě.
Zlem to začalo být až tehdy, když se OOP začalo nadužívat na nesmysly. Typický nesmysl je místo pole int udělat kolekci s pointery na objekty Int, samozřejmě každý objekt má vlastní alokaci na haldě, aby zlo bylo maximální.

Re:Omezená dědičnost (je něco lepšího než OOP?)
« Odpověď #134 kdy: 11. 09. 2015, 10:05:46 »
To je v problému čtvercoobdélník splněno :) Čtverec má dané metody obdélníka, tedy je splněn daný protokol, problém zůstává.
To byla odpověď na to, čím se to liší od C++. V C++ nemůžeš existující objekt prohlásit za splňující protokol.