Java - rozhraní, dědičnost a abstraktní třídy

Re:Java - rozhraní, dědičnost a abstraktní třídy
« Odpověď #60 kdy: 18. 07. 2013, 07:04:30 »
Doporučuji k prostudování jako zajímavost. Totálně odlišný pohled na OOP, jaký představuje CLOS (Common Lisp Object System), může být pro otevřené hlavy v lecčems inspirující.
Mě už OOP přestalo bavit. A před Lispem dávám přednost Erlangu, což je jediný opravdu objektový jazyk ;)  (citace z článku níž)

Vracení jiného objektu je naprosto běžnou záležitostí v objektově velmi čistém Smalltalku. Funguje to dobře a spolehlivě a nikdo se nad tím vůbec nepozastavuje, skoro bych řekl, že o tom ani neuvažuje a bere to jako tu nejpřirozenější věc v programování. "678 asString" prostě vrátí string, ačkoli jde o objekt typu integer, vezmu-li ten nejprimitivnější příklad.
No právě. Proto jsem psal o té zpovykanosti z C++ - spousta lidí si myslí, že umí OOP a přitom to je spíš taková parodie. Asi není potřeba jít přímo do Smalltalku, ten člověk moc v praxi nevyužije,  lepší je Objective C - Apple produkty prožívají hype, programátoři nejsou :)

Ještě pro zajímavost:

Alan Kay himself wrote this famous thing and said "The notion of object oriented programming is completely misunderstood. It's not about objects and classes, it's all about messages". He wrote that and he said that the initial reaction to object oriented programming was to overemphasize the classes and methods and under emphasize the messages and if we talk much more about messages then it would be a lot nicer. The original Smalltalk was always talking about objects and you sent messages to them and they responded by sending messages back.

http://www.infoq.com/interviews/johnson-armstrong-oop


Re:Java - rozhraní, dědičnost a abstraktní třídy
« Odpověď #61 kdy: 18. 07. 2013, 07:07:53 »
P.S. hodně zajímavě vypadá i Go. Že se úplně odstřihlo od všech bláznivin s dědičností, je odvážný krok správným směrem. A automatické ztotožnění interfejsů se stejným obsahem? No to je přesně to, co by člověk od rozumného jazyka očekával :)

Kolemjdoucí

Re:Java - rozhraní, dědičnost a abstraktní třídy
« Odpověď #62 kdy: 18. 07. 2013, 08:30:27 »
Alan Kay himself wrote this famous thing and said "The notion of object oriented programming is completely misunderstood. It's not about objects and classes, it's all about messages".

Je to blázen a to prokazatelně. Dneska takových bláznů pobíhá po světě mnoho, musíme si zvykat.
Koncept zpráv samozřejmě není špatný, ale není to podstata OOP.

Svetozar Bludna

Re:Java - rozhraní, dědičnost a abstraktní třídy
« Odpověď #63 kdy: 18. 07. 2013, 09:04:28 »
Alan Kay himself wrote this famous thing and said "The notion of object oriented programming is completely misunderstood. It's not about objects and classes, it's all about messages".

Je to blázen a to prokazatelně. Dneska takových bláznů pobíhá po světě mnoho, musíme si zvykat.
Koncept zpráv samozřejmě není špatný, ale není to podstata OOP.

Tipuji, že ty jsi ještě běhal po houbách v lese hodně hlubokém, když Kay běhal po světě a v Xeroxích laboratořích v PARC se v 70. letech spolupodílel na utváření objektového konceptu v programování a GUI konceptu v ovládání počítačů.
Jistě by ho velmi obohatilo, kdyby ho hejsek jako ty školil z toho, co on vymýšlel, osočuje ho přitom z nepochopení té věci.

Re:Java - rozhraní, dědičnost a abstraktní třídy
« Odpověď #64 kdy: 18. 07. 2013, 09:18:56 »
Koncept zpráv samozřejmě není špatný, ale není to podstata OOP.
V podstate mas pravdu. Zpravy nejsou podstatou toho, co DNES vetsina lidi za OOP povazuje. Ovsem byly podstatou toho, co kdysi Kay pod pojmem OOP mel namysli, a porad jsou podstatou tech jazyku, kterym se obcas rika "opravdu objektove".

