Co si myslíte o OOP?

v

Re:Co si myslíte o OOP?
« Odpověď #405 kdy: 04. 01. 2019, 15:41:22 »
jako obvykle si každý představuje pod pojmem "typ" něco trochu (nebo i hodně) jiného
tenhle to hezky shrnul: http://tomasp.net/blog/2015/against-types/

To ovsem neni nic tak neobvykleho, ze pojem "typ" ma v programovani jiny vyznam nez v matematice. Treba pojem "funkce" ma v programovani take jiny vyznam.

Funkcionalni programovani se prave obecne snazi obe discipliny priblizit a tedy tam se snazi oba pojmy pouzivat primarne v matematickem vyznamu (coz je uzsi a formalnejsi). Ale obecne v programovani to ten vyznam, bohuzel historicky, nema.
neobvyklé to třeba není, ale tady půlka lidí debatuje o pascalu a druhá o teorii typů a to mi přijde takové nahovno


JS

Re:Co si myslíte o OOP?
« Odpověď #406 kdy: 04. 01. 2019, 15:43:41 »
Dynamicke typovani vyhodu ma, je jednodussi, flexíbilnejsi a srozumitelnejsi. Staticke typovani je vlastne docela hloupe a neprirozene, je umele. Principialni rozdil mezi statickym a dynamickym typovanim je v tom, kdo nese informaci o typu, zda promenna nebo hodnota.

To neni tak docela pravda. Napriklad Haskell nema promenne, jen hodnoty; pritom je staticky typovany. Na druhou stranu, treba Java ma promenne, ale nektere hodnoty (objekty) si drzi informaci o svem typu.

Rozdil je skutecne v tom, zda se typy kontroluji pri prekladu nebo az pri behu programu. A to druhe obvykle znamena nejakou ztratu vykonu a vyssi spotrebu pameti.

Re:Co si myslíte o OOP?
« Odpověď #407 kdy: 04. 01. 2019, 15:48:04 »
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 za prvé by měla mít metoda dokumentační komentář a za druhé se dají přidat typy do signatury. https://docs.python.org/3/library/typing.html

Proč by ho měla mít? Když se dobře jmenuje, tak přesně víš, co dělá. Může ho mít, ale nevím, proč bych do něj měl dávat typ?

A proč bych je tam přidával, když tu všichni píšou, že nejsou potřeba?

Jen mě to zajímá, fakt do toho nechci rýt. Dynamické typování zřejmě žádné výhody nemá a celé tohle vlákno to akorát potvrzuje. Takže bych rád věděl, jak to funguje a jak právě dynamičtí programátoři přemýšlí a jak fungují. Třeba bych tomu přišel na chuť taky. Pokud ale nevím, co posílat za typy, tak bohužel v tom dělat neumím.

a) Dokumentaci by měla mít, aby se zní  dala generovat dokumentace, to se snad dělá i v jiných jazycích ne? Jinak v Pythonu se tam slušně strká i "typ". To už před tím než se zavedli type-hints.

b) Vytváříš falešnou představu že když někdo dělá v třeba v Pythonu je to milovník dynamického typování :), to ani ne, ale  kolem toho co mě baví je Python komunita, takže asi tak.

c) Ideální jazyk pro mne by byl něco jako OCaml, ale bohužel už jsou zavedený knihovny Pandas, Numpy, Scipy -- tohle se těžko nahrazuje.

Samozřejmě na Pythonu je blbý, že jako začátěčník ti dovolí všechno, blbě se refaktoruje atd.

operator

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

To je prece popsane v dokumentaci k te funkci. Samotna znalost typu te k pochopeni funkce a jak ji pouzivat nepriblizuje nijak vic. I kdybys vedel, ze int je cislo, porad bez dokumentace nevis jake cislo a co znamena.  Ano, dynamicke jazyky se pouzivaji na vic veci, nez hrani se skriptiky.

