Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - BoneFlute

Stran: 1 ... 62 63 [64] 65 66 ... 133
946
Vývoj / Re:Co si myslíte o OOP?
« 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))

947
Vývoj / Re:Co si myslíte o OOP?
« 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á.

948
Vývoj / Re:Co si myslíte o OOP?
« 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.

949
Vývoj / Re:Co si myslíte o OOP?
« kdy: 04. 01. 2019, 15:08:40 »
Je to marný, s Tebou se nedomluvím. Od zítřka kamarádím s Kitem.
Si pomůžeš? :-P

950
Vývoj / Re:Co si myslíte o OOP?
« kdy: 04. 01. 2019, 15:06:03 »
Ale ať nad tím dumám jak dumám, tak mi vychází, že dynamické typování je znouzecnost. Nemá žádné benefity. Pletu se?
Se zkvalitněním inference výhody trochu ubývají. Ale pár bys jich našel. Například když potřebuješ někde na zkoušku nějaký typ změnit, může ti probublat do spousty kódu, takže to musíš změnit i na spoustě mít, který vůbec spouštět nechceš. Je to podobný jako s IO v Haskellu - nemůžeš si někam jenom tak narychlo dát nějaký debug výpis...

Nebo jinak: Kotím javový kód. Mám 5 věcí rozdělaných (např. v TDD standard), ale dokud to nebudu mít alespoň formálně (tedy i typově, což samo o sobě nestačí) správně, tak to nepřeložím. Takže to nějak ojebu (doplním kraviny, pozakomentuju - krásný příklad na situaci, kdy kód funguje špatně, ale překladem prošel, takže jej někteří považují za správný!), abych mohl vyzkoušet TU JEDNU VĚC, co jsem potřeboval.
Ale jo, to už tu bylo. Dokonce jsem to uváděl jako jeden ze scénářů, kdy je dynamické typování lepší HNED V OTÁZCE.

951
Vývoj / Re:Co si myslíte o OOP?
« kdy: 04. 01. 2019, 15:03:58 »
... 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.

V tom co jsem psal jsem mel na mysli programatora. Napriklad nemusim type checkeru v Haskellu vysvetlovat, ze zadany retezcovy literal ma byt typu Text a nikoli typu String. (A o existenci OverloadedStrings vim, jde o obecny problem.)
To beru.

952
Vývoj / Re:Co si myslíte o OOP?
« kdy: 04. 01. 2019, 10:44:03 »
Nic z toho neznamena, ze kdyz to tim proleze, ze uz mas prakticky hotovo.
Šlo o pochopitelné zjednodušení.

U statickych typu mas kontrolu prace s pameti,
Ano. No a? Ptal jsem se na to, v čem je dynamické typování tak výrazně výhodnější jak statické. V tom, že statické umí i optimalizovat výkon?

Kompilator  dynamickeho jazyka ti take odhali spoustu chyb a linter spoustu dalsich. Nic z toho neznamena, ze kdyz to tim proleze, ze uz mas prakticky hotovo. A mimochodem, me linter na chyby upozornuje uz behem psani.
Proto jsem tak přeháněl. Protože vám kompilátor dynamického jazyka objeví syntax error, a linter nevhodnou konstrukci, a už jste z toho unešeni jak OHROMNĚ vám to pomáhá. Panejo!

953
Vývoj / Re:Co si myslíte o OOP?
« kdy: 04. 01. 2019, 10:36:59 »
Dokud ti staci jedno usporadani...
Je v tom rozdíl, zda je ten stav uvnitř objektu (OOP), či vně (FP) ? Imho ten problém je stejný. Ani jeden to nedělá výrazně líp. (Pro mě je FP hlavně Haskell.)

954
Vývoj / Re:Co si myslíte o OOP?
« kdy: 04. 01. 2019, 10:31:50 »
No LOL. Staticke typy vznikly za ucelem vykonostni optimalizace, pro jednoduchou a rychlou praci s pameti.. 
Taky si LOLnu. Samozřejmě, tak vznikli. Ale to je historie. Existuje taky věc, jako teorie typů.

Navzdory tomu spousta jejich priznivcu je presvedcena, ze jejich smysl je zajistit bezchybnost aplikace a z nich potom padaji obdobne nesmyslne hlasky, ze kdyz program proleze kompilatorem, tak je hotovo.
Ano, a taky to tak je. Sice to asi nejde dotáhnout tak, aby to bylo doslova jak píšu, ale odvedou ohromné množství práce. V porovnání s dynamickými, které nedělají žádnou práci, ...

Dovolim si tvrzeni, ze staticke typy adoruji lini programatori, kteri nechteji delat testy a ziji v naivnim presvedceni, ze kompilator testuje aplikaci za ne.
Měl jsem jednou přednášku na námět teorie typů. Vzhledem k tomu, jak na mě zmateně koukali mě už nepřekvapuje, že tu tolika lidem zcela ujel vlak.

Programy v dynamickych jazycich obecne nepadaji, to je domenou jazyku, ktere nemaji vyjimky. Nevzpominam si ze bych videl nekdy padnout python.
Tak když to říkáš. Na takovou blbost se nebudu optěžovat argumentovat.

955
Vývoj / Re:Co si myslíte o OOP?
« kdy: 04. 01. 2019, 10:21:21 »
...Když konečně přesvědčím kompilátor, aby to přeložil, tak mám obecně hotovo. Zbejvaj sémantické chyby. Zatímco u dynamického jazyka furt něco padá.

Jo, o tom tu bylo hovadsky dlouhé vlákno ve fóru se závěrem, že kompletnost významové kontroly programu a jednoduchost takové kontroly jdou (logicky) proti sobě, takže jsou-li vaše typy jednoduché, většina kontrol vás teprve čeká.
Šlo o pochopitelné zjednodušení. V statickém typování mám spousta kontrol (netvrdím, že všechno). V dynamickém žádné. Nehledě na to, že v mé otázce jsem to zohlednil. Ptal jsem se, co je výhoda dynamického typování. Když to technicky nejde, tak to technicky nejde, to dá rozum. Ale to není ta výhoda.

956
Vývoj / Re:Co si myslíte o OOP?
« kdy: 04. 01. 2019, 05:45:09 »
Já nevím, tohle se mi nezdá. Když mám data z externího zdroje, stále to můžu otypovat. [...] typem určím, že buď zadá číslo, a pak ho zpracuju, nebo zadá nečíslo, a pak mu hodím chybovku. Tohle jde udělat compile-time.
To rozlišení mezi číslem a (čímkoli jiným) není nic jinýho, než dynamický typování :)
Je to ošetřený a rozhodnutý v době překladu. To je to co mě zajímá.

957
Vývoj / Re:Co si myslíte o OOP?
« 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.

958
Vývoj / Re:Co si myslíte o OOP?
« 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?

959
Vývoj / Re:Co si myslíte o OOP?
« 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.

960
Vývoj / Re:Co si myslíte o OOP?
« 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á.

Stran: 1 ... 62 63 [64] 65 66 ... 133