Problémy s JavaScript v praxi

Bacsa

Re:Problémy s JavaScript v praxi
« Odpověď #345 kdy: 05. 10. 2018, 11:33:42 »
Môže mi niekto napísať nekonzistentnosti v návrhu JS od verzie ES5? Lebo kritici sa tu ako slamky chytajú len problémov ktoré sú staré snáď 20 rokov a boli zanechané len kvôli spätnej kompatibilite, aby aj 15 ročná stránka so "super DHTML efektami" fungovala aj dnes, čo však neznamená, že máte JS aj dnes používať takým spôsobom. Preto keď už, ukážte zlý návrh vo verzii ES5 a vyššie, v modernom JS. Vopred vďaka za vaše postrehy.
async/await, viď odkaz výše


Re:Problémy s JavaScript v praxi
« Odpověď #346 kdy: 05. 10. 2018, 11:42:17 »
Môže mi niekto napísať nekonzistentnosti v návrhu JS od verzie ES5? Lebo kritici sa tu ako slamky chytajú len problémov ktoré sú staré snáď 20 rokov a boli zanechané len kvôli spätnej kompatibilite, aby aj 15 ročná stránka so "super DHTML efektami" fungovala aj dnes, čo však neznamená, že máte JS aj dnes používať takým spôsobom. Preto keď už, ukážte zlý návrh vo verzii ES5 a vyššie, v modernom JS. Vopred vďaka za vaše postrehy.
async/await, viď odkaz výše

Async / await je len syntaktický cukor nad Promises plus generátor funkcia. Bol to veľmi obľúbený pattern, tak ho zaviedli priamo do jazyka. Niektorí ho ani len nepoužívajú. Veď napokon, nikto v žiadnom jazyku nevyužíva všetky možnosti poskytované jazykom. Ten článok je len tendenčný a zbytočný. Povedz mi radšej čo tebe konkrétne vadí na async / await a prečo to považuješ za chybu, zlý návrh.

andy

Re:Problémy s JavaScript v praxi
« Odpověď #347 kdy: 05. 10. 2018, 11:43:35 »
Takže když do staticky typovaného jazyka narveš nevalidní data, tak nespadne?
No, v principu by neměl, protože by to při chroustání těch vstupních dat mělo vyhlásit, že ta data jsou chybná. Což samozřejmě může klidně být uděláno i v dynamickém jazyku, akorát tam se to moc nevynucuje.

Např. ve staticky typovaném jazyku se JSON na vstupu dekóduje do nějaké Class. To je operace, která může selhat (třeba z důvodu chybějících políček, špatných typů apod.) a mělo by se to ošetřit. "Nedekódovat to" je v podstatě práce navíc. V dynamicky typovaném (JS) se udělá JSON.decode a je to. "Zkontrolovat to" je práce navíc.

Takže když má funkce jako parametr string, ve kterém očekává číslo (např. z terminálu) a někdo tam zadá slovo, tak to stejně musíš uvnitř té funkce ošetřit, aby při konverzi na číslo ten proces nespadl.

Podobně je na tom i parametr int, ve kterém má být třeba číslo měsíce 1-12. Jen málo jazyků má pro tohle typ, např. Pascal a předpokládám, že i Haskell. Tím se ovšem přesouvá validace vstupu ven z funkce. Otázkou je: Opravdu chceme validovat vstupní data ještě před každým voláním funkce nebo si je raději zvalidujeme na jednom místě uvnitř?
Ano, chceme. A třeba pokud jde o měsíce, tak "enum" má snad prakticky každý typovaný jazyk včetně Javy.

Funkce, které pracují s měsíců pak vyžadují nějaký typ Month, a při zpracování vstupu musíš provést konverzni String->Month a případně ošetřit, pokud to selže. Funkce pracující s měsícem má pak naprost jasně definovaný vstupní typ  a na jedné straně velmi snadno ověříš při psaní té funkce, že dělá to co má, protože to je  nezávislé na tom, kdo ji kde jak volá, z druhé strany je to skvělá dokumentace a při případném refaktoringu pak kompiler dost pomůže.