Teoreticky. Prakticky treba kdyz mas getXs(), tak podle typu vis, zda mohou byt xka duplicitni (list vs. set).
V prvni rade to vim z dokumentace, v druhe rade k tomu opravdu nepotrebuji staticke typy.

BoneFlute

  • *****
  • 1 987
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #409 kdy: 04. 01. 2019, 15:52:25 »
neobvyklé to třeba není, ale tady půlka lidí debatuje o pascalu a druhá o teorii typů a to mi přijde takové nahovno
Pravdu máš soudruhu. A přitom ta moje otázka vypadala celkem jednoduše.


Re:Co si myslíte o OOP?
« Odpověď #410 kdy: 04. 01. 2019, 15:52:51 »
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?

To je prece popsane v dokumentaci k te funkci. Samotna znalost typu te k pochopeni funkce a jak ji pouzivat nepriblizuje nijak vic. I kdybys vedel, ze int je cislo, porad bez dokumentace nevis jake cislo a co znamena.  Ano, dynamicke jazyky se pouzivaji na vic veci, nez hrani se skriptiky.

Teoreticky. Prakticky treba kdyz mas getXs(), tak podle typu vis, zda mohou byt xka duplicitni (list vs. set).
V prvni rade to vim z dokumentace, v druhe rade k tomu opravdu nepotrebuji staticke typy.

Nepotrebujes, pomahaji. A to i pokud se bavime o ridke situaci, kdy dokumentace je 100%.

SB

Re:Co si myslíte o OOP?
« Odpověď #411 kdy: 04. 01. 2019, 15:54:04 »
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 = ......

Na uvedeném kódu nejen že nevidím nic objektového, ale dokonce ani výhradně funkcionálního, to je v podstatě imperativní programování.

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

Nebo ty funkce jsou vně? Jak potom dosáhnete konzistenci (u složitějších modelů, ne tohoto triviálního případu), když si každý kdekoliv může vyrobit funkci, která přepíše v "stavu" cokoliv zvenku?

P. S.: Opravdu se jednotlivé položky struktury odkazují tak neobratně a nepřehledně pozicí?!

operator

Re:Co si myslíte o OOP?
« Odpověď #412 kdy: 04. 01. 2019, 15:56:49 »
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 za prvé by měla mít metoda dokumentační komentář a za druhé se dají přidat typy do signatury. https://docs.python.org/3/library/typing.html

Proč by ho měla mít? Když se dobře jmenuje, tak přesně víš, co dělá. Může ho mít, ale nevím, proč bych do něj měl dávat typ?

A proč bych je tam přidával, když tu všichni píšou, že nejsou potřeba?

Jen mě to zajímá, fakt do toho nechci rýt. Dynamické typování zřejmě žádné výhody nemá a celé tohle vlákno to akorát potvrzuje. Takže bych rád věděl, jak to funguje a jak právě dynamičtí programátoři přemýšlí a jak fungují. Třeba bych tomu přišel na chuť taky. Pokud ale nevím, co posílat za typy, tak bohužel v tom dělat neumím.

a) Dokumentaci by měla mít, aby se zní  dala generovat dokumentace, to se snad dělá i v jiných jazycích ne? Jinak v Pythonu se tam slušně strká i "typ". To už před tím než se zavedli type-hints.

b) Vytváříš falešnou představu že když někdo dělá v třeba v Pythonu je to milovník dynamického typování :), to ani ne, ale  kolem toho co mě baví je Python komunita, takže asi tak.

c) Ideální jazyk pro mne by byl něco jako OCaml, ale bohužel už jsou zavedený knihovny Pandas, Numpy, Scipy -- tohle se těžko nahrazuje.

Samozřejmě na Pythonu je blbý, že jako začátěčník ti dovolí všechno, blbě se refaktoruje atd.
Jo, dokumentaci by mel mit kazdy jazyk, byt ne u kazdeho je soucasti jazyka. Kazdopadne by se dokumentace nemela nahrazovat statickymi typy.
Zadnou takovou predstavu nevytvarim, python pouziva kde kdo, dobri i spatni programatori, dokonce i laici. Ale neni to o pythonu, dominantne rozsirenych dynamickych jazyku je tady vic a jejich vyznam narusta.

