Co si myslíte o OOP?

v

Re:Co si myslíte o OOP?
« Odpověď #615 kdy: 07. 01. 2019, 08:54:05 »
Nepustí:
No dobře, tak ten string bude trochu víc zakuklenej no. Třeba do atributu.
pustí i bez kukly
Kód: [Vybrat]
>>> def some_func_anywhere():
...   return 1 + "x"
...
>>> some_func_anywhere()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in some_func_anywhere
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>>


SB

Re:Co si myslíte o OOP?
« Odpověď #616 kdy: 07. 01. 2019, 09:30:32 »
V OOP je dynamické typování opravdu výhodnější - kvůli polymorfismu a velmi pozdní vazbě.

Už to tu psal tuším p. Prýmek: Typ typování souvisí jen okrajově s polymorfismem - typovaný systém vede pouze na užší vyhledávání metody na straně obeslaného objektu dle typů ve zprávě, nic víc. Nepleťte si to s prasojazyky Java a C#, kdy jejich problémem není samotné typování, ale tzv. podtypový polymorfismus jako prostředek realizace časné vazby znemožňující kamarádění objektů (instancí) typově (třídně) nepříbuzných.
Tak jinak - jak by podle tebe vypadala implementace polymorfismu tak, jak je chápán v objektovém paradigmatu, prostředky (nikoli jejich obcházením) staticky typovaného prostředí?

- Pro komunikaci objektů by se používalo zasílání zpráv (jinak by to nebylo OOP a nefungoval bezpodmínečný polymorfismus), takže jakémukoliv objektu by šlo zaslat jakoukoliv zprávu bez ohledu na typ cíle.
- Zpráva by obsahovala mimo názvu metody a parametrů i (třeba i jen volitelně) jejich typ a požadovaný typ návratové hodnoty, čímž by dohledávání metody objektem nepodléhalo pouze názvu a počtu parametrů, ale i typům parametrů a návratové hodnoty (dle pravidla Liskovové).

Re:Co si myslíte o OOP?
« Odpověď #617 kdy: 07. 01. 2019, 09:36:36 »
(dle pravidla Liskovové).
A ještě lepší by bylo tam podtypový polymorfismus vůbec nemít, ušetřili bysme si spoustu bolehlavů ;)

SB

Re:Co si myslíte o OOP?
« Odpověď #618 kdy: 07. 01. 2019, 09:43:51 »
Tak to máte docela nízké požadavky na kvalitu. Python je sice syntakticky přehledný a má dost knihoven, takže se v něm rychle dělá, ale ZCELA ZBYTEČNĚ obsahuje neobjektové konstrukce (len(řetězec), ...), na zapouzdření dlabe (přestože implementace by pravděpodobně ani nebyla složitá), definice třídních metod je řešena nekoncepčně přes jakési anotace... To mě napadá jen tak z hlavy, na co jsem stihnul zběžně narazit.
Neobjektové konstrukce nejsou zbytečné, python není oop jazyk, ale hybridní. Jestli mu neco vycist, tak to, ze by default krome len(list) neumi i list.len(). Zapouzdreni ma. Proc povazujete dekoratory za nekoncepcni? Python nepouziva modifikujici klicova slova, ale obecneji fungujici a uzivatelsky nastavitelne dekorarory, coz je koncept.

A jaký má smysl zavádět imperativní konstrukce s objekty, jestliže je to bez přínosu a komplikuje to jazyk i jeho implementaci?
Opravdu se tu nehodlám dohadovat s někým, co je to zapouzdření a zda jej má Python, OPRAVDU NE!
Proč tedy není i u instanční metody anotace "@instancemethod"?

nzn

Re:Co si myslíte o OOP?
« Odpověď #619 kdy: 07. 01. 2019, 09:45:17 »
To všechno je ale pod kapotou netypovaný dict. viz x.__dict__
Ne že by to v diskusi bylo podstatné, ale ne vše je zakuklený dict, viz __slots__ (ono pro malé třídy je dict dost overkill).


Re:Co si myslíte o OOP?
« Odpověď #620 kdy: 07. 01. 2019, 09:49:08 »
Ne že by to v diskusi bylo podstatné, ale ne vše je zakuklený dict, viz __slots__ (ono pro malé třídy je dict dost overkill).
To je ale jenom optimalizace, která pro to, o čem se bavíme, nejenom že není podstatná, ale nemá to vůbec žádný vliv.

SB

Re:Co si myslíte o OOP?
« Odpověď #621 kdy: 07. 01. 2019, 10:07:47 »
Viděl jsi často, že by hostinský točil pivo do papírové krabice, přestože mu v tom nic nebrání? Jistě by šlo zařídit, aby se pípa odjistila jen v případě, že pod sebou detekuje konkrétně určený značkový půllitr. Mě by popadl rapl a ta pípa by letěla na smetiště hned v okamžiku, kdy by mi odmítala pustit pivo do džbánku.
Smysl statických typů je zajistit, aby se něco takového nestalo. Když zůstaneme u přirovnání, tak ty budeš muset hostinského zaškolit, a ještě nainstalovat kameru, aby si ho sledoval, zda nečepuje pivo přímo do pusy. A stejně ho neuhlídáš. Zatímco já tam budu moct dát cedulku "samoobslužná pípa".


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???

SB

Re:Co si myslíte o OOP?
« Odpověď #622 kdy: 07. 01. 2019, 10:13:35 »
Pak samozřejmě můžeš dojít k závěru, že nevíš, a že tam chceš dát cokoliv. Tak dáš typ *, a budeš tam moct uložit opravdu cokoliv.

Vizte můj příspěvek dříve: Není problémem vytvořit seznam s prvky typu objekt a najebat do něj cokoliv, problémem je potom nad tímto seznamem spustit sumu na vlastnost "cena" nebo "objem". Jak se to udělá v statickém jazyku?