Bacsa

Re:Problémy s JavaScript v praxi
« Odpověď #348 kdy: 05. 10. 2018, 11:52:27 »
Takže když do staticky typovaného jazyka narveš nevalidní data, tak nespadne?
No, v principu by neměl, protože by to při chroustání těch vstupních dat mělo vyhlásit, že ta data jsou chybná. Což samozřejmě může klidně být uděláno i v dynamickém jazyku, akorát tam se to moc nevynucuje.

Např. ve staticky typovaném jazyku se JSON na vstupu dekóduje do nějaké Class. To je operace, která může selhat (třeba z důvodu chybějících políček, špatných typů apod.) a mělo by se to ošetřit. "Nedekódovat to" je v podstatě práce navíc. V dynamicky typovaném (JS) se udělá JSON.decode a je to. "Zkontrolovat to" je práce navíc.

Takže když má funkce jako parametr string, ve kterém očekává číslo (např. z terminálu) a někdo tam zadá slovo, tak to stejně musíš uvnitř té funkce ošetřit, aby při konverzi na číslo ten proces nespadl.

Podobně je na tom i parametr int, ve kterém má být třeba číslo měsíce 1-12. Jen málo jazyků má pro tohle typ, např. Pascal a předpokládám, že i Haskell. Tím se ovšem přesouvá validace vstupu ven z funkce. Otázkou je: Opravdu chceme validovat vstupní data ještě před každým voláním funkce nebo si je raději zvalidujeme na jednom místě uvnitř?
Ano, chceme. A třeba pokud jde o měsíce, tak "enum" má snad prakticky každý typovaný jazyk včetně Javy.

Funkce, které pracují s měsíců pak vyžadují nějaký typ Month, a při zpracování vstupu musíš provést konverzni String->Month a případně ošetřit, pokud to selže. Funkce pracující s měsícem má pak naprost jasně definovaný vstupní typ  a na jedné straně velmi snadno ověříš při psaní té funkce, že dělá to co má, protože to je  nezávislé na tom, kdo ji kde jak volá, z druhé strany je to skvělá dokumentace a při případném refaktoringu pak kompiler dost pomůže.
Zrovna u datumu je poučné napsat si typ pro validní hodnoty, tj. nikdy nemám 30. února a 29. února jen někdy apod. To otevírá oči.

andy

Re:Problémy s JavaScript v praxi
« Odpověď #349 kdy: 05. 10. 2018, 11:53:16 »
Môže mi niekto napísať nekonzistentnosti v návrhu JS od verzie ES5? Lebo kritici sa tu ako slamky chytajú len problémov ktoré sú staré snáď 20 rokov a boli zanechané len kvôli spätnej kompatibilite, aby aj 15 ročná stránka so "super DHTML efektami" fungovala aj dnes, čo však neznamená, že máte JS aj dnes používať takým spôsobom. Preto keď už, ukážte zlý návrh vo verzii ES5 a vyššie, v modernom JS. Vopred vďaka za vaše postrehy.
async/await, viď odkaz výše

Async / await je len syntaktický cukor nad Promises plus generátor funkcia. Bol to veľmi obľúbený pattern, tak ho zaviedli priamo do jazyka. Niektorí ho ani len nepoužívajú. Veď napokon, nikto v žiadnom jazyku nevyužíva všetky možnosti poskytované jazykom. Ten článok je len tendenčný a zbytočný. Povedz mi radšej čo tebe konkrétne vadí na async / await a prečo to považuješ za chybu, zlý návrh.
Wal-de-mar pattern:

1) Jaký je praktický problém s JS?
2) Počkám na odpověď
3) Odpověď je tendenční a zbytečná, nepřečetl sis manuál, je to plně specifikované, od čeho máme code review.


