Co si myslíte o OOP?

SB

Re:Co si myslíte o OOP?
« Odpověď #690 kdy: 08. 01. 2019, 09:55:29 »
Smysl je ve flexibilite. Zadne paradigma neni objektivne lepsi nez jine a pro ruzne situace muze byt jednou vhodnejsi to a podruhe ono, v Pythonu si je lze podle potřeby vybrat a kombinovat je, zlepsuje to vyjadrovaci prostredky jazyka. To je bez pochyby prinosne a obliba Pythonu prokazuje, ze to za pripadne komplikace stoji.

Nedohadujte se, Python zapouzdreni ma, at se vam to libi nebo ne. Zapouzdreni je abstrakce, ktera progranatorum umoznuje urcity pristup k programovani a Python tento pristup umoznuje.

@instancemethod neni anotace, ale dekorator a tento tam neni, protoze je to vychozi chovani. Stejne byste se mohl ptat, proc se v matematice nepise + pred kladnymi cisly, kdyz u zapornych se pise -.

Tady se neshodneme.
Pythonové "zapouzdření" už neřešte, to už je vyřešené.
Myslím, že jednoduchost, přehlednost, přímočarost, pochopitelnost a systematičnost mnou navrhovaného "classdef" je jasná.


Re:Co si myslíte o OOP?
« Odpověď #691 kdy: 08. 01. 2019, 09:55:57 »
Mate problem uvest ekvivalent primitivni demonstracni ukazky, jejiz podstata vam unika a chytate se marginalii. Po vas se chce, abysye odpovedeli stejne jednoduchou principialni (princip introspekce) ukazkou jak tehoz dosahnout v bezne pouzivanem jazyce se statickymi typy. Popripade pripustili, ze to jednoduse udelat nejde a pochopili s tim, kde jsou vyhody dynamickych jazyku.
Dobyvas se do otevrenych dveri. Nikdo tady netvrdi, ze ve statickych jazycich existuji ekvivalenty ke vsem konstrukcim dynamickych jazyku.

Mohl bys pouzit daleko jednodussi argument:

Naimplementujte tohle, volové!
Kód: [Vybrat]
x = pickle.load(...)

To ve statickém jazyce nejde. Minimálně ne tak snadno. A nikdo to nerozporuje.

--
Jinak, celá tahle žabomyší válka je fakt tragikomicky dětinská.

SB

Re:Co si myslíte o OOP?
« Odpověď #692 kdy: 08. 01. 2019, 09:58:29 »
Vývojář by se především měl zeptat sám sebe, zda ten počet prvků potřebuje k dosažení cíle. Například zmíněné metody seznam.forEach(), seznam.max() tuto potřebu zpravidla eliminují.

Proto o tom mluvím. Kvalitní (jakýkoliv) systém má být především minimalistický, barokních molochů máme všude kolem sebe 3 pr-dele.

v

Re:Co si myslíte o OOP?
« Odpověď #693 kdy: 08. 01. 2019, 10:00:57 »
Naimplementujte tohle, volové!
Kód: [Vybrat]
x = pickle.load(...)

To ve statickém jazyce nejde. Minimálně ne tak snadno. A nikdo to nerozporuje.
http://hackage.haskell.org/package/python-pickle-0.2.3/docs/Language-Python-Pickle.html ?

BaldSlattery

Re:Co si myslíte o OOP?
« Odpověď #694 kdy: 08. 01. 2019, 10:01:55 »
Nemá smysl řešit, že použijete např. typový seznam, když to potřebujete. Problémem u statických jazyků je použití seznamu v případě, kdy v něm potřebujete různé prvky.

Příklad: Mám batoh s danou nosností a objemem a (netypový) seznam blíže neurčených předmětů (= nezajímá mě, co to je), jejichž jediným společným prvkem (a to ještě ne nutně) je, že odpovídají na zprávu "hmotnost" a "velikost", a chci zjistit, zda se mi do toho batohu vlezou. Jak se to řeší typovaným seznamem???
Rozhraním, ne? V ObjC se to jmenuje protokol, řekne se, jakou metodu má implementovat, a zbytek už je triviální.