Re:Co si myslíte o OOP?
« Odpověď #623 kdy: 07. 01. 2019, 10:16:55 »
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???
Proč je tam to "ne nutně"? Pokud chci zjistit, jestli se mi tam vlezou, pak musí na ty zprávu odpovídat nutně, jinak nemůžu rozhodnout, jestli se mi tam vlezou.

Pak taky není pravda to "netypový" a "nezajímá mě, co to je". "Netypový" by znamenalo, že o těch objektech nemám vůbec žádnou informaci. Já ale nějakou mám: odpovídají na zprávu "hmotnost" a "velikost". To je typ.  (Odbočka: ) Přesvědčení, že to typ není, vychází imho z internalizace zparchantělého OOP založeného jenom na dědičnosti.

Jak by se to vyřešilo? Snadno. Už víme, že ty objekty mají nějaký typ. Stačí ho pojmenovat (např. HasWeightAndDimension) a pak už snadno můžu říct, že pracuju s polem HasWeightAndDimension[].

Jak to přesně technicky udělat, na to asi bude víc způsobů. Jeden konkrétní je třeba ten, který ma Go: struktury implementují rozhraní implicitně - tj. jakmile jsou pro strukturu definované všechny potřebné metody, je interface implementovaný, není potřeba to explicitně prohlašovat.

SB

Re:Co si myslíte o OOP?
« Odpověď #624 kdy: 07. 01. 2019, 10:19:15 »

Ale ne. Dle principu sebeodpovědnosti objektu každý objekt definuje uspořádání (např. isLessThan:), metodě sort už pak stačí je obecně a polymorfně ověřovat pro jednotlivé páry, aniž by o nich musela cokoliv vědět.

Dokud ti staci jedno usporadani...

Není problémem zapracovat další zvláštní, pojmenovaná uspořádání.

v

Re:Co si myslíte o OOP?
« Odpověď #625 kdy: 07. 01. 2019, 10:23:41 »
Viděl jsi často, že by hostinský točil pivo do papírové krabice, přestože mu v tom nic nebrání? Jistě by šlo zařídit, aby se pípa odjistila jen v případě, že pod sebou detekuje konkrétně určený značkový půllitr. Mě by popadl rapl a ta pípa by letěla na smetiště hned v okamžiku, kdy by mi odmítala pustit pivo do džbánku.
Smysl statických typů je zajistit, aby se něco takového nestalo. Když zůstaneme u přirovnání, tak ty budeš muset hostinského zaškolit, a ještě nainstalovat kameru, aby si ho sledoval, zda nečepuje pivo přímo do pusy. A stejně ho neuhlídáš. Zatímco já tam budu moct dát cedulku "samoobslužná pípa".


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???

jedna z obecnějších možností:
Kód: [Vybrat]
{-# LANGUAGE ExistentialQuantification, ConstraintKinds, GADTs #-}

data Ex c = forall x. c x => Ex x

instance x ~ Show => Show (Ex x) where
    show (Ex x) = show x

xxx :: [Ex Show]
xxx = [Ex (), Ex 2, Ex "3"]

main = print xxx

JS

Re:Co si myslíte o OOP?
« Odpověď #626 kdy: 07. 01. 2019, 10:24:32 »
Pak samozřejmě můžeš dojít k závěru, že nevíš, a že tam chceš dát cokoliv. Tak dáš typ *, a budeš tam moct uložit opravdu cokoliv.

Vizte můj příspěvek dříve: Není problémem vytvořit seznam s prvky typu objekt a najebat do něj cokoliv, problémem je potom nad tímto seznamem spustit sumu na vlastnost "cena" nebo "objem". Jak se to udělá v statickém jazyku?

V Haskellu existuje vic moznosti, jak na to. Muzeme si definovat typovou tridu (neco jako interface) a definovat jeji instance pro kazdy z tech typu. Druha moznost je pouzit plnohodnotne dynamicke typy - typ Data.Dynamic v Haskellu.

Cela ta otazka je tak trochu strawman. Ve staticky typovanych jazycich se samozrejme muzeme typove kontroly zbavit, v pripadech, kdy to proste staticky typove zkontrolovat nelze. To je ten trivialni smer. Potiz je v tom opacnem smeru - pridat do dynamicky typovaneho jazyka statickou typovou kontrolu, aniz bychom do nich pridali typechecker.

SB

Re:Co si myslíte o OOP?
« Odpověď #627 kdy: 07. 01. 2019, 10:37:33 »
Fakt nechápu, co tu řešíte. Když vemu ten úžasný Python, tak pokud mám methodu:
Kód: [Vybrat]
def get_record(self, data):
Tak co ta metoda vrací? A co jí mám poslat? Fakt někdo chce takový jazyk používat na víc než na hraní a skriptíky?

Tak především jste v uvedeném případě udělal jednu z nejzákladnějších a nejhorších chyb v psaní kódu (standard většiny "vývojářů"), to je, že jste špatně pojmenoval jak metodu, tak její druhý parametr nicneříkajícím označením. A jestli si myslíte, že typovaně

Propocet get_record(Object self, Integer data)

to bude lepší, tak se mýlíte.


krasty

Re:Co si myslíte o OOP?
« Odpověď #628 kdy: 07. 01. 2019, 10:47:19 »
hovna tecou proudem

SB

Re:Co si myslíte o OOP?
« Odpověď #629 kdy: 07. 01. 2019, 11:15:10 »
...Ale type-hinting bude furt slabej proti plnohodnotnému statickému systému.

Samozřejmě. Na druhou stranu existuje nějaký ten "plnohodnotný" statický systém? Ať se tu nebavíme o něčem nedosažitelném.