Re:Problémy s JavaScript v praxi
« Odpověď #350 kdy: 05. 10. 2018, 12:12:20 »
Môže mi niekto napísať nekonzistentnosti v návrhu JS od verzie ES5? Lebo kritici sa tu ako slamky chytajú len problémov ktoré sú staré snáď 20 rokov a boli zanechané len kvôli spätnej kompatibilite, aby aj 15 ročná stránka so "super DHTML efektami" fungovala aj dnes, čo však neznamená, že máte JS aj dnes používať takým spôsobom. Preto keď už, ukážte zlý návrh vo verzii ES5 a vyššie, v modernom JS. Vopred vďaka za vaše postrehy.
async/await, viď odkaz výše

Async / await je len syntaktický cukor nad Promises plus generátor funkcia. Bol to veľmi obľúbený pattern, tak ho zaviedli priamo do jazyka. Niektorí ho ani len nepoužívajú. Veď napokon, nikto v žiadnom jazyku nevyužíva všetky možnosti poskytované jazykom. Ten článok je len tendenčný a zbytočný. Povedz mi radšej čo tebe konkrétne vadí na async / await a prečo to považuješ za chybu, zlý návrh.
Wal-de-mar pattern:

1) Jaký je praktický problém s JS?
2) Počkám na odpověď
3) Odpověď je tendenční a zbytečná, nepřečetl sis manuál, je to plně specifikované, od čeho máme code review.

Ok, tak to upresním. Článok ktorý si nalinkoval nadáva na JavaScript, lebo JS nepracuje s asynchrónnymi funkciami rovnako ako Go jazyk... Ten autor je snáď idiot. No jasne, že starší jazyk nemá vlastnosti ktoré má novšie navrhnutý jazyk. Navyše kompletne iného typu, staticky typovaný, kompilovaný, oproti dynamicky typovanému, interpretovanému. Preto sa ťa pýtam na tvoj názor prečo je async / await zle navrhnutý a ako by si to implementoval ty, so zachovaním spätnej kompatibility. Alebo ste fakt všetci len vytreté nuly bez nadhľadu a dokážete sa len opičiť po iných vytretých nulách a kopírovať jeden od druhého nezmyselné argumenty? Alebo ste fakt programátori? Ak programátori, ukážte mi iný, lepšie navrhnutý jazyk do asynchrónneho prostredia, rovnako starý, stále spätne kompatibilný s prvou verziou, interpretovaný, nie kompilovaný. Inak tu len stále budete miešať hrušky s jablkami bez čo len náznaku kritického myslenia, ako nemysliace ovce čo si preposielajú konšpiračné teórie ktoré reflektujú ich presvedčenie, nie znalosti.

Re:Problémy s JavaScript v praxi
« Odpověď #351 kdy: 05. 10. 2018, 12:57:18 »
Ok, tak to upresním. Článok ktorý si nalinkoval nadáva na JavaScript, lebo JS nepracuje s asynchrónnymi funkciami rovnako ako Go jazyk... Ten autor je snáď idiot. No jasne, že starší jazyk nemá vlastnosti ktoré má novšie navrhnutý jazyk. Navyše kompletne iného typu, staticky typovaný, kompilovaný, oproti dynamicky typovanému, interpretovanému. Preto sa ťa pýtam na tvoj názor prečo je async / await zle navrhnutý a ako by si to implementoval ty, so zachovaním spätnej kompatibility. Alebo ste fakt všetci len vytreté nuly bez nadhľadu a dokážete sa len opičiť po iných vytretých nulách a kopírovať jeden od druhého nezmyselné argumenty? Alebo ste fakt programátori? Ak programátori, ukážte mi iný, lepšie navrhnutý jazyk do asynchrónneho prostredia, rovnako starý, stále spätne kompatibilný s prvou verziou, interpretovaný, nie kompilovaný. Inak tu len stále budete miešať hrušky s jablkami bez čo len náznaku kritického myslenia, ako nemysliace ovce čo si preposielajú konšpiračné teórie ktoré reflektujú ich presvedčenie, nie znalosti.

