Problémy s JavaScript v praxi

BoneFlute

  • *****
  • 2 046
    • Zobrazit profil
Re:Problémy s JavaScript v praxi
« Odpověď #480 kdy: 09. 10. 2018, 22:23:20 »
Není to prasárna, jen se na to podívej abstraktněji:
To není o abstraktnosti.

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 proč je muž == true a žena == false? A pokud je html true a pdf false, co je json?

Takový problém se správně řeší pravidlem:

Kód: [Vybrat]
podminka = žena
promenna = is_default(podminka) ? datovy_typ1 : datovy_typ2

Předpoklad, že to jazyk nějak skvěle rozhodne za mě, není projev flexibilnosti.


BoneFlute

  • *****
  • 2 046
    • Zobrazit profil
Re:Problémy s JavaScript v praxi
« Odpověď #481 kdy: 09. 10. 2018, 22:25:03 »
Ano, ve statických jazycích je to struct. Jeho nevýhoda je, že je statický, takže pro každý dotaz ho musíš mít nadefinovaný předem, mohou jich být stovky a neumožňuje ti zpracívat uživatelské dotazy vytvářené za běhu programu.

To není pravda. Pokud tvá argumentace stojí na tomto předpokladu, tak máme vyřešeno.

andy

Re:Problémy s JavaScript v praxi
« Odpověď #482 kdy: 09. 10. 2018, 22:26:23 »
Ano, ve statických jazycích je to struct. Jeho nevýhoda je, že je statický, takže pro každý dotaz ho musíš mít nadefinovaný předem, mohou jich být stovky a neumožňuje ti zpracívat uživatelské dotazy vytvářené za běhu programu. Třeba u monitorovacího systému výkonových transformátorů, který měří několik set parametrů a uživatel chce zobrazit historii šesti z nich, které si zaklikl, třeba teplotu oleje z čidel pod víkem, nebo některé údaje z analyzátoru plynů. Ne že by to nešlo ve statickém jazyku řešit, ale je to holt komplikovanější a je s tím nutno řešit problémy, které v dynamickém jazyku nejsou.
Mohl bys dát nějaký konkrétní příklad kódu? Já si skutečně myslím, že skutečná _práce_ právě s takovými strukturami je mnohem jednodušší s pořádném typovém systému než bez něj. Neskutečným způsobem s tím pomáhají "lens", což je IMO bez statického typového systému dost problém uhlídat (jestli to obecně vůbec jde).

Bacsa

Re:Problémy s JavaScript v praxi
« Odpověď #483 kdy: 09. 10. 2018, 22:27:13 »

Typování obecně zabrání některým validním programům běžet. Typický příklad:
Kód: [Vybrat]
if (true) then 1 else "no"Tohle prostě staticky typovaným jazykem neprojde, přestože to je validní program. Samozřejmě díky tomu je dynamický jazyk "flexibilnější"; a je to strašná prasárna. Takže asi není čím se chlubit...

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

andy

Re:Problémy s JavaScript v praxi
« Odpověď #484 kdy: 09. 10. 2018, 22:30:37 »
V C++ je a je to super.
..to mi asi uniklo..? Jak to konkrétně vypadá? (součtový typ)


Bacsa

Re:Problémy s JavaScript v praxi
« Odpověď #485 kdy: 09. 10. 2018, 22:36:47 »
V C++ je a je to super.
..to mi asi uniklo..? Jak to konkrétně vypadá? (součtový typ)
Například
Kód: [Vybrat]
variant<int,string,MyFancyType>

eee

Re:Problémy s JavaScript v praxi
« Odpověď #486 kdy: 09. 10. 2018, 22:44:35 »
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.

andy

Re:Problémy s JavaScript v praxi
« Odpověď #487 kdy: 09. 10. 2018, 22:52:43 »
Mam holt smulu, ze ja pouzivam akorat to C a Javu. Na druhou stranu, tohle jsou asi nejrozsirenejsi staticke jazyky.
Jo, v C a Javě tohle bohužel implementované není. Jak mi bylo právě ukázáno, v C++ to implementované je, ale bez znalosti odjinud by mě to nenapadlo použít...

