Problémy s JavaScript v praxi

Bacsa

Re:Problémy s JavaScript v praxi
« Odpověď #495 kdy: 09. 10. 2018, 23:32:03 »
Já si bežně z funkcí které čtou data vracím hodnotu false, pokud funkce selže, None pokud data nejsou nebo datový objekt - tedy tři různé datové typy. Není to o nic horší, než návratový číselný kód z C funkce, která možná změní obsah proměnné předané funkci a pro získání chybového textu je nutné volat zvláštní funkci.
Takové věci jdou otypovat několika způsoby, ovšem obecně to je zvěrstvo a vidět takový kód svědčí o junioritě nebo debilitě (v případě seniora) toho, co to spáchal.
Je to přirozené řešení na přirozenou potřebu, kdy z funkce potřebuješ vracet různé stavy a výsledky. Jazyky které to neumí to obchází různými méně čitelnými způsoby.
Nebo místo obcházení použijí již zmíněný součtový typ.


eee

Re:Problémy s JavaScript v praxi
« Odpověď #496 kdy: 09. 10. 2018, 23:46:45 »
Já si bežně z funkcí které čtou data vracím hodnotu false, pokud funkce selže, None pokud data nejsou nebo datový objekt - tedy tři různé datové typy. Není to o nic horší, než návratový číselný kód z C funkce, která možná změní obsah proměnné předané funkci a pro získání chybového textu je nutné volat zvláštní funkci.
Takové věci jdou otypovat několika způsoby, ovšem obecně to je zvěrstvo a vidět takový kód svědčí o junioritě nebo debilitě (v případě seniora) toho, co to spáchal.
Je to přirozené řešení na přirozenou potřebu, kdy z funkce potřebuješ vracet různé stavy a výsledky. Jazyky které to neumí to obchází různými méně čitelnými způsoby.
Nebo místo obcházení použijí již zmíněný součtový typ.
To nepodporují všechny jazyky a zůstává zachována podstata řešení, které jsi arogantně napadl, funkce vrací hodnoty různých datových typů :-). Takže už pak jen záleží na jazyku, jakými prostředky ti to dovolí realizovat. Má vůbec nějaký dynamický jazyk součtový typ, nebo je to jen obezlička některých statických jazyků, které se snaží přiblížit flexibilitě dynamických, jenž v tomto směru mají bohatší možnosti?

Bacsa

Re:Problémy s JavaScript v praxi
« Odpověď #497 kdy: 09. 10. 2018, 23:50:44 »
Já si bežně z funkcí které čtou data vracím hodnotu false, pokud funkce selže, None pokud data nejsou nebo datový objekt - tedy tři různé datové typy. Není to o nic horší, než návratový číselný kód z C funkce, která možná změní obsah proměnné předané funkci a pro získání chybového textu je nutné volat zvláštní funkci.
Takové věci jdou otypovat několika způsoby, ovšem obecně to je zvěrstvo a vidět takový kód svědčí o junioritě nebo debilitě (v případě seniora) toho, co to spáchal.
Je to přirozené řešení na přirozenou potřebu, kdy z funkce potřebuješ vracet různé stavy a výsledky. Jazyky které to neumí to obchází různými méně čitelnými způsoby.
Nebo místo obcházení použijí již zmíněný součtový typ.
funkce vrací hodnoty různých datových typů
Nevrací, musíš použít příslušný konstruktor. To může překladač udělat za tebe, ale nevyhneš se při použití hodnoty matchingu. Ty fakt nevíš o typových systémech ani houno.

andy

Re:Problémy s JavaScript v praxi
« Odpověď #498 kdy: 10. 10. 2018, 00:09:27 »
Zatím si nejsem jist, že jsem zde viděl nějaký argument, proč je JS špatný... :)
Automatické přetypování při porovnáních je antipattern. Runtime dělaný jako continuation passing místo toho, aby to bylo normálně "jako-synchronní" (to je IMO největší problém). Našlo by se asi i pár dalších věcí - postupem času se ty nejhorší nějak daří vylepšovat (takže už to není tak strašný jako před 5 lety).

A. F.

Re:Problémy s JavaScript v praxi
« Odpověď #499 kdy: 10. 10. 2018, 00:11:43 »
a


