Co si myslíte o OOP?

Kit

Re:Co si myslíte o OOP?
« Odpověď #345 kdy: 03. 01. 2019, 13:55:45 »
Za kvalitní objektový jazyk považuji Python...

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.

Zapouzdření nemusí být fyzické. Stačí, když programátor nepřistupuje z vnějšku k atributům instance, a to ani prostřednictvím getterů či setterů.

Python je multiparadigmatickým jazykem, neobjektové konstrukce sice působí divoce, ale jsou tam. Žádný jazyk není dokonalý. Třídní (statické?) metody nepoužívám, takže příslušné anotace ani nemusím řešit.


SB

Re:Co si myslíte o OOP?
« Odpověď #346 kdy: 03. 01. 2019, 14:26:50 »
...Protoze me prijde, ze je tady jasny trend, ze od OOP, a myslim tim ted to puritanske paradigma, se ustupuje uz nekolik let jak v Jave, tak v C#. Tomu se rika stredni cesta, jestlis o tom nekdy neslysel. A dam vsadil bych se ze proto, ze se lidi sw inzenyri napric celou industry vic a vic shodli, ze to proste je takhle LEPSI. A kdyz je to takhle LEPSI, tak je to proste LEPSI.

Těžko ustupovat od (Kayova) OOP, když se vlastně nikdy ani pořádně nepoužívalo.
Tu shodu bych prosil doložit.
Co je to "industry"?

Kit

Re:Co si myslíte o OOP?
« Odpověď #347 kdy: 03. 01. 2019, 14:46:03 »
...Protoze me prijde, ze je tady jasny trend, ze od OOP, a myslim tim ted to puritanske paradigma, se ustupuje uz nekolik let jak v Jave, tak v C#. Tomu se rika stredni cesta, jestlis o tom nekdy neslysel. A dam vsadil bych se ze proto, ze se lidi sw inzenyri napric celou industry vic a vic shodli, ze to proste je takhle LEPSI. A kdyz je to takhle LEPSI, tak je to proste LEPSI.
Těžko ustupovat od (Kayova) OOP, když se vlastně nikdy ani pořádně nepoužívalo.
Tu shodu bych prosil doložit.
Co je to "industry"?

To budou asi tím, že ti inženýři chtějí programovat strukturovaně v jakémkoli jazyce. To není střední cesta, ale nešikovný návrat k assembleru.

Návrhové vzory jsou v pořádku, jen si mnozí pletou jejich případy užití. Nedivím se, že pak nadávají na OOP.

BoneFlute

  • *****
  • 1 823
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #348 kdy: 03. 01. 2019, 17:03:11 »
O pár stránek zpět bylo propagováno oddělení funkcí od datových struktur, což je přesně proti myšlence OOP, tedy že metody jsou co nejblíž k datům, se kterými pracují.

OOP je o umístění stavu do objektu a o polymorfismu.

To nestačí. Kit to píše dobře. Myšlenkou OOP je, že stavy bez popisu svých změn a změny bez stavů nemají smysl, neboli jsou neoddělitelné.

To co popisuješ není dobrá definice. Vejdou se do toho snad všechny funkcionální jazyky. A možná i mnoho dalších neOOP.

Funkcionální jazyky neznám, ale z toho, co jsem zatím viděl, řeší výpočet přesně opačně.

Kód: [Vybrat]
type Person = Person String String Int
getName (Person x _ _) = x
getSurname (Person _ x _) = x
getAge (Person _ _ x) = x
getFullname p = getName p .. " " .. getSurname p .. " (" .. getAge p .. ")"
parsePerson :: String -> Person
parsePerson s = ......

- funkce popisují změny stavu
- bez stavu nemají smysl
- jsou neoddělitelné

Jediný rozdíl je, že ten stav je vně.

Kiwi

Re:Co si myslíte o OOP?
« Odpověď #349 kdy: 03. 01. 2019, 18:01:59 »
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í?


operator

Re:Co si myslíte o OOP?
« Odpověď #350 kdy: 03. 01. 2019, 18:42:12 »
Za kvalitní objektový jazyk považuji Python...
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.

Kit

Re:Co si myslíte o OOP?
« Odpověď #351 kdy: 03. 01. 2019, 19:22:30 »
Funkcionální jazyky neznám, ale z toho, co jsem zatím viděl, řeší výpočet přesně opačně.
- funkce popisují změny stavu
- bez stavu nemají smysl
- jsou neoddělitelné

Jediný rozdíl je, že ten stav je vně.

- Funkce přece nepopisují změny stavu, ale transformují vstupní data na výstupní. Objekty nemusí měnit svůj stav a mnohé jsou zcela immutable.
- Funkce mají smysl i bez stavu. Co třeba sinus nebo logaritmus? Kde mají ten stav? Výstup se neukládá tam, kde dříve byl vstup, ale posílá se dál.
- V OOP jsou instance navázány na metody. U funkcí se data volně přiřazují přes parametry dle potřeby

