Dědičnost dnes

milan:1

Re:Dědičnost dnes
« Odpověď #150 kdy: 18. 01. 2017, 14:34:27 »
ja som to implementoval v style:

Kód: [Vybrat]
public class Base {
 
   public void ConnectionChanged() {}

}

public class Class1 : Base
{
    private Obj1 _field;

    public Class1(){
      _field = Factory.Get(IObj1);
      _field.ConnectionChanged += OnConnectionChanged;
    }

     private void OnConnectionChanged() {  base.ConnectionChanged; }
}



lojzik

Re:Dědičnost dnes
« Odpověď #151 kdy: 18. 01. 2017, 14:49:15 »
Ano? Každý čtverec je prostorový útvar, jehož obsah jde parametrizovat pomocí dvou NEZÁVISLÝCH proměnných? Protože to přesně obdélník (MIMO JINÉ) je...
a ta druhá nezávislá proměnná, aby to byl ještě čtverec, je konkrétně která?

v

Re:Dědičnost dnes
« Odpověď #152 kdy: 18. 01. 2017, 14:51:49 »
Ano? Každý čtverec je prostorový útvar, jehož obsah jde parametrizovat pomocí dvou NEZÁVISLÝCH proměnných? Protože to přesně obdélník (MIMO JINÉ) je...
a ta druhá nezávislá proměnná, aby to byl ještě čtverec, je konkrétně která?
neeeekrrrmiiit :(((

SB

Re:Dědičnost dnes
« Odpověď #153 kdy: 18. 01. 2017, 14:59:10 »
To je zase příspěvek...

...OOP (jak se bezne chape, treba v Jave) micha tri koncepty dohromady (zapouzdreni, dedicnost, polymorfismus) do jednoho - trid...

Třída není realizátorem zapouzdření, tím je viditelnost metod a vlastností. Třída je realizátorem vytváření objektů.

...dedicnost dava smysl pro data, nikoli pro funkce, a naopak, polymorfismus dava smysl pro funkce, nikoli pro data...

To jako že by se podědilo a všechny metody přepsaly znovu? Čeho by se tím dosáhlo?
Polymorfismus je zprostředkován protokolem objektu, na vnitřní struktuře metod a stavů je nezávislý.

SB

Re:Dědičnost dnes
« Odpověď #154 kdy: 18. 01. 2017, 15:00:28 »
...Treba jazyk Go ma take ty tri koncepty rozdelene, a dedeni dat (a jen dat!) tam jde delat pomoci vnorene struktury...

A nemá to s děděním v OOP společný jen název?


Cikada_

Re:Dědičnost dnes
« Odpověď #155 kdy: 18. 01. 2017, 15:36:08 »
Ano? Každý čtverec je prostorový útvar, jehož obsah jde parametrizovat pomocí dvou NEZÁVISLÝCH proměnných? Protože to přesně obdélník (MIMO JINÉ) je...

Odkdy je čtverec (či obdélník)  prostorový útvar??!!! Zpátky na základku! (Proč mluvíte o obsahu?? Proč o dvou nezávislých proměnných?? Mimochodem to, že velikost strany a je stejná jako velikost strany b neznamená, že jsou to nějaké závislé proměnné. Tohle jsou základy matematiky, to by měl každý programátor znát!)

Čtverec je speciální případ obdélníku, který má shodou okolností všechny strany stejně dlouhé. Tečka. Tohle se učí na ZŠ...

Re:Dědičnost dnes
« Odpověď #156 kdy: 18. 01. 2017, 16:00:00 »
Ono strasne zalezi na tom, zda chceme mit instance mutable nebo imutable a co s nimi dal. U imutable je celkem bezproblemove mit ctverec jako specialni obdelnik (jenom je tam jaksi jedna clenska promenna b jako pate kolo u vozu). Ale u mutable to zacne byt o neco horsi - setB(...) by asi nemelo mit v kontraktu, ze meni i a nebo ze vyhodi vyjimku.
A opacny smer dedeni samozrejme narazi na LSP daleko tvrdeji.
« Poslední změna: 18. 01. 2017, 16:01:32 od Ondra Satai Nekola »

Kiwi

Re:Dědičnost dnes
« Odpověď #157 kdy: 18. 01. 2017, 16:28:25 »
A zase oblíbený problém vejce vs. slepice...
Kolik toho o tom bylo napsáno a kolikrát na tento problém někdo skutečně v praxi narazil? Proč někdo za každou cenu potřebuje vydělovat čtverec od obdélníku do speciální podtřídy? Jen kvůli tomu, že se to nabízí a že to jde? To není dostatečný argument. Vytvářet speciální podtřídy má smysl jedině tehdy, bude-li to k něčemu dobré, tedy ušetří-li se tím někde nějaká práce, či zpřehlední-li se tím něco. Potřebuje-li někdo mermomocí čtverec, může k tomu dobře posloužit speciální konstruktor (či jiný prostředek k výrobě instancí), který prostě vrátí obdélník s a = b.

Tohle je přesně ten moment, kdy mi na OOP vadí, že spoustu lidí tak nějak motivuje k vytváření si dalších problémů, jež zdánlivě přináší objektový návrh, ještě nad rámec těch, které je třeba doopravdy řešit. Programy manipulující s obdélníky a čtverci existovaly dávno před OOP, ale teprve s OOP lidi od počítačů začali meditovat nad tím, co je od čeho odvozené, a ještě se o tom do krve hádat.
I když ono je to podobné jako s makry v Lispu či s definujícími slovy ve Forthu. Obojí také svádí k nadužívání, jakmile člověk pochopí, jak to funguje. Jenže další fází by mělo být taky pochopení, kdy se na to vykašlat a raději použít nějaký méně cool prostředek.

Re:Dědičnost dnes
« Odpověď #158 kdy: 18. 01. 2017, 16:42:52 »
A zase oblíbený problém vejce vs. slepice...
Kolik toho o tom bylo napsáno a kolikrát na tento problém někdo skutečně v praxi narazil? Proč někdo za každou cenu potřebuje vydělovat čtverec od obdélníku do speciální podtřídy? Jen kvůli tomu, že se to nabízí a že to jde? To není dostatečný argument. Vytvářet speciální podtřídy má smysl jedině tehdy, bude-li to k něčemu dobré, tedy ušetří-li se tím někde nějaká práce, či zpřehlední-li se tím něco. Potřebuje-li někdo mermomocí čtverec, může k tomu dobře posloužit speciální konstruktor (či jiný prostředek k výrobě instancí), který prostě vrátí obdélník s a = b.

Tohle je přesně ten moment, kdy mi na OOP vadí, že spoustu lidí tak nějak motivuje k vytváření si dalších problémů, jež zdánlivě přináší objektový návrh, ještě nad rámec těch, které je třeba doopravdy řešit. Programy manipulující s obdélníky a čtverci existovaly dávno před OOP, ale teprve s OOP lidi od počítačů začali meditovat nad tím, co je od čeho odvozené, a ještě se o tom do krve hádat.
I když ono je to podobné jako s makry v Lispu či s definujícími slovy ve Forthu. Obojí také svádí k nadužívání, jakmile člověk pochopí, jak to funguje. Jenže další fází by mělo být taky pochopení, kdy se na to vykašlat a raději použít nějaký méně cool prostředek.

No to je zase zjisteni, ze skolni problem nepotkavas v praxi...

Ten specialni konstruktor je presne to reseni, ktere muze a nemusi fungovat. A prave proto je dobre o tom premyslet.

Inkvizitor

Re:Dědičnost dnes
« Odpověď #159 kdy: 18. 01. 2017, 16:44:00 »
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.

Pravdu bohuzel (bohudik!) nema. Pojem "ctverec" definovany jako obdelnik, ktery ma vsechny strany stejne dlouhe, je pro dany ucel na houby. Tudiz ctverec IS A PRAVOUHELNIK, ktery ma vsechny strany stejne dlouhe a obdelnik IS A PRAVOUHELNIK, ktery ma dve rovnobezne strany stejne dlouhe a ostatni dve strany take stejne dlouhe. Nema smysl se bavit o implementaci, kdyz se vychazi ze spatneho popisu sveta.

Kdyz si tohle uvedomim, muzu hledat cestu, jak pripadne vyresit problem obdelnika, ktery nesmi z definice mit vsechny strany stejne dlouhe (pokud nam to fakt vadi). A resit to samozrejme obecne jde.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Dědičnost dnes
« Odpověď #160 kdy: 18. 01. 2017, 16:44:28 »
A zase oblíbený problém vejce vs. slepice...
Kolik toho o tom bylo napsáno a kolikrát na tento problém někdo skutečně v praxi narazil? Proč někdo za každou cenu potřebuje vydělovat čtverec od obdélníku do speciální podtřídy? Jen kvůli tomu, že se to nabízí a že to jde? To není dostatečný argument. Vytvářet speciální podtřídy má smysl jedině tehdy, bude-li to k něčemu dobré, tedy ušetří-li se tím někde nějaká práce, či zpřehlední-li se tím něco. Potřebuje-li někdo mermomocí čtverec, může k tomu dobře posloužit speciální konstruktor (či jiný prostředek k výrobě instancí), který prostě vrátí obdélník s a = b.

Tohle je přesně ten moment, kdy mi na OOP vadí, že spoustu lidí tak nějak motivuje k vytváření si dalších problémů, jež zdánlivě přináší objektový návrh, ještě nad rámec těch, které je třeba doopravdy řešit. Programy manipulující s obdélníky a čtverci existovaly dávno před OOP, ale teprve s OOP lidi od počítačů začali meditovat nad tím, co je od čeho odvozené, a ještě se o tom do krve hádat.
I když ono je to podobné jako s makry v Lispu či s definujícími slovy ve Forthu. Obojí také svádí k nadužívání, jakmile člověk pochopí, jak to funguje. Jenže další fází by mělo být taky pochopení, kdy se na to vykašlat a raději použít nějaký méně cool prostředek.
Čtverec je popsán jen jedním číslem a když jich chci uložit do paměti třeba miliardu, tak už je to znát.

Kiwi

Re:Dědičnost dnes
« Odpověď #161 kdy: 18. 01. 2017, 17:49:29 »
Ten specialni konstruktor je presne to reseni, ktere muze a nemusi fungovat. A prave proto je dobre o tom premyslet.
Čtverec je popsán jen jedním číslem a když jich chci uložit do paměti třeba miliardu, tak už je to znát.

Protože záleží na tom konkrétním problému. A právě proto mi připadá tahle dogmatická disputace o jednom spíše filosofickém podproblému, jenž by hypoteticky někdy mohl být součástí nějakého nadproblému, tak nějak zbytečná. Podstatný je ten hlavní problém.
Jsou případy, kdy nějaký speciální konstruktor v rámci obdélníku bude vhodný, a kdy nikoli. Půjde-li o šetření pamětí, tak sice speciální třídu pro čtverec zavedu, ale rozhodně ji nebudu odvozovat od obdélníku. Dovedu si představit řešení pomocí sdružených tříd (aka abstract factory) či s pomocí změny třídy, nebo něco úplně jiného, zkrátka podle potřeby řešeného problému, ne podle toho, že se čtverec odvodit od obdélníku. Což je přesně to, co se při objektovém návrhu často děje, tj. že se něco zavádí jen proto, že to jde a že má někdo pocit, že by to tak mělo být, a ne proto, že to je k něčemu dobré.
Na tomto problému je dobré jen to, že je vidět, že v různých situacích se hodí různá řešení a recept na to jediné správné prostě bez znalosti dalšího kontextu není.

Re:Dědičnost dnes
« Odpověď #162 kdy: 18. 01. 2017, 18:01:09 »
To původní bylo vlastně velmi jednoduché, jen zprávy mezi objekty, bez ohledu na dědičnost. Celá ta současná diskuse o Javě apod. je pak dost zcestná a není ani tak o OOP, jako o omezeních imperetivních jazyků, na které byly naroubovány objekty a virtuální volání.

Ano, virtuální volání, to je z mého pohledu největší rozpor mezi původním OOP (pozdní vazba s přenesením odpovědnosti na cílový objekt) a dnešní implementací (časná vazba s rozhodováním zdrojového objektu řešená typovou kontrolou).

Co to je "původní OOP"? Něco ještě před Simulou? Protože pojetí tříd, objektů, dědičnosti a virtuálních funkcí v jazyce Simula 67 je blíž dnešním jazykům jako C++ nebo Java, než Smalltalku, který vznikl až po Simule.

Kiwi

Re:Dědičnost dnes
« Odpověď #163 kdy: 18. 01. 2017, 18:07:36 »
To původní bylo vlastně velmi jednoduché, jen zprávy mezi objekty, bez ohledu na dědičnost. Celá ta současná diskuse o Javě apod. je pak dost zcestná a není ani tak o OOP, jako o omezeních imperetivních jazyků, na které byly naroubovány objekty a virtuální volání.

Ano, virtuální volání, to je z mého pohledu největší rozpor mezi původním OOP (pozdní vazba s přenesením odpovědnosti na cílový objekt) a dnešní implementací (časná vazba s rozhodováním zdrojového objektu řešená typovou kontrolou).

Co to je "původní OOP"? Něco ještě před Simulou? Protože pojetí tříd, objektů, dědičnosti a virtuálních funkcí v jazyce Simula 67 je blíž dnešním jazykům jako C++ nebo Java, než Smalltalku, který vznikl až po Simule.

Jenže pojem OOP v době Simuly neexistoval. Ten zavedl až Alan Kay v souvislosti se Smalltalkem.

Re:Dědičnost dnes
« Odpověď #164 kdy: 18. 01. 2017, 18:19:31 »
Odkdy je čtverec (či obdélník)  prostorový útvar??!!! Zpátky na základku! (Proč mluvíte o obsahu?? Proč o dvou nezávislých proměnných?? Mimochodem to, že velikost strany a je stejná jako velikost strany b neznamená, že jsou to nějaké závislé proměnné. Tohle jsou základy matematiky, to by měl každý programátor znát!)

Vhodná definice pojmu (resp. třídy) čtverec se může v závislosti na kontextu dost lišit. Dovedu si představit problémy, pro které se hodí snad všechny varianty třídy Čtverec a jejích vztahů k třídě Obdélník, které zde byly zmíněny. A pokud bude Čtverec součástí množiny tříd pro reprezentaci 3D scény, může být chápán jako prostorový útvar odvozený z Kružnice (která je odvozená z třídy Bod). Zároveň může být Čtverec bázovou třídou pro obdélník i krychli.

Čtverec je speciální případ obdélníku, který má shodou okolností všechny strany stejně dlouhé. Tečka. Tohle se učí na ZŠ...

...a teprve v matematických předmětech na vysoké škole se člověk dozví, že ty "pravdy" ze ZŠ jsou většinou zjednodušení platná jen za specifických podmínek.