andy

Re:Problémy s JavaScript v praxi
« Odpověď #500 kdy: 10. 10. 2018, 00:15:06 »
To nepodporují všechny jazyky
Jenomže otázka zněla dynamické vs. statické jazyky, nikoliv jsou dynamické lepší než "kterýkoliv statický".
Citace
a zůstává zachována podstata řešení, které jsi arogantně napadl, funkce vrací hodnoty různých datových typů :-).
Ne... funkce vrací konkrétní jeden typ...

Citace
Má vůbec nějaký dynamický jazyk součtový typ, nebo je to jen obezlička některých statických jazyků, které se snaží přiblížit flexibilitě dynamických, jenž v tomto směru mají bohatší možnosti?
Striktně vzato dynamický jazyk má 1 součtový typ, kdy to, co ty nazýváš "typ" jsou varianty v tom součtovém typu. Nepsal jsem to někde výše?

Bacsa

Re:Problémy s JavaScript v praxi
« Odpověď #501 kdy: 10. 10. 2018, 00:16:14 »
Píšu v JS ve VSCode, který hezky barví syntax a podobně, type interference nepoužívám, protože imho není proč, když jsem v dynamicky psaném jazyce. Píšu tak třeba i v Perlu.

Pravdou je, že si zase "typy" dost hlídám sám, reps. kde je to nutné... chce to pečlivost. :)
Ona otázka zní, proč to nepoužívat - když stejně ty funkce konstruuješ způsobem, že by to tím klidně prošlo..

Není to nutné a jsem tak schopen programovat i v čistém vimu, bez obezliček. :)

Na frontendu moc na výběr není - na backendu ano. Takže můžeme srovnat, jak by se stejná úloha řešila v Js (node), C#, Javě, Haskellu, Elixiru atd.. Rozdíl je třeba v tom, že prakticky neděláš "iterativní" vývoj. Když píšu v netypovaném jazyku, tak to je typicky - napíšu pár řádek. Zkusím. Napíšu dalších pár řádek. Zkusím. Potřebuju změnit něco, co jsem už zkusil... bez TDD pro větší projekt je to sebevražda.

To asi dost záleží... nevím, nemám ten problém, ale asi by to chtělo si sednout a "jeden druhého zkoušet". :)

I C++ už umí dneska "auto". U C++ je naprosto nesnesitelné psát ty příšerné typy např. v iterátoru - "auto" to řeší.

To jistě, ale psát ho všude ten kód imho prasí. :) Do for či na iterátory, apod. je to ale moc pěkné. :)

Potřebuješ něco refaktorovat.... už je to docela dávno, potřeboval jsem upravit program (C++), který prováděl síťovou komunikaci, aby fungoval jak na little-endian tak na big-endian strojích. Takže...jak to udělat? Jak najít všechna místa, kde je potřeba přidat tu případnou konverzi do nějakého "network-order"? Ukázalo se, že stačí změnit typ v těch serializovaných strukturách z "int_32" (apod) na nějaký "struct net_int32", spustit kompiler a rovnou z toho vypadl seznam řádek, kde je to potřeba opravit. Při TDD (bez typů) by ti z toho vypadl seznam spadlých testů, a ty bys pak hledal v kódu, kde to opravit a doufal, že ty testy jsou fakt důsledné.

Většina lidí má asi pocit, že typový systém je nějaký artefakt toho, že je potřeba to nakonec nějak zkompilovat a je potřeba to nějak překladači vysvětlit jak. A dynamické typy berou jako "posun vpřed" - proč mu to vysvětlovat, když si to překladač může zjistit sám. Ten pohled, který se dneska prosazuje, je, že statické typy jsou nástroj pro programátora, který využívá k tomu, aby napsal program s méně chybami, méně zbytečného kódu a vyššími možnostmi abstrakce.

Tady myslím, že se shodneme... Nemyslím si, že by byly dynamické typy posun vpřed... je to jiný přístup... a mám ho neméně rád.

