Co si myslíte o OOP?

Re:Co si myslíte o OOP?
« Odpověď #1185 kdy: 21. 01. 2019, 21:30:29 »
zvláště u poměrně komplexního pythonu
Co je na Pythonu komplexního?


Re:Co si myslíte o OOP?
« Odpověď #1186 kdy: 21. 01. 2019, 22:03:29 »
Moduly a objekty mi pripadaji jako totez.
Jako totéž to může připadat právě kvůli tomu zparchantělému OOP, co se rozšířilo jako mor a které považuje za normální lézt do jednoho objektu z víc vláken, takže pojem objektu jako entity, která něco dělá, začíná ztrácet smysl.

Pro zjednodušení si stačí představit, že každý objekt má vlastní vlákno. Když objektu Kuchař pošlu zprávu [vař: pizzu], tak vaří pizzu a těžko může zároveň vařit omáčku. Zparchantělé OOP udělalo z objektu Kuchař jenom KuchařskáKniha, ve které si listuje kdo chce, co chce si sám uvaří a ještě ke všemu si stav uvařeného všichni zapisují na jedno místo, o které se perou. Naprosto něco jinýho než původní myšlenka ("objects being like biological cells").

Alespon v erlangu je objekt nejaka isolovana vypocetni jednotka (actor, agent, proces, vlakno, apod.) a ne pouze obycejny dict v prestrojeni.
Právě proto, že v Erlangu[1] je to přesně naopak, než píšeš, je Erlang původní myšlence OOP paradoxně blíž než ty slavné "OOP jazyky".

V Erlangu:

modul = množina funkcí, nástroj pro organizaci kódu do souvisejících celků, tj. "neživá věc", předpis

proces (v tomhle smyslu ekvivalent objektu) = entita, která drží stav, přijímá zprávy a provádí výpočet, tj. "žije", je to "organismus" (viz biologická inspirace původního OOP)

Jo, občas dává smysl mít modul mapovaný na proces 1:1 (často je to obdoba patternu "singleton"), ale pořád jsou to dvě totálně rozdílné věci s naprosto jiným účelem a dobře to pochopit je pro programování v Erlangu naprosto klíčový, bez toho nedá člověk ani ránu.

[1] tady a všude níž můžeme s/Erlang/Elixir/

=====

P.S. Hele, bez urážky, mám pocit, že ten Erlang a Elixir moc neznáš, bylo by imho lepší, kdybys o nich moc nepsal, nebo aspoň vždycky připsal aspoň "IIRC". Těma chybnýma kategorickýma tvrzeníma zbytečně mateš lidi...

Re:Co si myslíte o OOP?
« Odpověď #1187 kdy: 21. 01. 2019, 22:10:48 »
Právě proto, že v Erlangu[1] je to přesně naopak, než píšeš
Jo, teď mi došlo, že tady už jsi možná nemluvil o modulech, z kontextu to není poznat. Pokud ne, tak sry, pak to citovaný beru zpět :)

Martin

Re:Co si myslíte o OOP?
« Odpověď #1188 kdy: 21. 01. 2019, 22:15:21 »
Jako totéž to může připadat právě kvůli tomu zparchantělému OOP, co se rozšířilo jako mor a které považuje za normální lézt do jednoho objektu z víc vláken, takže pojem objektu jako entity, která něco dělá, začíná ztrácet smysl.

Pro zjednodušení si stačí představit, že každý objekt má vlastní vlákno. Když objektu Kuchař pošlu zprávu [vař: pizzu], tak vaří pizzu a těžko může zároveň vařit omáčku. ...
Ten objekt se s tim musi nejak popasovat. Kdyz kuchar vari pizzu a zadas mu jeste varit omacku, tak bud na to ma kapacity a dela 2 veci soucasne (na dnesnich PC proc ne), nebo muze vratit nejake ERROR_BUSY pripadne 2. zadost zaradi do fronty a vyzvedne ji az po vyrizeni 1. zadosti.
Vzdyt je to jen objekt. Paralelni zadosti musi zvladat i fyzicky HW a jeho ovladac. Predstavte si sitovku, ktera vas odmitne pripojit na net, protoze se ted pres ni bavi windows update service s MS servery.

Re:Co si myslíte o OOP?
« Odpověď #1189 kdy: 21. 01. 2019, 22:20:22 »
Ten objekt se s tim musi nejak popasovat. Kdyz kuchar vari pizzu a zadas mu jeste varit omacku, tak bud na to ma kapacity a dela 2 veci soucasne (na dnesnich PC proc ne), nebo muze vratit nejake ERROR_BUSY pripadne 2. zadost zaradi do fronty a vyzvedne ji az po vyrizeni 1. zadosti.
Přesně tak! Ale má to fungovat tak, že já kuchaře o něco požádám a on to buď umí, nebo neumí atd. A ne že se já (vlákno) stanu kuchařem a uvařím si to sám, přičemž kuchařská kniha je napsaná tak, aby dva lidi (vlákna) mohli vařit zaráz, i když o sobě navzájem vůbec nic neví (sdílí jenom zámek).