Rad bych ukazal, ale autor vlakna to zakazal...

Citace
1. Že je iný ako nejaký iný jazyk neznamená, že to je problém s JS. To len znamená, že je proste iný. Zrovnania sem nepatria.

andy

Re:Problémy s JavaScript v praxi
« Odpověď #352 kdy: 05. 10. 2018, 13:10:36 »
Preto sa ťa pýtam na tvoj názor prečo je async / await zle navrhnutý a ako by si to implementoval ty, so zachovaním spätnej kompatibility.
Aha, tak k bodu 3) jsem zapomněl dodat výmluvu "ale javascript byl navrhnut děsně dávno".... Prostě praktický problém není problémem, protože jazyk je straašně starý, je tam snaha být zpětně kompatibilní atd.....

Basa

Re:Problémy s JavaScript v praxi
« Odpověď #353 kdy: 05. 10. 2018, 13:32:05 »
Zásadním problémem JS taky je, že Ryan Dahl (autor node.js) ho kritizuje a místo node.js doporučuje Go.

Pep

Re:Problémy s JavaScript v praxi
« Odpověď #354 kdy: 05. 10. 2018, 13:49:06 »
Môže mi niekto napísať nekonzistentnosti v návrhu JS od verzie ES5? Lebo kritici sa tu ako slamky chytajú len problémov ktoré sú staré snáď 20 rokov a boli zanechané len kvôli spätnej kompatibilite, aby aj 15 ročná stránka so "super DHTML efektami" fungovala aj dnes, čo však neznamená, že máte JS aj dnes používať takým spôsobom. Preto keď už, ukážte zlý návrh vo verzii ES5 a vyššie, v modernom JS. Vopred vďaka za vaše postrehy.
async/await, viď odkaz výše

Async / await je len syntaktický cukor nad Promises plus generátor funkcia. Bol to veľmi obľúbený pattern, tak ho zaviedli priamo do jazyka. Niektorí ho ani len nepoužívajú. Veď napokon, nikto v žiadnom jazyku nevyužíva všetky možnosti poskytované jazykom. Ten článok je len tendenčný a zbytočný. Povedz mi radšej čo tebe konkrétne vadí na async / await a prečo to považuješ za chybu, zlý návrh.
Wal-de-mar pattern:

1) Jaký je praktický problém s JS?
2) Počkám na odpověď
3) Odpověď je tendenční a zbytečná, nepřečetl sis manuál, je to plně specifikované, od čeho máme code review.
Ok, tak to upresním. Článok ktorý si nalinkoval nadáva na JavaScript, lebo JS nepracuje s asynchrónnymi funkciami rovnako ako Go jazyk... Ten autor je snáď idiot. No jasne, že starší jazyk nemá vlastnosti ktoré má novšie navrhnutý jazyk. Navyše kompletne iného typu, staticky typovaný, kompilovaný, oproti dynamicky typovanému, interpretovanému. Preto sa ťa pýtam na tvoj názor prečo je async / await zle navrhnutý a ako by si to implementoval ty, so zachovaním spätnej kompatibility. Alebo ste fakt všetci len vytreté nuly bez nadhľadu a dokážete sa len opičiť po iných vytretých nulách a kopírovať jeden od druhého nezmyselné argumenty? Alebo ste fakt programátori? Ak programátori, ukážte mi iný, lepšie navrhnutý jazyk do asynchrónneho prostredia, rovnako starý, stále spätne kompatibilný s prvou verziou, interpretovaný, nie kompilovaný. Inak tu len stále budete miešať hrušky s jablkami bez čo len náznaku kritického myslenia, ako nemysliace ovce čo si preposielajú konšpiračné teórie ktoré reflektujú ich presvedčenie, nie znalosti.
Ty jsi fakt primitiv, co se nejen že vůbec neorientuje v IT, ale neznáš ani ten tvůj Javascript. Async/await nijak nesouvisí se zpětnou kompatibilitou, korutiny (potažmo kooperativní konkurence obecně) šly navrhnout mnohem lépe bez ohledu na jiné JS šaškárny. Čti si ten odkazovaný článek tak dlouho, dokud ho nepochopíš, autor totiž má - na rozdíl od tebe - rozsáhlé znalosti o jazycích, překladačích, interpretech a souběžnosti.