Citace
Ale argumentovat Haskellem, že je JS špatně navržený jazyk mi přijde trochu přitažené za vlasy...
Taky jsem nic takového neřekl - JS je špatný z jiných důvodů, než že nemá statické typy. Proti JS jsem argumentoval některými věcmi z Pythonu (ten má taky spoustu much) případně Go (runtime). Ještě by se to dalo srovnávat s Elixirem (ale o tom vím akorát, že existuje), případně Clojure/lisp. Proti tvrzení, že statické typy jsou na nic argumentuji haskellem (a dal by se k tomu přidat asi Rust, ale ten je dost mladý).

Zatím si nejsem jist, že jsem zde viděl nějaký argument, proč je JS špatný... :)
Neviděl? V Google si napsali celé GWT, aby se v tom dalo nějak rozumně psát, pokud možno s odstíněním od vývojářů.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #502 kdy: 10. 10. 2018, 00:18:44 »
Já si bežně z funkcí které čtou data vracím hodnotu false, pokud funkce selže, None pokud data nejsou nebo datový objekt - tedy tři různé datové typy. Není to o nic horší, než návratový číselný kód z C funkce, která možná změní obsah proměnné předané funkci a pro získání chybového textu je nutné volat zvláštní funkci.
Takové věci jdou otypovat několika způsoby, ovšem obecně to je zvěrstvo a vidět takový kód svědčí o junioritě nebo debilitě (v případě seniora) toho, co to spáchal.
Je to přirozené řešení na přirozenou potřebu, kdy z funkce potřebuješ vracet různé stavy a výsledky. Jazyky které to neumí to obchází různými méně čitelnými způsoby.
Nebo místo obcházení použijí již zmíněný součtový typ.
funkce vrací hodnoty různých datových typů
Nevrací, musíš použít příslušný konstruktor. To může překladač udělat za tebe, ale nevyhneš se při použití hodnoty matchingu. Ty fakt nevíš o typových systémech ani houno.
Vskutku neznám jazyk, který by používal součtový typ, byť aktivně těch jazyků používám několik. Pro mě je to okrajová záležitost, nikoliv typická  vlastnost statických jazyků, jak se snažíš tvářit. Nejblíže tomu co znám je TypeVar v Pythonu. Ty zase plaveš v dynamických jazycích a aplikuješ na ně svůj toporný statický pohled.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #503 kdy: 10. 10. 2018, 00:25:22 »
To nepodporují všechny jazyky
Jenomže otázka zněla dynamické vs. statické jazyky, nikoliv jsou dynamické lepší než "kterýkoliv statický".
Citace
a zůstává zachována podstata řešení, které jsi arogantně napadl, funkce vrací hodnoty různých datových typů :-).
Ne... funkce vrací konkrétní jeden typ...

Citace
Má vůbec nějaký dynamický jazyk součtový typ, nebo je to jen obezlička některých statických jazyků, které se snaží přiblížit flexibilitě dynamických, jenž v tomto směru mají bohatší možnosti?
Striktně vzato dynamický jazyk má 1 součtový typ, kdy to, co ty nazýváš "typ" jsou varianty v tom součtovém typu. Nepsal jsem to někde výše?
Tady si imho odporuješ. Klidně přistoupím na tezi, že dynamický jazyk má jediný součtový typ, proč ne. Ale pořád v dynamickém jazyku platí, že funkce může vracet hodnoty různých datových typů (nebo variant v tvé terminologii). To ovšem rozporuješ o kus výše, kde uvádíš, že funkce vrací jeden součtový typ. Takže buď to není totožné s fungováním dynamických jazyků a nebo součtový typ vrací hodnoty různých datových typů (variant v tvé terminologii). Obojí současně platit nemůže, vyber si, co platí.

Bacsa