Chápej, rozdíl je právě v tom, jestli je objekt "jednotka kódu" nebo "jadnotka výpočtu" (neboli "TA entita, která vyvíjí nějakou činnost"). Ve zparchantělém OOP je "objekt" ve skutečnosti spíš modul (a proto někteří lidi moc nechápou, jakej - a vůbec proč - by měl být mezi modulem a objektem rozdíl).


Martin

Re:Co si myslíte o OOP?
« Odpověď #1190 kdy: 21. 01. 2019, 22:30:36 »
Ten objekt se s tim musi nejak popasovat. Kdyz kuchar vari pizzu a zadas mu jeste varit omacku, tak bud na to ma kapacity a dela 2 veci soucasne (na dnesnich PC proc ne), nebo muze vratit nejake ERROR_BUSY pripadne 2. zadost zaradi do fronty a vyzvedne ji az po vyrizeni 1. zadosti.
Přesně tak! Ale má to fungovat tak, že já kuchaře o něco požádám a on to buď umí, nebo neumí atd. A ne že se já (vlákno) stanu kuchařem a uvařím si to sám, přičemž kuchařská kniha je napsaná tak, aby dva lidi (vlákna) mohli vařit zaráz, i když o sobě navzájem vůbec nic neví (sdílí jenom zámek).

Chápej, rozdíl je právě v tom, jestli je objekt "jednotka kódu" nebo "jadnotka výpočtu" (neboli "TA entita, která vyvíjí nějakou činnost"). Ve zparchantělém OOP je "objekt" ve skutečnosti spíš modul (a proto někteří lidi moc nechápou, jakej - a vůbec proč - by měl být mezi modulem a objektem rozdíl).
To, ze o sobe nevedi, je problem kuchare. Kdyz je to schopny nejak zaridit, ze vsechno funguje, nevidim problem. Mame jen omezeny pocet jader (CPU), tak se jadra prevlekaji, chvili hraji cisnika, chvili kuchare.

Pro me je objekt vlastne jen datova struktura + nejake picarny kolem. A ted do me :-)
(uznavam virtualni funkce (= volani pres pointer), muze to dost urychlit vypocet)

Re:Co si myslíte o OOP?
« Odpověď #1191 kdy: 21. 01. 2019, 22:51:47 »
To, ze o sobe nevedi, je problem kuchare. Kdyz je to schopny nejak zaridit, ze vsechno funguje, nevidim problem.
Jenže ve zparchantělém OOP žádný Kuchař (jako entita která něco dělá, tj. aktor[1]), není. Je jenom KuchařskáKniha, což je takový (nepopírám) docela fikaný protokol, postavený na tom, že kolem Knihy chodí lidi (to jsou tam ti aktoři!) a přesně podle návodu cosi do knihy píšou. Každej z těch různých lidí je občas kuchařem, někdy i víc z nich zaráz atd.

Mame jen omezeny pocet jader (CPU), tak se jadra prevlekaji, chvili hraji cisnika, chvili kuchare.
No tak to každopádně. Určitě budeme mít víc aktorů než jader. V tom není problém. Problém je v tom, že to probublává do programu. Pokud by se to dělo způsobem, o kterém programátor vůbec neví a neřeší to, bylo by to naprosto OK (proto jsou taky goroutiny v tomhle smyslu naprosto OK)

Pro me je objekt vlastne jen datova struktura + nejake picarny kolem. A ted do me :-)
Tak jasně no, to nejsi sám. Však když ti to vyhovuje, není problém, užij si to! :) Akorát to prostě vůbec neodpovídá ani základním myšlenkám původního OOP. Je to prostě takové nové zparchantělé OOP© ;)

===
[1] BTW, všimněme si, že "jednotka, která něco dělá" je vlastně doslovný překlad slova "actor" ;)
« Poslední změna: 21. 01. 2019, 22:53:21 od Mirek Prýmek »

Re:Co si myslíte o OOP?
« Odpověď #1192 kdy: 21. 01. 2019, 23:05:01 »
Mimochodem, pokud máš třeba hru, ve které běží v jednom vlákně herní logika a ve druhém GUI a předávají si data přes nějakou frontu/buffer, tak z pohledu původního OOP je to vlastně de facto systém o dvou objektech, které si posílají zprávy.

Z neznámého důvodu je tam teda taky na jiné úrovni abstrakce jakejsi bordel, kde se mnohokrát opakuje slovo "class" a "object", ale to žádný třídy a objekty nejsou, to je jenom nějaká změť těžko uchopitelných pomateností ;)

Kadet

Re:Co si myslíte o OOP?
« Odpověď #1193 kdy: 22. 01. 2019, 00:00:23 »
Moduly a objekty mi pripadaji jako totez. Tj. nejaka skupina funkci (plus pripadne nejaky stav). Ze je to totez je videt na prikladech
1. zapouzdreni se resi u obou a stejnymi zpusoby
2. v pythonu je modul vlastne objekt. A objekt je vlastne dict. Nac tedy pouzivat moduly nebo objekty a ztracet se v komplexite kdyz muzu pouzit obycejny dict
Modul je reprezentace souboru. Objekt je v pythonu vsechno. Mozna mas na mysli tridy. Ty maji dedicnost, funguji jako uzivatelske datove typy a podobne vychytavky. Jak bys to implementoval jen pomoci slovniku?