Re:Problémy s JavaScript v praxi
« Odpověď #355 kdy: 05. 10. 2018, 13:50:15 »
Zásadním problémem JS taky je, že Ryan Dahl (autor node.js) ho kritizuje a místo node.js doporučuje Go.

On kritizuje spíš návrh node.js :) A je příznivcem staticky typovaného systému, takže třeba prosazuje víc TypeScript oproti JS.

Pep

Re:Problémy s JavaScript v praxi
« Odpověď #356 kdy: 05. 10. 2018, 13:54:30 »
Zásadním problémem JS taky je, že Ryan Dahl (autor node.js) ho kritizuje a místo node.js doporučuje Go.
On kritizuje spíš návrh node.js :) A je příznivcem staticky typovaného systému, takže třeba prosazuje víc TypeScript oproti JS.
Ne, on zcela jednoznačně doporučuje Go jako nejlepší volbu pro aplikace s NIO. S typovým systémem to nijak nesouvisí.

Re:Problémy s JavaScript v praxi
« Odpověď #357 kdy: 05. 10. 2018, 13:58:07 »
Všimol si v praxi nasledovné: bývalý profi Java programátor z Telekomu začal v januári s JS projektom - na frontende SPA s Vue, komunikujúcu cez REST so serverless backendom bežiacim v JS v Lambdách nad AWS. Po dvoch dňoch oboznamovania sa s novými princípmi a jazykom plne kódil v JS, po dvoch mesiacoch sme spolu dokončili celú serverless web aplikáciu. Ani slovkom si nesťažoval na JS ani na serverless, ani na microservices princípy, na nič. Naopak, celá serverless architektúra sa mu páčila tak, že ju bol v Telekome odprezentovať bývalím kolegom, lebo umožňovala písať web aplikácie výrazne rýchlejšie a prehľadnejšie. A JS sa mu vyslovene zapáčil, obzvlášť kvôli Promisom. Dnes robí na inej web aplikácii, v Jave, ale frontend robí naďalej ako SPA a backend v Jave, ale už len ako REST API.

Iný profesionálny Java developer, šéf developer vývoja bankových aplikácií. Drvivou väčšinou robia aplikácie pre banky nie ako desktopové apky, ale vo forme web aplikácií s Vaadin frameworkom. Nikdy HTML/CSS/JS či Ajax neriešili, proste si frontend navrhli vizuálne, z komponentov poskytovaných Vaadinom. Ale aj nový Vaadin prešiel na web komponenty na frontende, konkrétne na Polymérové. To bolo pičovania na tú zmenu, to ste ešte nezažili. Deň na to ako sme sa o web komponentoch porozprávali, ako pochopil ako sú tie komponenty napojené na Java backend, že sú navyše reaktívne a samé sa aktualizujú, po tom ako si to cez deň vyskúšal, večer už hurá, nech žije reaktívny pattern, uznanlivo pokyvkával hlavou ako mu to zjednoduší a urýchli vývoj.

Takže nie len ten článok čo som sem v predošlom príspevku vložil, ako bol profi Java developer od Sun nadšený z JS, ale ani profesionáli z môjho okolia, voči JS a novým princípom vývoja web aplikácií ktoré prišli vďaka Node platforme, nemajú nič proti. Všetci v tom vidia posun vpred.