Re:Problémy s JavaScript v praxi
« Odpověď #504 kdy: 10. 10. 2018, 00:27:29 »
Já si bežně z funkcí které čtou data vracím hodnotu false, pokud funkce selže, None pokud data nejsou nebo datový objekt - tedy tři různé datové typy. Není to o nic horší, než návratový číselný kód z C funkce, která možná změní obsah proměnné předané funkci a pro získání chybového textu je nutné volat zvláštní funkci.
Takové věci jdou otypovat několika způsoby, ovšem obecně to je zvěrstvo a vidět takový kód svědčí o junioritě nebo debilitě (v případě seniora) toho, co to spáchal.
Je to přirozené řešení na přirozenou potřebu, kdy z funkce potřebuješ vracet různé stavy a výsledky. Jazyky které to neumí to obchází různými méně čitelnými způsoby.
Nebo místo obcházení použijí již zmíněný součtový typ.
funkce vrací hodnoty různých datových typů
Nevrací, musíš použít příslušný konstruktor. To může překladač udělat za tebe, ale nevyhneš se při použití hodnoty matchingu. Ty fakt nevíš o typových systémech ani houno.
Vskutku neznám jazyk, který by používal součtový typ, byť aktivně těch jazyků používám několik. Pro mě je to okrajová záležitost, nikoliv typická  vlastnost statických jazyků
Aspoň teď už víme, proč píšeš takové kraviny. Nauč se Haskell nebo něco podobně rozumně typovaného (i když existují ještě mnohem silnější typové systémy), otevře ti to oči (pokud to pochopíš).

Bacsa

Re:Problémy s JavaScript v praxi
« Odpověď #505 kdy: 10. 10. 2018, 00:29:30 »
To nepodporují všechny jazyky
Jenomže otázka zněla dynamické vs. statické jazyky, nikoliv jsou dynamické lepší než "kterýkoliv statický".
Citace
a zůstává zachována podstata řešení, které jsi arogantně napadl, funkce vrací hodnoty různých datových typů :-).
Ne... funkce vrací konkrétní jeden typ...

Citace
Má vůbec nějaký dynamický jazyk součtový typ, nebo je to jen obezlička některých statických jazyků, které se snaží přiblížit flexibilitě dynamických, jenž v tomto směru mají bohatší možnosti?
Striktně vzato dynamický jazyk má 1 součtový typ, kdy to, co ty nazýváš "typ" jsou varianty v tom součtovém typu. Nepsal jsem to někde výše?
Tady si imho odporuješ. Klidně přistoupím na tezi, že dynamický jazyk má jediný součtový typ, proč ne. Ale pořád v dynamickém jazyku platí, že funkce může vracet hodnoty různých datových typů (nebo variant v tvé terminologii). To ovšem rozporuješ o kus výše, kde uvádíš, že funkce vrací jeden součtový typ. Takže buď to není totožné s fungováním dynamických jazyků a nebo součtový typ vrací hodnoty různých datových typů (variant v tvé terminologii). Obojí současně platit nemůže, vyber si, co platí.
Nechceš si radši jít hrát na pískoviště?

andy

Re:Problémy s JavaScript v praxi
« Odpověď #506 kdy: 10. 10. 2018, 00:39:21 »
eee: když si definuju tohle:
Kód: [Vybrat]
data Value = VInt Int | VDouble Double | VStrint Text | VBool Boolean | VObject (Dict Text Value) | VNone
-- Čti: Typ Value může nabývat hodnot "VInt s parametrem celé číslo", "VDouble s parametrem double" etc.
-- To VInt, VDouble je de-fakto "tag"
Tak to je přesně ten typ, který se používá v JS, Pythonu etc. Všechny funkce potom budou typu ve stylu:
Kód: [Vybrat]
f: Value -> Value
-- Čti: vstupem do funkce je hodnota typu Value, výstupem je hodnota typu Value
No a třeba sčítání by se třeba definovalo jako:
Kód: [Vybrat]
(+) :: Value -> Value -> Value
(+) (VInt i) (VInt j) = VInt (i + j)
(+) (VDouble i) (VDouble j) = VDouble (i + j)
(+) (VInt i) (VDouble j) = VDouble (toDouble i + j)
(+) _ _ = error "crash"
Takže pak mám v programu jeden typ a hotovo, chová se to přesně stejně jako dynamické jazyky (teď ignoruju pure/non-pure, to je další level).

Ve staticky typovaném jazyku můžu udělat něco, co v tom dynamickém nemůžeš: Můžu tu funkci omezit. Můžu říct: tahle funkce může vrátit jenom Int. A nic jiného.