Jo, ale misto toho, abych zavadel zbytecne koncepty trida, objekt a modul, muzu pouzit proste jen dict.

Dedicnost muzes v dictu naimplementovat jednoduse. Prolinkujes par dictu dohromady a kdyz hledas konkretni metodu/odpoved na prichazejici zpravu projedes ten seznam dictu dokud nenajdes tu funkci.

[dict1, dict2, dict3]

ekvivalentni

class C: pass
class B(C): pass
class A(B): pass

kde A odpovida dict1, B dict2, C dict3

Kdybys implementoval novej jazyk tak udelas nejpravdepodobneji prave tohle.

Kadet

Re:Co si myslíte o OOP?
« Odpověď #1194 kdy: 22. 01. 2019, 00:00:48 »
Právě proto, že v Erlangu[1] je to přesně naopak, než píšeš
Jo, teď mi došlo, že tady už jsi možná nemluvil o modulech, z kontextu to není poznat. Pokud ne, tak sry, pak to citovaný beru zpět :)

Dik, pochopils.

Re:Co si myslíte o OOP?
« Odpověď #1195 kdy: 22. 01. 2019, 00:03:16 »
Dik, pochopils.
Zkus pls psát trochu explicitněji a přesněji. Viz "V Erlangu je objekt [...]" - v Erlangu žádný objekt není, takže těžko odhadovat, o čem mluvíš...

Kadet

Re:Co si myslíte o OOP?
« Odpověď #1196 kdy: 22. 01. 2019, 00:11:15 »
Moduly a objekty mi pripadaji jako totez. Tj. nejaka skupina funkci (plus pripadne nejaky stav). Ze je to totez je videt na prikladech
1. zapouzdreni se resi u obou a stejnymi zpusoby
2. v pythonu je modul vlastne objekt. A objekt je vlastne dict. Nac tedy pouzivat moduly nebo objekty a ztracet se v komplexite kdyz muzu pouzit obycejny dict
Modul je reprezentace souboru. Objekt je v pythonu vsechno. Mozna mas na mysli tridy. Ty maji dedicnost, funguji jako uzivatelske datove typy a podobne vychytavky. Jak bys to implementoval jen pomoci slovniku?

Jo, ale misto toho, abych zavadel zbytecne koncepty trida, objekt a modul, muzu pouzit proste jen dict.

Dedicnost muzes v dictu naimplementovat jednoduse. Prolinkujes par dictu dohromady a kdyz hledas konkretni metodu/odpoved na prichazejici zpravu projedes ten seznam dictu dokud nenajdes tu funkci.

[dict1, dict2, dict3]

ekvivalentni

class C: pass
class B(C): pass
class A(B): pass

kde A odpovida dict1, B dict2, C dict3

Kdybys implementoval novej jazyk tak udelas nejpravdepodobneji prave tohle.

Nejdulezitejsi na tom je, ze moduly jsou to samy. vsechno je to dict v prestrojeni.

c.py:
-

b.py:
import c

a.py:
import b

Kadet

Re:Co si myslíte o OOP?
« Odpověď #1197 kdy: 22. 01. 2019, 00:15:34 »
Dik, pochopils.
Zkus pls psát trochu explicitněji a přesněji. Viz "V Erlangu je objekt [...]" - v Erlangu žádný objekt není, takže těžko odhadovat, o čem mluvíš...

Mas pravdu, v Erlangu neni objekt. Vazu na to diskusi Co je to OOP. V Erlangu beru proces jako actor nebo taky jako 'aktivni' objekt. Neco co je bliz OOP myslence od Kaye nez objekt jako modul v tom cemu ty rikas zparchantele oop.

Re:Co si myslíte o OOP?
« Odpověď #1198 kdy: 22. 01. 2019, 00:23:45 »
Mas pravdu, v Erlangu neni objekt. Vazu na to diskusi Co je to OOP. V Erlangu beru proces jako actor nebo taky jako 'aktivni' objekt. Neco co je bliz OOP myslence od Kaye nez objekt jako modul v tom cemu ty rikas zparchantele oop.
Ok, tak to bylo nedorozumění, v tom případě to chápeš naprosto správně. Omlouvám se.

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Co si myslíte o OOP?
« Odpověď #1199 kdy: 22. 01. 2019, 08:31:28 »
zvláště u poměrně komplexního pythonu
Co je na Pythonu komplexního?

Málokdo zná Python dohloubky. Pro běžné programování to ani není potřeba.

Dobré přednášky o pokročilejších vlastnostech má David Beazley.

třeba https://www.youtube.com/watch?v=sPiWg5jSoZI - metaprogramming

https://www.youtube.com/watch?v=0oTh1CXRaQ0 - modules and packages, nudné téma, ale důležité

https://www.youtube.com/watch?v=MCs5OvhV9S4 - concurrency, trochu starší bez async/await
« Poslední změna: 22. 01. 2019, 08:35:11 od gll »