BoneFlute

  • *****
  • 1 987
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #413 kdy: 04. 01. 2019, 16:06:24 »
Nebo ty funkce jsou vně? Jak potom dosáhnete konzistenci (u složitějších modelů, ne tohoto triviálního případu), když si každý kdekoliv může vyrobit funkci, která přepíše v "stavu" cokoliv zvenku?
Ve FP nemůžeš přepsat stav. A v Haskellu nemůže kdokoliv vyrobit funkci - hlídaj to typy a moduly. Ale to už je jinej příběh.


P. S.: Opravdu se jednotlivé položky struktury odkazují tak neobratně a nepřehledně pozicí?!
Tak, na struktury jsou spíše zkratky, já to z demostrativních důvodů rozepsal. Ale jinak ano, a je to velice šikovné a dobře se na to zvyká.

operator

Re:Co si myslíte o OOP?
« Odpověď #414 kdy: 04. 01. 2019, 16:21:01 »
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?
To je prece popsane v dokumentaci k te funkci. Samotna znalost typu te k pochopeni funkce a jak ji pouzivat nepriblizuje nijak vic. I kdybys vedel, ze int je cislo, porad bez dokumentace nevis jake cislo a co znamena.  Ano, dynamicke jazyky se pouzivaji na vic veci, nez hrani se skriptiky.
Teoreticky. Prakticky treba kdyz mas getXs(), tak podle typu vis, zda mohou byt xka duplicitni (list vs. set).
V prvni rade to vim z dokumentace, v druhe rade k tomu opravdu nepotrebuji staticke typy.
Nepotrebujes, pomahaji. A to i pokud se bavime o ridke situaci, kdy dokumentace je 100%.
To je cira z nouze ctnost.

operator

Re:Co si myslíte o OOP?
« Odpověď #415 kdy: 04. 01. 2019, 16:37:06 »
Dynamicke typovani vyhodu ma, je jednodussi, flexíbilnejsi a srozumitelnejsi. Staticke typovani je vlastne docela hloupe a neprirozene, je umele. Principialni rozdil mezi statickym a dynamickym typovanim je v tom, kdo nese informaci o typu, zda promenna nebo hodnota.

To neni tak docela pravda. Napriklad Haskell nema promenne, jen hodnoty; pritom je staticky typovany. Na druhou stranu, treba Java ma promenne, ale nektere hodnoty (objekty) si drzi informaci o svem typu.

Rozdil je skutecne v tom, zda se typy kontroluji pri prekladu nebo az pri behu programu. A to druhe obvykle znamena nejakou ztratu vykonu a vyssi spotrebu pameti.

takze kdyz v haskellu napisu
Kód: [Vybrat]
dabl x = x + x
Co je to to 'x' a je datoveho typu double nebo int?

Je otazka, zda objekt je opravdu hodnota, ale dobre, opravuji formulaci na 'kde i informace o jednoduchem datovem typu je soucasti hodnoty.

Takze kdyz v pythonu, php a pod vyuziji type hinting, a datove typy zkontroluji pri prekladu, udelal jsem z nej staticky typovany jazyk? Myslim ze ne a to prave proto, ze informace o typu je soucasti hodnoty, nikoliv promenne. To je podle me zakladni rozdil, nikoliv cas kontroly.

Re:Co si myslíte o OOP?
« Odpověď #416 kdy: 04. 01. 2019, 16:47:50 »
Dynamicke typovani vyhodu ma, je jednodussi, flexíbilnejsi a srozumitelnejsi. Staticke typovani je vlastne docela hloupe a neprirozene, je umele. Principialni rozdil mezi statickym a dynamickym typovanim je v tom, kdo nese informaci o typu, zda promenna nebo hodnota.

To neni tak docela pravda. Napriklad Haskell nema promenne, jen hodnoty; pritom je staticky typovany. Na druhou stranu, treba Java ma promenne, ale nektere hodnoty (objekty) si drzi informaci o svem typu.