Znamená to, že mám-li různé seznamy různých prvků, nad kterými potřebuju spouštět pokaždé jiné metody, musejí mít ony prvky rozhraní vždy s danou kombinací spouštěných metod, nebo rovnou pro každou metodu jedno rozhraní?
Jasně, že ne. Dělá se to jako protokoly třeba v ObjC. Když už někdo potřebuje takto heterogenní seznam, musí pak použít ve Smalltalk-like jazycích conformsTo: a jinde třeba typové aserce, implementace bývá zcela stejná.


SB

Re:Co si myslíte o OOP?
« Odpověď #695 kdy: 08. 01. 2019, 10:02:12 »
Rozhraním, ne? V ObjC se to jmenuje protokol, řekne se, jakou metodu má implementovat, a zbytek už je triviální.

Jenže co když některé položky seznamu toto rozhraní nesplňují a tuto metodu implementovánu nemají?
Tak nemá smysl cpát je do batohu, to by si stěžoval i Smalltalk.

Kit to možná chtěl napsat opačně: Co když položky metodu implementovanou mají, ale není v rozhraní.

Re:Co si myslíte o OOP?
« Odpověď #696 kdy: 08. 01. 2019, 10:03:06 »

BaldSlattery

Re:Co si myslíte o OOP?
« Odpověď #697 kdy: 08. 01. 2019, 10:10:40 »
Rozhraním, ne? V ObjC se to jmenuje protokol, řekne se, jakou metodu má implementovat, a zbytek už je triviální.

Jenže co když některé položky seznamu toto rozhraní nesplňují a tuto metodu implementovánu nemají?
Tak nemá smysl cpát je do batohu, to by si stěžoval i Smalltalk.

Kit to možná chtěl napsat opačně: Co když položky metodu implementovanou mají, ale není v rozhraní.
To je pak chyba v návrhu. Ve smalltalkoidním jazyce by nešlo použít conformsTo:, muselo by se sáhnout po respondsTo:, což je méně efektivní nejspíš ve všech jazycích, protože introspekce. Tohle je zřejmě důvod, proč je v Go konformance automatická. Nicméně pokud někdo udělá takovou botu třeba v Javě, tak musí sáhnout po reflexi jako ve Smalltalku, to není nic objevného.

Re:Co si myslíte o OOP?
« Odpověď #698 kdy: 08. 01. 2019, 10:31:49 »
Tohle je zřejmě důvod, proč je v Go konformance automatická.
Co tím myslíš? Můžeš to rozvést nebo ilustrovat kódem?

BaldSlattery

Re:Co si myslíte o OOP?
« Odpověď #699 kdy: 08. 01. 2019, 10:55:07 »
Tohle je zřejmě důvod, proč je v Go konformance automatická.
Co tím myslíš? Můžeš to rozvést nebo ilustrovat kódem?
To přece sám znáš, v Go se neuvádí u struktur implementovaná rozhraní, překladač si je odvodí sám podle implementovaných metod. Příklad: Když nedefinuju pro nějakou svou struct metodu String(), automaticky ji překladač považuje za Stringer, což je rozhraní ze standardní knihovny. To řeší tu zmiňovanou chybu kodéra, co zapomene uvést rozhraní jako podporované.

operator

Re:Co si myslíte o OOP?
« Odpověď #700 kdy: 08. 01. 2019, 11:01:28 »
Mate problem uvest ekvivalent primitivni demonstracni ukazky, jejiz podstata vam unika a chytate se marginalii. Po vas se chce, abysye odpovedeli stejne jednoduchou principialni (princip introspekce) ukazkou jak tehoz dosahnout v bezne pouzivanem jazyce se statickymi typy. Popripade pripustili, ze to jednoduse udelat nejde a pochopili s tim, kde jsou vyhody dynamickych jazyku.
Dobyvas se do otevrenych dveri. Nikdo tady netvrdi, ze ve statickych jazycich existuji ekvivalenty ke vsem konstrukcim dynamickych jazyku.

Mohl bys pouzit daleko jednodussi argument:

Naimplementujte tohle, volové!
Kód: [Vybrat]
x = pickle.load(...)
To ve statickém jazyce nejde. Minimálně ne tak snadno. A nikdo to nerozporuje.
Jinak, celá tahle žabomyší válka je fakt tragikomicky dětinská.
Pickle pro me neni stezejni. Kdyz slysim dynamicky jazyk, je to pro me v prvni rade flexibilita a jednoduchost psani prehledneho kodu ktery jde primeji k podstate veci a v druhe rade moznost 'magickeho' zasahovani do chodu programu. Moznost menit hriste, na kterem se hraje. To nezajimavejsi na pythonu pro me se popisuje v runtime services: https://docs.python.org/3/library/python.html Obavam se, ze  kritici dynamickych jazyku nevi co to vlastne obnasi, nikdy se nepodivali za zrcadlo. Neumi vyuzit dynamickeho prostredi, boji se ho, jeho moznostina svobody a preferuji totalitu statickeho prostredi, prijde jim bezpecnejsil

Re:Co si myslíte o OOP?
« Odpověď #701 kdy: 08. 01. 2019, 11:03:10 »
To přece sám znáš, v Go se neuvádí u struktur implementovaná rozhraní, překladač si je odvodí sám podle implementovaných metod. Příklad: Když nedefinuju pro nějakou svou struct metodu String(), automaticky ji překladač považuje za Stringer, což je rozhraní ze standardní knihovny. To řeší tu zmiňovanou chybu kodéra, co zapomene uvést rozhraní jako podporované.
Jasny, ja jsem jenom blbe pochopil kontext. Ok, dik.

BaldSlattery

Re:Co si myslíte o OOP?
« Odpověď #702 kdy: 08. 01. 2019, 11:10:46 »
To přece sám znáš, v Go se neuvádí u struktur implementovaná rozhraní, překladač si je odvodí sám podle implementovaných metod. Příklad: Když nedefinuju pro nějakou svou struct metodu String(), automaticky ji překladač považuje za Stringer, což je rozhraní ze standardní knihovny. To řeší tu zmiňovanou chybu kodéra, co zapomene uvést rozhraní jako podporované.
Jasny, ja jsem jenom blbe pochopil kontext. Ok, dik.
BTW tohle by měly mít všechny jazyky, je to praktické.

SB

Re:Co si myslíte o OOP?
« Odpověď #703 kdy: 08. 01. 2019, 11:17:43 »
Pepa vyrobí .size(), Franta vyrobí .length(), Honza vyrobí .len() ... a pak se v tom vyznej (to už se mi stalo).

Generické věci využívající generické protokoly nemusí bordelit třídní namespace a zbytečně komplikovat dědičnost. Například len() se podívá, jestli si třída implementuje __len__ a pokud ne, tak si ji projde a spočítá počet prvků, takže funguje s čímkoliv, co je iterable. Ditto ostatní takové věci. Ale Control-Space Enter, já vím.

Vidíte, a já měl vždy za to, že to, co vy označujete za bordelení, je cílenou strukturou z důvodu polymorfismu, kdy metoda "len" je implementována ve všech iterable a se stejným názvem, využiju-li k tomu ještě sdílení kódu dědičností, může to stačit napsat jednou. Místo toho funkce "len" přesouvá odpovědnost z objektů do sebe, kdy ve vlastní režii řeší (se snaží řešit), co že je iterable a jakou metodou sděluje délku. Co třídy neodvozené z iterable? Co třídy, které mají zároveň size i len s různým významem? Tohle je bordelení!

Navíc python do jisté míry podporuje funkcionální styl programování, kde se přesně takové věci dělají. A když už mám jazyk, co takové programování podporuje, tak proč bych to nevyužil? Šetří to psaní, lépe se píšou výrazy ve funkcionálním stylu.

Funkcionální programování, nebo jen funkcionální zápis?
To lepší psaní asi nebude objektivně doložitelné, že?

...Když si někde vytvořím _my_private, tak by v code review mělo být nad slunce jasné, že když někdo napíše neco._my_private, že je něco asi špatně.

Bude to v code review stačit? Co interpret, ví o tom?

SB

Re:Co si myslíte o OOP?
« Odpověď #704 kdy: 08. 01. 2019, 11:22:23 »
Není to problém. Prostě nad tím pustím tu funkci sum() která vynucuje vlastnost "cena" či "objem". A ono se to transitivně propíše i do toho seznamu. Takže někdy v tom okamžiku mi kompilátor začne řvát, že tam má něco nedomyšleného, ať to laskavě domyslím.

Prosím?!