Citace
Tady si imho odporuješ. Klidně přistoupím na tezi, že dynamický jazyk má jediný součtový typ, proč ne. Ale pořád v dynamickém jazyku platí, že funkce může vracet hodnoty různých datových typů (nebo variant v tvé terminologii). To ovšem rozporuješ o kus výše, kde uvádíš, že funkce vrací jeden součtový typ. Takže buď to není totožné s fungováním dynamických jazyků a nebo součtový typ vrací hodnoty různých datových typů (variant v tvé terminologii). Obojí současně platit nemůže, vyber si, co platí.
Varianta typu není typ. Prvek "enumu" taky není zvláštní typ - je to hodnota typu toho enumu.

Představ si součtový typ jako "Enum", kdy ale jednotlivé volby jsou "structy" (v C je tomu dost blízký union, ale překladač nevynucuje to "nebo"). Ad absurdum by se to dalo Enumem simulovat takhle (v C++?):
Kód: [Vybrat]
enum JsValue = { JSNull, JSTrue, JSFalse, Int0, Int1, Int2, Int3, Int4,.... }
Jak vidíš, typ je fakt jeden (JsValue), ale klidně ta funkce (i  v C) může vrátit "null", "true", "false", 0, 1.... atd.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #507 kdy: 10. 10. 2018, 00:41:54 »
Já si bežně z funkcí které čtou data vracím hodnotu false, pokud funkce selže, None pokud data nejsou nebo datový objekt - tedy tři různé datové typy. Není to o nic horší, než návratový číselný kód z C funkce, která možná změní obsah proměnné předané funkci a pro získání chybového textu je nutné volat zvláštní funkci.
Takové věci jdou otypovat několika způsoby, ovšem obecně to je zvěrstvo a vidět takový kód svědčí o junioritě nebo debilitě (v případě seniora) toho, co to spáchal.
Je to přirozené řešení na přirozenou potřebu, kdy z funkce potřebuješ vracet různé stavy a výsledky. Jazyky které to neumí to obchází různými méně čitelnými způsoby.
Nebo místo obcházení použijí již zmíněný součtový typ.
funkce vrací hodnoty různých datových typů
Nevrací, musíš použít příslušný konstruktor. To může překladač udělat za tebe, ale nevyhneš se při použití hodnoty matchingu. Ty fakt nevíš o typových systémech ani houno.
Vskutku neznám jazyk, který by používal součtový typ, byť aktivně těch jazyků používám několik. Pro mě je to okrajová záležitost, nikoliv typická  vlastnost statických jazyků
Aspoň teď už víme, proč píšeš takové kraviny. Nauč se Haskell nebo něco podobně rozumně typovaného (i když existují ještě mnohem silnější typové systémy), otevře ti to oči (pokud to pochopíš).
Díky za radu, ale už jsem psal, že funkcionální jazyky nejsou nic pro mě. Navíc dávám přednost těm praktickým před akademickými. Co se týče součtového typu, snažím se něco dozvědt od vás, ale sami v tom máte hokej a poskytujete rozporuplné informace typu, že dynamické jazyky jsou specální případ jediného součtového typu, který pokrývá všechny možne datové typy a když z toho vyjdu a odvozuji od toho jeho fungování, tak je všechno špatně. Byť tvrdíte, že součtový typ je adekvátní odpověď na dynamické typy.

Rád bych tu viděl příklad, kde funkce vrací hodnoty různých datových typů (false, none, object), předává to nějaké proměnné a dále se program větví podle toho, jaká hodnota byla předána. Jestli to nejde, pak je z vaše zaklínání se součtovým typem pěkná blamáž.  :-).

Bacsa

Re:Problémy s JavaScript v praxi
« Odpověď #508 kdy: 10. 10. 2018, 00:42:13 »
Není to prasárna, jen se na to podívej abstraktněji:

promenna = (podminka) ? datovy_typ1 : datovy_typ2

Na tom přece nic špatného není. Třeba když datovy_typ2 je None. Nebo ty datové typy jsou muz a zena, nebo html a pdf, a pak bys také mohl mít třeba toto:

levy = (typeof(pravy) == int) ? int(levy) : str(levy)