Netvrdím, že tu není podobnost, dokonce se v OOP dá mírně inspirovat z FP, ale těch rozdílů je docela dost. Ve FP je docela kladen důraz na typování, zatímco v OOP není podstatné.

Inkvizitor

Re:Co si myslíte o OOP?
« Odpověď #352 kdy: 03. 01. 2019, 19:38:02 »
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í?

V praxi bohatě stačí implementovat interface/trait ve všech typech, se kterými se daná operace má provádět. Bál bych se, že pozdní vazba může vést k "pozdnímu myšlení", namísto aby člověk promýšlel koncepčně, kam to celé směřuje.

BoneFlute

  • *****
  • 1 823
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #353 kdy: 03. 01. 2019, 21:57:21 »
...
Blbec jsem čekal odpověď od SB, hrozně se divil, když ta odpověď nějak přestávala dávat smysl...

Kit

Re:Co si myslíte o OOP?
« Odpověď #354 kdy: 03. 01. 2019, 22:20:33 »
...
Blbec jsem čekal odpověď od SB, hrozně se divil, když ta odpověď nějak přestávala dávat smysl...

Potřebuješ, abych ti to vysvětlil nějako podrobněji? Neboj se zeptat.

BoneFlute

  • *****
  • 1 823
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #355 kdy: 04. 01. 2019, 03:00:14 »
...
Blbec jsem čekal odpověď od SB, hrozně se divil, když ta odpověď nějak přestávala dávat smysl...

Potřebuješ, abych ti to vysvětlil nějako podrobněji? Neboj se zeptat.
Jsi hodný, ale já nepotřebuju vědět všechno.
Tak možná jestli mi na to něco napíše SB, tak to si ještě přečtu.

BoneFlute

  • *****
  • 1 823
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #356 kdy: 04. 01. 2019, 05:16:22 »
Obávám se, že takto statické typování nefunguje. Všechny příklady tebou naznačného spektra možností mohu řešit. A statické typování mi bude hodně pomáhat. (A nemusím to dělat ručně.)

Zkusme být konkrétní. Bylo tu uvedeno parsování JSONu. Řešil bych to určitě staticky. Rozhodování zpracování podle typu dat? Staticky. Rozhodnování podle dat - to si nejsem jist, co myslíš. Jak se mohu rozhodovat podle dat? Čeho se mohu chytnout? Můžeš uvést příklad?
Netvrdím, že to nejde. Kdyby to nešlo, tak by většina praktických problémů byla neřešitelná staticky typovanými jazyky. Jenže to, co vnímáš jako cosi, co ti bude hodně pomáhat, já často vnímám jako klacky motající se pod nohama.
Takže něco takového jako když já po milióntý prvý pouštím celou aplikaci, a píšu druhou miliardu testů, aby to pokrylo alespoň 5procent všech možnejch chyb? :-)
Toto asi už bude o pocitech, takže to nerozebírejme. Zajímají mě tedy asi spíše nějaké racionálnější argumenty.


Rozhodování podle dat, tím myslím IF size > 5 cm THEN ...
Rozhodování podle typu, tím myslím IF (x hasMagnitude) THEN ...
Rozhodování bez ohledu na typ, tím myslím IF x > 5 THEN ..., bez ohledu na to, co to "x" je, protože mě zajímá jen odpověď na otázku, zda "to" je větší než 5.
Rozumím. Tak první bude nějaká funkce. Druhé bude pattern matching na typ. A třetí se řeší třídou/interfacem. Viz odpověď dále.

Konkrétní příklad bych vzal mnohem prostší - chceš realizovat jakýsi print(x), který zajistí vypsání argumentu na terminál. Jaký datový typ x-u by ta funkce měla podle tebe optimálně očekávat a proč? V čem mi jakožto vývojáři pomůže, že ta funkce očekává ten konkrétní datový typ? Uvažuješ-li o stringu, tak pokračuj v úvaze dál - jak se teda pak vypořádat s ne-stringy. Nebo třeba seznam v Pascalu...
typ show (v případně Javy by to bylo něco jako Printable)
Takový typ zajistí, že každá hodnota je schopná se převést na string. Včetně toho seznamu. Včetně uživatelského typu.

V Haskellu je to otázka přidání deriving show k definici typu, a všechno si odvodí sám.


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".

Každopádně ve statickém jazyce zajistím, že ta pípa se odjistí jen v případě, kdy je do čeho načepovat. Džbánek ano, papírová krabice ne.

V případě dynamických typů ten problém máš samozřejmě taky. Ale buď ho neřešíš, a doufáš, že všechno dobře dopadne. Nebo testuješ jak blbej, a pak doufáš, že všechno dobře dopadne.