Rozdil je skutecne v tom, zda se typy kontroluji pri prekladu nebo az pri behu programu. A to druhe obvykle znamena nejakou ztratu vykonu a vyssi spotrebu pameti.

takze kdyz v haskellu napisu
Kód: [Vybrat]
dabl x = x + x
Co je to to 'x' a je datoveho typu double nebo int?

Je otazka, zda objekt je opravdu hodnota, ale dobre, opravuji formulaci na 'kde i informace o jednoduchem datovem typu je soucasti hodnoty.

Takze kdyz v pythonu, php a pod vyuziji type hinting, a datove typy zkontroluji pri prekladu, udelal jsem z nej staticky typovany jazyk? Myslim ze ne a to prave proto, ze informace o typu je soucasti hodnoty, nikoliv promenne. To je podle me zakladni rozdil, nikoliv cas kontroly.

dabl :: Num a => a -> a

(jinymi slovy x je cislo)

(a jeste update: dabl je polymorfni, ale nezamenovat to uplne s polymorfismem pozdni vazby v beznem OOP)
« Poslední změna: 04. 01. 2019, 16:50:24 od Ondra Satai Nekola »

operator

Re:Co si myslíte o OOP?
« Odpověď #417 kdy: 04. 01. 2019, 17:03:27 »
Dynamicke typovani vyhodu ma, je jednodussi, flexíbilnejsi a srozumitelnejsi. Staticke typovani je vlastne docela hloupe a neprirozene, je umele. Principialni rozdil mezi statickym a dynamickym typovanim je v tom, kdo nese informaci o typu, zda promenna nebo hodnota.

To neni tak docela pravda. Napriklad Haskell nema promenne, jen hodnoty; pritom je staticky typovany. Na druhou stranu, treba Java ma promenne, ale nektere hodnoty (objekty) si drzi informaci o svem typu.

Rozdil je skutecne v tom, zda se typy kontroluji pri prekladu nebo az pri behu programu. A to druhe obvykle znamena nejakou ztratu vykonu a vyssi spotrebu pameti.

takze kdyz v haskellu napisu
Kód: [Vybrat]
dabl x = x + x
Co je to to 'x' a je datoveho typu double nebo int?

Je otazka, zda objekt je opravdu hodnota, ale dobre, opravuji formulaci na 'kde i informace o jednoduchem datovem typu je soucasti hodnoty.

Takze kdyz v pythonu, php a pod vyuziji type hinting, a datove typy zkontroluji pri prekladu, udelal jsem z nej staticky typovany jazyk? Myslim ze ne a to prave proto, ze informace o typu je soucasti hodnoty, nikoliv promenne. To je podle me zakladni rozdil, nikoliv cas kontroly.

dabl :: Num a => a -> a

(jinymi slovy x je cislo)

(a jeste update: dabl je polymorfni, ale nezamenovat to uplne s polymorfismem pozdni vazby v beznem OOP)
Muj priklad vypadal jinak. Je to priklad ze statickeho jazyka a krasne to ukazuje, ze vase tzv. vyhody statickych jazyku jsou iluzorni. Vy statickym typum prisuzujete vlastnosti, ktere neplynou ze statickeho typovani. Staticke typovani ma jedinou vyhodu a smysl, umoznuje vyrazne lepsi vykonovou optimalizaci. To vsechno ostatni jsou vedlejsi efekty, ktere nejsou platne pro vsechny staticke jazyky a nejsou podmineny existenci statickeho typovani.

Re:Co si myslíte o OOP?
« Odpověď #418 kdy: 04. 01. 2019, 17:06:43 »
Dynamicke typovani vyhodu ma, je jednodussi, flexíbilnejsi a srozumitelnejsi. Staticke typovani je vlastne docela hloupe a neprirozene, je umele. Principialni rozdil mezi statickym a dynamickym typovanim je v tom, kdo nese informaci o typu, zda promenna nebo hodnota.