Jinak Kay bude urcite rad, kdyz mu napises email a vysvetlis mu, co to vlastne OOP je. Skoda, ze uz nezije pan Ford, mohl's mu taky napsat vysvetleni, co je to pasova vyroba :))


Kolemjdoucí

Re:Java - rozhraní, dědičnost a abstraktní třídy
« Odpověď #65 kdy: 18. 07. 2013, 09:29:46 »

To mě nebaví, dej sem nějaký důkaz jak se dojde k tomu že OOP je cituji "it's all about messages", nebo mlč.

Ovsem byly podstatou toho, co kdysi Kay pod pojmem OOP mel namysli, a porad jsou podstatou tech jazyku, kterym se obcas rika "opravdu objektove".

OOP vzniklo za účelem usnadnění práce se strukturami a ke znovupoužití kódu, to je historický fakt. Pan Kay si může myslet co chce.

Radek Miček

Re:Java - rozhraní, dědičnost a abstraktní třídy
« Odpověď #66 kdy: 18. 07. 2013, 10:29:00 »

Citace
Mě by spíš zajímalo, jaké výhody má v objektovém návrhu tvařit se, že kružnice nemá s elipsou nic společeného.

Nahraditelnost - tam, kde je potřeba instance typu T, můžete dát instanci jeho podtypu S. Pokud dodržujete LSP, tak tím neovlivníte korektnost programu.

Já chtěl nějaký argument pro podporu nepříbuzenského vztahu elipsy a kružnice, ne k podpoře toho, co jsem napsal. :-) Ano, v případě odvození kružnice od elipsy ji můžete použít na jejím místě, což může mít větší či menší smysl, ale není to principiálně špatně.

Vždyť to je - pokud porušujete LSP (což záleží na specifikaci), tak byste neměl typ používat jako podtyp. Dědičnost sama o sobě nevadí.

Radek Miček

Re:Java - rozhraní, dědičnost a abstraktní třídy
« Odpověď #67 kdy: 18. 07. 2013, 12:03:31 »
P.S. hodně zajímavě vypadá i Go. Že se úplně odstřihlo od všech bláznivin s dědičností, je odvážný krok správným směrem. A automatické ztotožnění interfejsů se stejným obsahem? No to je přesně to, co by člověk od rozumného jazyka očekával :)

Ano, má strukturální podtypový polymorfismus místo nominálního. Občas je to však také nevýhoda.

OCaml používá řádkový polymorfismus (row polymorphism), což je slabší než podtypový polymorfismus, ale v praxi to typicky nevadí a lépe to funguje s typovou inferencí.

Svetozar Bludna

Re:Java - rozhraní, dědičnost a abstraktní třídy
« Odpověď #68 kdy: 18. 07. 2013, 12:10:35 »

To mě nebaví, dej sem nějaký důkaz jak se dojde k tomu že OOP je cituji "it's all about messages", nebo mlč.

Ovsem byly podstatou toho, co kdysi Kay pod pojmem OOP mel namysli, a porad jsou podstatou tech jazyku, kterym se obcas rika "opravdu objektove".

OOP vzniklo za účelem usnadnění práce se strukturami a ke znovupoužití kódu, to je historický fakt. Pan Kay si může myslet co chce.

The Smalltalk language, which was developed at Xerox PARC (by Alan Kay and others) in the 1970s, introduced the term object-oriented programming to represent the pervasive use of objects and messages as the basis for computation.

Jinými slovy, názor pana Kaye je názorem jedním z otců-zakladatelů OOP. V tomto světle působí tvůj názor na jeho názor poměrně legračně, nezdráhal bych se říci přímo hloupě.

Radek Miček

Re:Java - rozhraní, dědičnost a abstraktní třídy
« Odpověď #69 kdy: 18. 07. 2013, 12:15:38 »

To mě nebaví, dej sem nějaký důkaz jak se dojde k tomu že OOP je cituji "it's all about messages", nebo mlč.

Ovsem byly podstatou toho, co kdysi Kay pod pojmem OOP mel namysli, a porad jsou podstatou tech jazyku, kterym se obcas rika "opravdu objektove".

OOP vzniklo za účelem usnadnění práce se strukturami a ke znovupoužití kódu, to je historický fakt. Pan Kay si může myslet co chce.

The Smalltalk language, which was developed at Xerox PARC (by Alan Kay and others) in the 1970s, introduced the term object-oriented programming to represent the pervasive use of objects and messages as the basis for computation.