Já si bežně z funkcí které čtou data vracím hodnotu false, pokud funkce selže, None pokud data nejsou nebo datový objekt - tedy tři různé datové typy. Není to o nic horší, než návratový číselný kód z C funkce, která možná změní obsah proměnné předané funkci a pro získání chybového textu je nutné volat zvláštní funkci.
Víš proč se NullPointerException říká "million dolar mistake"..? Asi nevíš.... Ano, je to strašné. Je to úplně příšerné. Třeba z toho důvodu, že když vůbec chceš vědět, co se z té funkce vrací, tak se do ní musíš podívat. Ty type inference enginy (které tak děsně vychvaloval tvůj oblíbenec) ti na tom budou řvát, že to máš blbě. A teď je samozřejmě otázka, jak to dělat "dobře", když se bavíme o statických jazycích. Dělá se to pomocí algebraických datových typů - konkrétně součtového typu, který bohužel právě v C/C++/Java není. A vypadá to následovně:
Kód: [Vybrat]
data Result a = Data a | NoData | GotError text
mojefunkce :: Nejaky_vstupni_typ -> Result Navratovy typ
mojefunkce vstupni_data
  | jsou_chybna vstupni_data = GotError "Chybna vstupni data"
  | nedostaneme_vysledek vstupni_data = NoData
  | otherwise = Data (spocitej_vysledek vstupni_data)
Mam holt smulu, ze ja pouzivam akorat to C a Javu. Na druhou stranu, tohle jsou asi nejrozsirenejsi staticke jazyky. Nicmene tady je videt, ze michani ruznych datovych typu je vec potreba a zadana, nikoliv prasarna a pronika to i do statickych jazyku. Ono timto jsi rekl A a k tomu patri i B. Ta navratova hodnota se predava promenne, ktera musi byt schopna prijmout ruzne datovy typy, cimz musi byt jazyk obdaren introspekci, abych byl schopen zjistit, jaky datovy typ hodnota v promenne ma, tydy sama hodnota si nejspis nese datovy typ sebou a to už je vlastne na pul implementovany dynamicky jazyk. To si bud sebou nese nektera omezeni, treba na velikost promenne a nebo to uz tak uplne staticky jazyk nebude. Mozna budoucnost bude patrit takovym hybridum. Do dynamických jazyků zase prorůstají type hinty, uvidíme jak se to bude vyvíjet dál.
Pro lidi, co nechápou typové systémy, vzniklo protokolí programování. Jazyk se chová jako dynamicky typovaný a dynamický dispatch se řeší v runtimu. Vracení hodnot více typů se pak řeší nepříliš duchaplně tuplem. Je to sice taky prasárna, ale aspoň pragmatická a se zachycením chyb při překladu. Kdo chce megaprasit, použije überrozhraní, které neumí zhola nic (v Go interface{}). Kupodivu se to lidem dost líbí, asi že tak můžou dekódovat například libovolný JSON apod.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #509 kdy: 10. 10. 2018, 00:44:32 »
To nepodporují všechny jazyky
Jenomže otázka zněla dynamické vs. statické jazyky, nikoliv jsou dynamické lepší než "kterýkoliv statický".
Citace
a zůstává zachována podstata řešení, které jsi arogantně napadl, funkce vrací hodnoty různých datových typů :-).
Ne... funkce vrací konkrétní jeden typ...

Citace
Má vůbec nějaký dynamický jazyk součtový typ, nebo je to jen obezlička některých statických jazyků, které se snaží přiblížit flexibilitě dynamických, jenž v tomto směru mají bohatší možnosti?
Striktně vzato dynamický jazyk má 1 součtový typ, kdy to, co ty nazýváš "typ" jsou varianty v tom součtovém typu. Nepsal jsem to někde výše?
Tady si imho odporuješ. Klidně přistoupím na tezi, že dynamický jazyk má jediný součtový typ, proč ne. Ale pořád v dynamickém jazyku platí, že funkce může vracet hodnoty různých datových typů (nebo variant v tvé terminologii). To ovšem rozporuješ o kus výše, kde uvádíš, že funkce vrací jeden součtový typ. Takže buď to není totožné s fungováním dynamických jazyků a nebo součtový typ vrací hodnoty různých datových typů (variant v tvé terminologii). Obojí současně platit nemůže, vyber si, co platí.
Nechceš si radši jít hrát na pískoviště?
Leda bych tě tam potkal :-). Něco k věci bys neměl?