To neni tak docela pravda. Napriklad Haskell nema promenne, jen hodnoty; pritom je staticky typovany. Na druhou stranu, treba Java ma promenne, ale nektere hodnoty (objekty) si drzi informaci o svem typu.

Rozdil je skutecne v tom, zda se typy kontroluji pri prekladu nebo az pri behu programu. A to druhe obvykle znamena nejakou ztratu vykonu a vyssi spotrebu pameti.

takze kdyz v haskellu napisu
Kód: [Vybrat]
dabl x = x + x
Co je to to 'x' a je datoveho typu double nebo int?

Je otazka, zda objekt je opravdu hodnota, ale dobre, opravuji formulaci na 'kde i informace o jednoduchem datovem typu je soucasti hodnoty.

Takze kdyz v pythonu, php a pod vyuziji type hinting, a datove typy zkontroluji pri prekladu, udelal jsem z nej staticky typovany jazyk? Myslim ze ne a to prave proto, ze informace o typu je soucasti hodnoty, nikoliv promenne. To je podle me zakladni rozdil, nikoliv cas kontroly.

dabl :: Num a => a -> a

(jinymi slovy x je cislo)

(a jeste update: dabl je polymorfni, ale nezamenovat to uplne s polymorfismem pozdni vazby v beznem OOP)
Muj priklad vypadal jinak. Je to priklad ze statickeho jazyka a krasne to ukazuje, ze vase tzv. vyhody statickych jazyku jsou iluzorni. Vy statickym typum prisuzujete vlastnosti, ktere neplynou ze statickeho typovani. Staticke typovani ma jedinou vyhodu a smysl, umoznuje vyrazne lepsi vykonovou optimalizaci. To vsechno ostatni jsou vedlejsi efekty, ktere nejsou platne pro vsechny staticke jazyky a nejsou podmineny existenci statickeho typovani.

Tvuj priklad byl
Kód: [Vybrat]
dabl x = x + xne?

A ja ti odpovidam, jak je to typovane. Nato ses ptal, ne?

Nechapu, co je na tom "iluzorni" a ktera vlastnost ti tam chybi.

BoneFlute

  • *****
  • 1 987
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #419 kdy: 04. 01. 2019, 17:11:03 »
Je otazka, zda objekt je opravdu hodnota, ale dobre, opravuji formulaci na 'kde i informace o jednoduchem datovem typu je soucasti hodnoty.
Rozdělení na hodnotové nehodnotové typy je IMHO taková bolest mutabilních jazyků. V haskellu je všechno hodnota: číslo, text, pole, funkce, ... Většina věcí tam je first-class. Takže když prohlásíme, že sturktura je objekt, tak ano, i v takovém případě by to byla hodnota.


Takze kdyz v pythonu, php a pod vyuziji type hinting, a datove typy zkontroluji pri prekladu, udelal jsem z nej staticky typovany jazyk?
Skoro. Určitě to pomůže odchytit velkou fůru potenciálních chyb. Ale type-hinting bude furt slabej proti plnohodnotnému statickému systému.
Například takovouto chybu ti to neodhalí (omlouvám se za případné hrubky, v pythony type-hinting ještě neumím používat).

Kód: [Vybrat]
class ContactForm:
    def __init__(self):
        self.name = none
        self.age = none

def assetContactForm(ContactForm form, string name, int age):
    form.name = name
    form.birth = age
    return form



Takze kdyz v pythonu, php a pod vyuziji type hinting, a datove typy zkontroluji pri prekladu, udelal jsem z nej staticky typovany jazyk? Myslim ze ne a to prave proto, ze informace o typu je soucasti hodnoty, nikoliv promenne. To je podle me zakladni rozdil, nikoliv cas kontroly.
V Haskellu (a myslím, že to tak platí u většiny modernějších jazyků) je typ součást hodnoty:

Kód: [Vybrat]
sum :: Int -> Int -> Int
sum a b = a + b

inc a = a + 1

dump (sum (inc 4) (inc 5.5))