Citace
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.
Tohle nepotřebuje žádnou introspekci. Říká se tomu "součtový datový typ", je to takový "lepší enum", nebo z C++ ten variant, nebo "tagging". On totiž dynamický jazyk je de-fakto jazyk právě s jedním součtový typem ve stylu:
Kód: [Vybrat]
data DynamicType = DynInt Int | DynString Text | DynBool Boolean | DynNone
A to fakt - když si napíšeš interpet dynamického jazyka, tak přesně takovýhle typ vyrobíš.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #488 kdy: 09. 10. 2018, 22:59:23 »
Není to prasárna, jen se na to podívej abstraktněji:
To není o abstraktnosti.

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 proč je muž == true a žena == false? A pokud je html true a pdf false, co je json?

Takový problém se správně řeší pravidlem:

Kód: [Vybrat]
podminka = žena
promenna = is_default(podminka) ? datovy_typ1 : datovy_typ2

Předpoklad, že to jazyk nějak skvěle rozhodne za mě, není projev flexibilnosti.
Je, ale mimo tvé chápání :-).

Proč je muž v příkladu true? To je přece jedno, ale když to nedokážeš vnímat na abstraktní rovině, tak třeba proto, že to zatrhl na formuláři.

Ad is_default(), opět marginální, podstatné je, že se ti vrací jeden nebo druhý datový typ, o to teď v diskusi běží.

Myslím že tu ukázku vůbec nechápeš, program za tebe nic nerozhoduje, program rozhoduje podle podmínky zadané programátorem.

Napsal jsi toho hodně, ale vůbec nic k věci, tedy k vrácení dvou různých datových typů z podmínky. Škoda.

Bacsa

Re:Problémy s JavaScript v praxi
« Odpověď #489 kdy: 09. 10. 2018, 23:00:13 »
Mam holt smulu, ze ja pouzivam akorat to C a Javu. Na druhou stranu, tohle jsou asi nejrozsirenejsi staticke jazyky.
Jo, v C a Javě tohle bohužel implementované není. Jak mi bylo právě ukázáno, v C++ to implementované je, ale bez znalosti odjinud by mě to nenapadlo použít...

Citace
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.
Tohle nepotřebuje žádnou introspekci. Říká se tomu "součtový datový typ", je to takový "lepší enum", nebo z C++ ten variant, nebo "tagging". On totiž dynamický jazyk je de-fakto jazyk právě s jedním součtový typem ve stylu:
Kód: [Vybrat]
data DynamicType = DynInt Int | DynString Text | DynBool Boolean | DynNone
A to fakt - když si napíšeš interpet dynamického jazyka, tak přesně takovýhle typ vyrobíš.
To je jako kdybych v C++ všude rval any.

eee

Re:Problémy s JavaScript v praxi
« Odpověď #490 kdy: 09. 10. 2018, 23:02:56 »
Ano, ve statických jazycích je to struct. Jeho nevýhoda je, že je statický, takže pro každý dotaz ho musíš mít nadefinovaný předem, mohou jich být stovky a neumožňuje ti zpracívat uživatelské dotazy vytvářené za běhu programu.
To není pravda. Pokud tvá argumentace stojí na tomto předpokladu, tak máme vyřešeno.
Je to pravda a pokud máš dojem že ne, tak jsi asi nepochopil, o čem je řeč.
Řeč je o tom , že struct v C není dynamická struktura.

Re:Problémy s JavaScript v praxi
« Odpověď #491 kdy: 09. 10. 2018, 23:05:37 »
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ý... :)

eee

Re:Problémy s JavaScript v praxi
« Odpověď #492 kdy: 09. 10. 2018, 23:20:32 »
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 jedno z možných řešení a nedokážeš nijak obhájit své tvrzení, že je to řešení špatné. 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.

Re:Problémy s JavaScript v praxi
« Odpověď #493 kdy: 09. 10. 2018, 23:25:45 »
Proč aspoň ne výjimku místo false? Nebylo by to čistší?

eee

Re:Problémy s JavaScript v praxi
« Odpověď #494 kdy: 09. 10. 2018, 23:30:39 »
Proč aspoň ne výjimku místo false? Nebylo by to čistší?
Bylo, ale třeba v Pythonu jsou výjimky drahé, takže u funkce kterou voláš v řádech statisíců a při selhání nechceš přerušit chod programu ji nepoužiješ.