Co je na tašce na rohlíky tak provokativního? Do datového typu rohlík dám jen rohlík a seznam rohlíků není nic jiného než taška na rohlíky. V době překladu vím, že mám datový typ, do kterého můžu naskládat jedině rohlíky. Jistě, mohu vytvořit i datový typ, do něhož jdou sázet rohlíky a housky. Ale i tuto situaci musím předvídat v době překladu.
Ano, musím to předvídat v době překladu. To je jediné, v čem máš pravdu. Jinak fakt neuvažuju, tak jak popisuješ.
Kontainer na rohlíky bych dělal v případě, kdy chci jen rohlíky. Takže to bude třeba recept na jednohubky. Protože ten dělám zásadně z rohlíků.
Ale když budu brát do krámu nějakou tašku, tak bych byl idiot se omezovat takhle, ne. Budu definovat jiná omezení. Ta, která budou užitečná.


Neznám moc jazyků, které by obsahovaly "rohlík" jako jeden ze základních typů.
Taky nás nic takového nezajímá. Doba typování ala jazyk C je naštěstí už dávno pryč.

Budu-li chtít modelovat nákupní tašku, tak jako nejjednodušší případ mě napadá nějaká kolekce, třeba seznam. Ale pořád mi tu BoneFlute nevysvětlil, seznam čeho by to optimálně měl být a jakou by to mělo výhodu oproti obecné dynamicky typované kolekci.
Toho, čeho potřebuješ. To přirovnání je debilní, ale tak můžeš mít nákupní tašku na pečivo. Takže obecný typ pro pečivo. Nebo typ TuháHmota, aby si tam nečepoval to pivo. Atd.

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.


Protože staticky typovaný jazyk mi říká "hele, tu informaci, co konkrétně se chystáš nakupovat, bezpodmínečně potřebuju znát dopředu", zatímco dynamicky typovaný jazyk nikoli.
Není nutné, uvádět úplně konkréntí informaci, tam kde ji nepotřebuješ vědět. S tím si typy poraděj.

Trošku bych to přeformuloval:
Statickej jazyk: "hele, čím víc mi řekneš podrobností předem, tím líp ti pomůžu".
Dynamickej jazyk: "hele, mě to nezajímá, cpi si tam co chceš, stejně si to budeš hlídat ty, já ti nepomůžu, ani mě nenapadne".


Statické typování mě nutí, abych dopředu znal nějaké omezení, nebo abych si ho uměle vytvořil, ačkoli z řešeného problému vůbec neplyne.
Nenutí, nemusíš vytvářet, pokud skutečně neplyne. Ale častokrát plyne. Statické typování dělá úplně jinou věc.


Nejčastějším problémem, se kterým se vývojář ve své pracovní době potýká, není obvykle přímo problém, který má za úkol vyřešit, ale jak se vypořádat s problémy, které si nadělal sám sobě dříve nebo které mu vymysleli jeho předchůdci. Takže jakmile se zákazník zeptá, proč nejde koupit Boeing, co mu na to odpovíš? A jak se budeš tvářit, až po X mandays práce, spočívající v překopávání půlky programu kvůli Boeingu, ti zákazník nezaplatí ani halíř, protože v té původní smlouvě o dílo není nikde napsáno, že by ten program neměl umět nakupovat Boeingy?
To zdaleka není specifické pro Statické typování. Ve skutečnosti je to tak, že:
- Ve statickém typování řešíš, jak problém popsat, a překladač ti fluše do tváře tvoje chyby.
- V dynamickém typování ti aplikace furt padá (ideálně na produkci), protože jsi nevychytal všechny chyby (nic ti nepomáhá).
V obou případech klient čeká.

BoneFlute

  • *****
  • 1 823
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #357 kdy: 04. 01. 2019, 05:22:02 »
... a nemusime type checkeru vysvetlovat nektere situace.
Tak, že nepoužití typů je jednodužší pro autora jazyka, to je tak nějak jasné. Ale tady mi tvrdí, že to má výhody pro někoho, kdo ten jazyk bude používat.

BoneFlute

  • *****
  • 1 823
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #358 kdy: 04. 01. 2019, 05:26:30 »
Většina běžného kódu tedy může být staticky otypovaná a jen v případě nouze můžu nechat kontrolu typů až na běh.
O jakém případě nouze mluvíš? Můžeš to rozvést? Nějaký příklad?

BoneFlute

  • *****
  • 1 823
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #359 kdy: 04. 01. 2019, 05:35:45 »
Aby to bylo typově korektní, tak ten $form musí být typu (Form String, Int, String, String, ...) :-P (Ale to samozřejmě nebylo pointou mého příspěvku.)

V původní ukázce jsi nic takového neuvedl, proto jsem to udělal tak jak jsem to udělal. Pokud Form bude třída, tak to bude v PHP vypadat asi takto:
Kód: [Vybrat]
function assetContactForm(Form $form, string $name, int $age, string $email, string $content) {
    $form->name = $name;
    $form->age = $age;
    $form->email = $email;
    $form->content = $content;
    return $form;
}
Vše řádně otypováno, včetně $form->name atd. Spokojen?
Tak pod pojmem řádně otypováno si představuju něco dost jiného. Dej si ještě práci, když už odvádíš téma.