Potom prídem na nejaké bezvýznamné fórum, kde anonymne každý druhý 20 ročný murár s fušovaním do programovania ako s voľnočasovou aktivitou sa cíti povolaný kritizovať nejaký jazyk. A to nie preto, žeby ho v dobe jeho vzniku vedel za daných podmienok navrhnúť lepšie. Nevedel. Ani jeden jediný z tých kritikov. Tak prečo potom kritizujú? Možné sú len tieto dôvody:

Prvý: ješitnosť. Keď murár konečne dogooglil, že najviac hype je okolo Go, tak sa s vypätím posledných síl po šichte naučil na ubytovni pri sviečke aspoň základný syntax Go a ako prvé sa nerozhodol niečo naprogramovať, nemá na čom, notebook by mu zo skrine ukradol jeden z desiatich ukrajinských spolubývajúcich, no tak aspoň hejtuje z mobilu na fórach každý jazyk, ktorý nemá rovnaký syntax ako Go.

Druhý možný dôvod nie je o nič lepší: nedostatok znalostí / praxe. Kuchár, ktorý sa časom naučil programovať, typicky v PHP, ale tam aj končí jeho rozhľad. Nevie, že existuje mnoho jazykov postavených na rôznych paradigmách a nikdy sa nedelia na dobré a zlé, ale podľa účelu za ktorým vznikli a podľa vhodnosti či nevhodnosti na ten či onen typ úlohy. Bez tohoto potrebného nadhľadu a hlbšej znalosti teórie programovania tak delia jazyky jediným spôsobom: na dobré a zlé. Presnejšie na ten jediný čo vedia a "tie ostatné".

Ďalším dôvodom je nedostatok kritického myslenia: programátor, ktorý sa naučil programovať hlavne z tutoriálov na nete a tak čokoľvek, čo nájde na nete napísané, považuje za slovo božie. Vlastné názory, premýšľanie nad tématikou, to je mimo neho, to je nad jeho mentálne kapacity a ak sa k niečomu vyjadrí, najskôr si vygoogli cudzie argumenty a potom si sem len nakopíruje, či nalinkuje.

Ďalšie možné dôvody sa mi nechce písať, stačí ak si uvedomíte jedno: ak aj máš akademický background, nestrápňuj sa kritikou JS, lebo v danej dobe, za daných podmienok, za danej úrovne techniky a teórie, by si JS navrhol lepšie. A uvedom si, že to vedia aj vývojári JS a neopravili dané problémy len preto, aby ostal spätne kompatibilný.

Ale aby som aj ja len nekritizoval, tu je návod ako na JS pre  menej bystrých: nainštaluj si VS Code, nainštaluj si Flow, maj zapnutý Linter a nastav aby Ti Flow zbehol kód pri ukladaní a každý kód začni dvoma riadkami:

Kód: [Vybrat]
// @flow
'use strict'

Potom nebudete mať problém s vašimi "neprekonateľnými problémami" s JS. Žiadne == nebude povolené, iba ===, žiadne nesprávne typy odovzdané funkciám, na všetko budete upozornení. Následne sa zamestnajte v reálnom tíme a aj tam aj sami prídete na to, že sú vám statické typy za behu hovno platné, a že ochranou pred chybami je TDD, nie typový systém.

Happy coding, ovce ;)

Pep

Re:Problémy s JavaScript v praxi
« Odpověď #358 kdy: 05. 10. 2018, 14:02:42 »
odprezentovať bývalím kolegom
Máš tu zase "překlep", bývalím -> mývalím. Pokud to ovšem mělo být "bývalým", tak to není překlep, ale pravopis retarda  :) Neber si to osobně  ;)

Pep

Re:Problémy s JavaScript v praxi
« Odpověď #359 kdy: 05. 10. 2018, 14:06:45 »
Keď murár konečne dogooglil
Už se ti povedlo zjistit, co to je HMTS? Minules to ani neuměl opsat ("HTMS"), možná proto ti Google neporadil. Ale nic si z toho nedělej, i mistr tesař se někdy utne, absolvent zvláštní školy jako ty na to právo třikrát denně  ;)