Diskuze: Více o Javascript OOP
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 13 zpráv z 13.
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
Např. užití this ... Zkus Dart, a pak se podívej na OOP v JS (zkusil jsem, viděl jsem).
Pokud opravdu toužíš po OOP JS tak opravdu využij například ten Dart...
Ono OOP v JavaScriptu doplácí na (ne)výhody JavaScriptu. Pokud umíš pracovat s objektem, umíš jej vytvořit různými metodami a znáš takové základy, tak věř, že to je vše co lze napsat nějak rozumně. Třeba dědičnost, je tak složitá, že je mnohdy jednoduší aplikaci navrhnout tak, aby ji nepotřebovala. Do budoucna tu napíšu články o JavaScriptu (prvních 5 dílů, kde OOP zatím není je už publikovaných, čekaji na schválení), kde budu OOP tak nějak nakousávat a možná se to dostane do bodu, kdy budou čtenáři schopni pracovat s OOP v JS na rozumné úrovn, ale to tak s mojí rychlostí a časovou vytížeností možná příští rok.
Michale, často zdůrazňuji, že OOP neznamená slovo "class". Zatímco C# a Java si na OOP pouze hrají, Javascript a další dynamické jazyky v něm umožňují kouzlit.
Opravdový problém spočívá v tom, že všichni programují objekty, ale jen málokdo objektově. Když se opravdu naučíte OOP, přijde vám jeho princip v Javascriptu naprosto kouzelný. Prototypální dědičnost a povaha JS přímo svádějí k OOP a je to nesmírně mocná zbraň.
Pokud napíšeš, že se v JS dá "nějak rozumně" používat OOP, pak je to hluboké nepochopení některých principů. Vyzkoušejte si nějaký dynamický jazyk a programujte v něm. C# nebo Java vám pak budou přidat strnulé a nesmírně omezené.
v jistém slova smyslu jsou všechny jazyky omezené. OOP JavaScriptu doplácí na jeho specifikum, měl jsem třeba na myslí, že když máš funkce uložené v proměnné, tak je nemůžeš přetížit a nebo můžeš, ale ten kód nebude
1.) dobře čitelný, asi nepochopíš hned že se jedná o primitivní
přetížení
2.) není ani dobře udržovatelný, takové if počet parametrů, popřípadě
if typ parametrů mi přijde takové hodně omezené, těžkopádné a
nepřehledné.
A ano i C# a Java a všechny ostatní jsou nějak omezené. Umí třeba přetížené metody, ale neumí něco jiného a jsou tím handicapovány. JavaScriptový model je možná správný, ale mnohdy kostrbatý (alespoň podle mě), objekt pomocí klíčového slova function (function má více významů) nebo slovním se mi moc nezamlouvá, ale možná je to tak správně. OOP samozřejmě není jen o class, řekl bych, že je hlavně o způsobu přemýšlení a to se špatně učí. prototypová dědičnost je sice zajímavé, ale ve výsledku slovo extend/inherit udělá totéž (zkopíruje prototyp) akorát je to jednoduší na psaní, přehlednost, atd... Nicméně zase v JS lze s tím asi více kouzlit, na druhou stranu, kolik z nás to potřebuje? V JavaScriptu lze udělat spousta věcí, jen to není tak přehledné (o to víc věcí, však lze udělat) a tím, že to není ani příliš jednoduché, to prostě spousta lidí nezvládá, popřípadě výhodu těch vychytávek stejně pochopí až to v praxi budou potřebovat, tak se to i špatně učí. Trochu horší je to, když o těch vychytávkách ani netuší.
Závěrem: Ź každé nevýhody lze udělat výhodu a naopak. Čas od času na některou z výhod navazují nevýhody a naopak (na nevýhodu navazuje výhoda). Dokonalý programoví jazyk ani paradigma neexistuje. Někomu vyhovují class, někomu function a slovníky.
Přetěžování v dynamických jazycích obvykle není možné už z principu - jestliže signatura funkce neobsahuje typy ani parametry, na základě čeho bys ji chtěl přetížit? Navíc přetěžování funkcí znepřehledňuje kód, což je v rozporu s dalšími argumenty, co uvádíš. Schopnost korektně pojmenovávat proměnné a funkce je jeden z ukazatelů kvalitních programátorských dovedností. Přetížené funkce svědčí o opaku (většinou to jde udělat lépe).
Neřekl jsem, že jeden model je správný a druhý nesprávný, jsou pouze odlišné a prototypy jsou perfektní do JS, protože skvěle doplňují jeho náturu. Třída není prototyp a prototyp není třída. Ano, zapomněl jsem na Visual Basic, ale pleteš se, inherits nekopíruje prototypy, ty fungují úplně jinak než třídy. Zatímco třída je statická záležitost, prototypy jsou dynamické. Možná, že právě tohle nepochopení je důvod, proč se ti nezamlouvá? Je totiž úplně jedno, jakým slovem definuješ objekty, může to být class, function, array a nebude to důležité, dokud budeš schopný aplikovat základní principy.
Z toho, co sem průběžně píšeš, je vidět, že jsi šikovný kluk. Proč si to pořádně nenastuduješ? Tvůj přístup "už umím OOP, protože Visual Basic má slovo inherits, takže se mi nelíbí Javascript, když to dělá jinak, protože je složitý (nerozumím mu)" naprosto neodpovídá tvé další prezentaci.
Přetěžovat se musí v rozumné míře. Jestli jde o to tak i JavaScript má sám nějaké metody přetížené (nebo si na to hrají). Např. metoda drawImage na objektu CanvasRenderingContext2D (kontext canvasu).
Metody se v JS často "přetěžují" kontrolou undefined v parametrech.
přesně to mi přijde strašně nepřehledné.
drawImage konkrétně kontroluje, jestli je první argument správná instance, čili Image nebo Canvas. Podle mě type hinting je moc přeceňovaný. Pokud zadá špatný argument, tak ho prostě v podmínce odchytím a skončí to chybou.
OOP v JS má i svou silnou stránku. Zatím jsem nenarazil na nic, co by nešlo.
Zobrazeno 13 zpráv z 13.