Jinými slovy, názor pana Kaye je názorem jedním z otců-zakladatelů OOP. V tomto světle působí tvůj názor na jeho názor poměrně legračně, nezdráhal bych se říci přímo hloupě.

Pojmy se vyvíjejí. Podívejte se třeba na pojem funkce v matematice dnes a v době Eulera - dříve bylo běžné, že funkce může mít více různých hodnot v jednom bodě.

Re:Java - rozhraní, dědičnost a abstraktní třídy
« Odpověď #70 kdy: 18. 07. 2013, 16:44:22 »
OOP vzniklo za účelem usnadnění práce se strukturami a ke znovupoužití kódu, to je historický fakt. Pan Kay si může myslet co chce.
Pan Kay ví i co se při vzniku OOP obědvalo. Být tebou, už bych ze sebe nedělal většího vola než už se ti podařilo. I když vlastně jako anonym to máš jedno - při nejhorším si dáš nový nick no...

Ano, má strukturální podtypový polymorfismus místo nominálního. Občas je to však také nevýhoda.
Jaké to má nevýhody? Že je složitější určit (pod)typ v úplně dynamických případech, kdy o objektu předem nic nevím?

Pojmy se vyvíjejí. Podívejte se třeba na pojem funkce v matematice dnes a v době Eulera - dříve bylo běžné, že funkce může mít více různých hodnot v jednom bodě.
To je sice pravda, ale posílání zpráv je silný koncept s mnoha důsledky. Od možnosti dynamického dispatchingu zpráv až po funkční oddělení modulů programu. To, že se na posílání zpráv pozapomnělo, je jenom ke škodě.

Radek Miček

Re:Java - rozhraní, dědičnost a abstraktní třídy
« Odpověď #71 kdy: 18. 07. 2013, 18:31:37 »
Ano, má strukturální podtypový polymorfismus místo nominálního. Občas je to však také nevýhoda.
Jaké to má nevýhody? Že je složitější určit (pod)typ v úplně dynamických případech, kdy o objektu předem nic nevím?

První nevýhoda je, že při (náhodné) shodě rozhraní mohu omylem dávat instance jednoho rozhraní místo instancí druhého rozhraní, i když spolu vůbec nesouvisí. Lepší by IMO bylo, aby se muselo explicitně někam vypsat, co je podtyp čeho, a kompilátor by to zkontroloval a udělal z toho reflexivní tranzitivní uzávěr (neboť relace býti podtyp je předuspořádání).

Druhá nevýhoda je, že implementace jsou méně efektivní. Problém je v tom, že různé instance mohou mít různé metody a ten, kdo chce tyto metody volat, musí nějak zjistit jejich adresy. Např. OCaml to dělá tak, že během kompilace zahashuje jména všech metod, a když se má nějaká metoda zavolat, tak se v hashtabulce dané instance najde její adresa. Go to dělá tak, že při přetypování instance na nějaké rozhraní vygeneruje vtabulku pro dané rozhraní - pokud to nejde staticky, tak se to dělá za běhu. Haskell to dělá tak, že pro každou typovou třídu (cca rozhraní) udělá vtabulku a tyto vtabulky předává implicitně jako další argumenty společně s hodnotou.

Re:Java - rozhraní, dědičnost a abstraktní třídy
« Odpověď #72 kdy: 18. 07. 2013, 19:38:11 »
Díky za vysvětlení, aspoň neumřu blbej :)

dl

Re:Java - rozhraní, dědičnost a abstraktní třídy
« Odpověď #73 kdy: 18. 07. 2013, 19:58:28 »
Jestli chceš s něčím opravdu poradit, pokládej otázku třeba na stackoverflow.com. Když bude blbá, řeknou ti to tam hned. Když ti budou chtít poradit,  udělaj to jasně a stručně, tady ta onanie, to je opravdu k ničemu.

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:Java - rozhraní, dědičnost a abstraktní třídy
« Odpověď #74 kdy: 18. 07. 2013, 22:04:48 »
Takto obecné otázky (= "učím se programovat") bych dal spíš na http://programmers.stackexchange.com/ - patří to pod stejnou skupinu (stackexchange), ale tato síť se zaměřuje spíš na obecné otázky, než na konrétní technické problémy.