Devel.cz Lupa Měšec Podnikatel Root Zdroják.cz DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

Vlákno názorů k článku
Třídy, dědičnost a OOP v Javascriptu - I

Bauglir
Bauglir (neregistrovaný) 82.100.48.---
16. 3. 2010 2:00

Špatný článek

Pamatuju ještě černý Root, ale na takhle špatný si nemohu vzpomenout

1/ JS samozřejmě třídy nemá, citovat wiki a ještě takovou hloupost je úsměvné, to je definice pro někoho, kdo nikdy o OOP neslyšel. Programátor musí vědět, co to znamená „třídní programování“: zapouzdření, dědičnost a polymorfismus, přičemž JS poslední 2 vlastnosti neobsahuje. To, že se dají obejít (rozšiřováním předpisů, přiřazování prototypů) ještě neznamená, že má třídy. JS má typy, má objekty a nikdy nemělo třidy. Když už píšete články pro programátory, citujte alespoň z trochu relevantních zdrojů, jako například specifikace ECMA (http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf), strana 3: ECMAScript does not use classes.
To, čím se JS tolik liší od ostatních jazyků je právě neexistence tříd, ale existence prototypů. Neexistují klasické třídy a neklasické třidy.
Pojem tříd a instancí nemá v článku žádný význam, pokud to někdo chce číst v souladu s realitou a správně, čtěte typy a objekty.
Věty jako „Falešné, protože ve skutečnosti nejde o vytváření instancí tříd, ale o konstrukci podobných objektů.“ jsou potom už jenom vtipem.

2/ JS nemá nic takového, jako primitivní typy, to, že mžete napsat
var num = 5;
je jenom deklarací objektu typu Number jeho literálem, pokud by se jednalo o primitivní typ, následující konstrukce by nebyla možná:
var a = {'num': 5}; alert(a.num.toString());
věřte, že funguje skvěle

3/ Následně se článek bohužel už věnuje „třídám“ a „instancím“ a z tohoto hlediska ho nemá smysl číst.

Bez ohledu na to, jak dobrý je pan Steigerwald programátor, tak jeho způsob prezentace a vysvětlování JS je strašný a dělá JS medvědí službu. Každý, kdo se kdy setkal s třídami v OOP se musí při seznamování s JS dozvědět hned na začátku jednu věc: JS třídy nemá, zapomeň na OOP tak, jak ho znáš z jiných jazyků. JS má prototypy a ty nemají s třídami nic společného.

David Grudl aura:74
16. 3. 2010 3:46

Re: Špatný článek

Špatný komentář, ale zdaleka ne nejhloupější zde :-)

ad 1) pokud je definicí třídního programování zapouzdřenost, dědičnost a polymorfismus, znamená to, že např. Python, který nemá zapouzdření členů tříd, není „třídním“ jazykem? To by bylo hodně odvážné tvrzení, co?

ad 2) budete velmi překvapen, ale typeof num nevypíše Number :-) (na velikosti záleží). Dokonce si můžete vyzkoušet, že čísla jakožto primitivní typy se do funkcí nepředávají referencí, narozdíl od objektů. Atd.

Peter Rybar aura:14
16. 3. 2010 11:50

Re: Špatný článek

Špatný komentář, ale zdaleka ne nejhloupější zde :-)

1) Medzi jazykmi Python a Javascript je dooost velky rozdiel co sa tyka tried. Python triedy ma a Javascript nie.

koroptev
koroptev (neregistrovaný) 141.202.248.---
16. 3. 2010 12:20

Re: Špatný článek

dle meho intuitivniho citeni, ktere ma asi tak stejnou vahu jako vase neduvera v odvahu vami nastineneho potencialniho tvrzeni, je jazyk bez zapouzdreni (ale s dedicnosti a plymorfismem at uz to znamena cokoli) vice tridni nez jazyk bez dedicnosti..

jinak si tez myslim, ze tridni jazyk je ten, jehoz OOP je zalozeny na tridach, coz JS neni

a kamenujte me

peter
peter (neregistrovaný) 158.195.199.---
17. 3. 2010 0:07

Re: Špatný článek

Neviem ake su Vase znalosti jazykov Python a Javascript, ale skutocne Javascript triedy na rozdiel od Pythonu nema. Kde ste videli triedy v Javascripte?

Daniel Steigerwald aura:52
16. 3. 2010 4:18

Re: Špatný článek

Pane Bronislave Klučko (jste to vy: http://www.bauglir.com, že?), spravedlivý hněv vás zaslepil, ale to nevadí, to se občas stane každému.
Váš komentář vítám, protože mi dává příležitost opět vyvrátit pár omylů. Pojďme si je tedy rozebrat. Opakování je matka moudrosti ,–)

1) Je častou chybou programátorů začátečníků, brát všechny pojmy dogmaticky. Možná vás to překvapí, ale co platí v jednom programovacím jazyce, nemusí platit v jazyce jiném. Jedním z takových pojmů je třída. Každý jazyk ji definuje po svém, a Javascript není výjimkou. V úvodu, který jste určitě bleskem pouze přelétl, už už aby jste mohl komentovat, jsem zdůrazňoval, že jde o konsensus mezi autory Javascriptových knihoven. Koukněte: dojo, mootools, yui, google closure, prototype, qooxdoo. Všichni hovoří o třídách. Za třídu se v Javascriptu označuje konstrukční funkce, používající vlastnost prototype. Už vidíte, jak moc se mýlíte?

Mimochodem, když už chcete citovat ze specifikace, poprosil bych o celou větu až dokonce. Ta zní: „ECMAScript does not use classes such as those in C++, Smalltalk, or Java.“ Hned to zní jinak, že? :-) Dokonce i specifikace mluví o třídách, pouze zdůrazňuje, že jsou jiné.

2) Javascript samozřejmě primitivní typy má. Když už tu mlátíte specifikací o stůl, tak si snad zvládnete i dohledat větu: „A primitive value is a member of one of the following built-in types: Undefined, Null, Boolean, Number, and String;“. Vy ale zcela evidentně nevíte, co primitivní znamená. Vážně jste si nikdy nevšiml, že se v Javascriptu některé typy předávají referencí, a jiné hodnotou?

Byl bych k vám krutý, kdybych nevysvětlil, jak váš příklad ve skutečnosti funguje.

var num = 5; 

Tento zápis skutečně deklaruje primitivní hodnotu. Zkuste předat num do nějaké funkce, tam jej inkrementovat. Změní se původní num? Nezmění, protože je primitivní a byl tedy předán hodnotou. Dále si můžete vyzkoušet přiřadit nějakou hodnotu:

var num = 5;
num.a = 1;
alert(num.a)​ // undefined 

Sakra, nejde to. Proč? Protože num je primitivní :-D

Jiná situace by byla, pokud byste napsal:

var num = new Number(5) 

S takto vytvořeným číslem můžete pracovat stejně jako s jeho literárním zápisem, avšak pozor, num se předává referencí. Schválně si to zkuste, protože je to pro vás evidentně nová věc. Pomalu se blížíme v rozuzlení vašeho (krapet ukecaného) příkladu. Proč ukecaného? Protože stejného výsledku dosáhneme i takto:

var num = 5;
alert(num.toString())​ 

Jak je vidět, ani nemusíte vytvářet objekt ‚a‘ :-)

Shrnutí. Literární zápis generuje primitivní hodnoty, zatímco zápis pomocí konstruktoru (Number, Boolean, String) objektové reprezentace. Převést primitivní hodnotu na její objektovou reprezentaci, lze pomocí přímého volání konstruktoru, ani nemusíme použít new.

var num = 5;
var objectNum = Number(num); 

Obráceně to za nás Javascript udělá vždy, když detekuje, že by se primitivní hodnota hodila, nebo to lze provést explicitně, a jak ukazuje poslední alert, dokonce můžeme používat vlastní objekt, číslo imitující.

var objectNum = new Number(5);
alert(objectNum + 2); // 7
alert(objectNum.valueOf() + 2); // 7
var customNumber = {
    valueOf: function() {
        return 5;
    }
};
alert(customNumber + 2); // 7
​ 

Za domácí úkol si spočítejte, kolikrát je pojem ‚primitive‘ zde uveden.

3) K poslednímu bodu bych dodal, že právě Vy, byste si měl článek poctivě pročíst, a to ve svém vlastním zájmu.

xx
xx (neregistrovaný) ---.net.upc.cz
16. 3. 2010 10:19

Re: Špatný článek

> Je častou chybou programátorů začátečníků, brát všechny pojmy dogmaticky.

Problém je v tom, že když nepoužíváte přesné a jasné definice základních pojmů, tak se pak vlastně neví, o čem mluvíte. Odstrašujícím příkladem může být pojem OOP. Když někomu řeknete, že jazyk XYZ podporuje OOP, tak je to jako byste nic neřekl (možná říkáte, že jazyk podporuje dynamic dispatch, ale to je asi tak všechno).

Peter Rybar aura:14
16. 3. 2010 11:54

Re: Špatný článek

Aj ja som za striktne definovanie a dodrziavanie pojmov. Je to znak profesionality.
Kto sa nevie vyjadrovat, nech nepise clanky, lebo narobi viac skody ako osohu.

Jakub Nešetřil
Jakub Nešetřil (neregistrovaný) 212.47.19.---
16. 3. 2010 13:03

Re: Špatný článek

A já ne. Dogmatické a striktní chápání jakéhokoliv pojmu vidím jako programátorovu slabinu a jeho neschopnost. Místo chápání konceptů se brání definicemi pojmů.

Dobrý programátor je schopný používat koncepty a dokonce o nich i komunikovat s ostatními bez takovéhleho dogmatismu.

Dan Steigerwald je jeden z nejlepších JS programátorů v Čechách a článek který napsal čouhá nad českým průměrem znatelně. Možná snad jen to je jeho chybou – tedy že je článek určený inteligentním, uvažujícím lidem.

Peter Rybar aura:14
16. 3. 2010 13:40

Re: Špatný článek

> Dogmatické a striktní chápání jakéhokoliv pojmu vidím jako programátorovu slabinu a jeho neschopnost. Místo chápání konceptů se brání definicemi pojmů.

Ako mozete chapat koncept, ked nechapete pojmy?

> Dobrý programátor je schopný používat koncepty a dokonce o nich i komunikovat s ostatními bez takovéhleho dogmatismu.

Mam pocit ze Vy asi inak chapete aj moju vetu „striktne definovanie a dodrziavanie pojmov“. To potom ale vedie na styl diskusie „Ja o voze, ty o koze“, co je presne teraz nas pripad.

Bauglir
Bauglir (neregistrovaný) 82.100.48.---
16. 3. 2010 13:45

Re: Špatný článek

Dogmatické chápání pojmů je základem, protože (teď nemluvím o panu Steigerwaldovi, dávám obecné příklady) když si někdo bude plést proměnnou a typ, funkci a metodu, hodnotu proměnné a pointer na proměnnou, a já nevím, co ještě, tak to není dobře. Uvědomte si, že toto všechno nejsou jen tak pojmy něčeho abstraktního, ale naprosto konkrétní koncepty, které pokud zaměníte v kódu, nastane průšvih. Navíc se tu nebavíme o nějakém klábosení ajťáků večer u piva, ale o naučném článku, který by měl být maximálně přesný, protože jinak mate.

Nejde o konceptuální dogmatizmus, fakt, jestli tomu říkáme, nebo neříkáme třída nemá nic společného s tím, jestli jsou třídy oblíbené, používané, dobře používané… Nikdo se tu nehádá o tom, jestli je prototypování lepší, než třídy, nebo ne.

Prohlášení o tom, že někdo, kdo je schopný programátor + má publikační činnost patří k jedněm z nejlepších programátorů mě vždy rozesměje. Teď se nechci pana Steigerwalda dotknout osobně, tato výtka se ho netýká, ale pane Nešetřile, znáte VŠECHNY programátory v Čechách, abyste mohl takhle hodnotit? Navíc od kdy se dobrý programátor = dobrý publicista?

Neinteligentní Neuvažující Člověk

xx
xx (neregistrovaný) ---.net.upc.cz
16. 3. 2010 14:19

Re: Špatný článek

> Místo chápání konceptů se brání definicemi pojmů.

Tady nikdo neříká, že to má být na úkor chápání konceptů.

Koncepty se hodí, když o problému přemýšlíte v „obecné rovině“. Ale až vymyslíte, jak se problém dá vyřešit, je potřeba ověřit, že váš postup je správný. A zde už si s koncepty nevystačíte. Zde už potřebujete zadefinovat problém, popsat algoritmus na jeho řešení a dokázat, že řeší definovaný problém.

Aleš Roubíček
Aleš Roubíček (neregistrovaný) 193.165.135.---
16. 3. 2010 14:38

Re: Špatný článek

Jak souvisí algoritmizace kokrétně s JavaScriptem? V JS jde hlavně o reaktivní proces…

V JS jsou platné především koncepty.

xx
xx (neregistrovaný) ---.net.upc.cz
16. 3. 2010 15:29

Re: Špatný článek

To měl být jen příklad na to, že s koncepty nevystačíte.

koroptev
koroptev (neregistrovaný) ---.cajvc.com
16. 3. 2010 14:40

Re: Špatný článek

tohle je docela zajimave, co jste nevedomky zminil – algoritmus – tenhle clanek byl o vsem jinem nez o algoritmech, a prijde mi to symptomaticke, zel i pro me vlastni zamestnani ..

Bauglir
Bauglir (neregistrovaný) 82.100.48.---
16. 3. 2010 12:22

Re: Špatný článek

Děkuji za reklamu, jsem to já :)

ad 1/ ano, specifikace mluví o třídách asi na 5 místech… všude, kde vysvětluje, v čem se JS liší od třídních jazyků.

ad 2/ konsenzus je dohodou/porozuměním mezi lidmi, na faktech ale obvykle nic nemění :). Můžete si tomu říkat třeba druh ovoce ale ovocem se to nestane. JS prostě nemá třídy :)
Fakt, že tomu Vy a další budete říkat třídy vede jenom k tomu, že se programátoři, kteří k JS přijdou z jazyků, které podporují třídy, budou snažit opakovat stejné postupy, na které jsou zvyklí a oni prostě v JS nepůjdou… Když to řeknu jinak, pokud budu přecházet mezi ObjectPascalem, PHPkem a C#, změním spoustu věcí, syntaxi, knihovny, frameworky… ale nezměním paradigma pro vytváření objektů. Pokud se ale dostanu k JS, tak třídní paradigma musím zahodit a musím začít přemýšlet v prototypech.

ad 3/ nemám problém přiznat, že s primitivními typy jsem se sekl. Nicméně i Vy máte Vašem rozsáhlém popisu chybu:
„Převést primitivní hodnotu na její objektovou reprezentaci, lze pomocí přímého volání konstruktoru, ani nemusíme použít new.“
Samozřejmě musíte, zkuste si pro změnu i Vy nějaké příklady

var a = Number(2); var b = new Number(5); a.data = 5; b.data = 5; alert(a.data + "\n" + b.data + "\n" + (typeof a) + "\n" + (typeof b));

i specifikace jasně píše: „The Number Constructor Called as a Function: When Number is called as a function rather than as a constructor, it performs a type conversion. Number ( [ value ] ):
Returns a Number value (not a Number object) computed by ToNumber(value) if value was supplied, else returns +0.“

4/ nebojte se, já si to pročetl a pročtu si i další díly, některé věci, které jsem ani nekomentoval, protože předpokládám, že budu mít možnost v jiných částech

Daniel Steigerwald aura:52
16. 3. 2010 14:28

Re: Špatný článek

Díky za upozornění, mělo tam být Object místo Number. Ve čtyři ráno už člověk není tak pozorný ;) „When Object is called as a function rather than as a constructor, it performs a type conversion.“

olin
olin (neregistrovaný) ---.karneval.cz
17. 3. 2010 0:04

Re: Špatný článek

Naprosto souhlasím (jsem také čtenářem ECMA-262). Uvidíme ale až v pokračování seriálu, jestli detailní vnímání specifikace a přesné chápání pojmů bude mít vliv na pochopení souvislostí, protože i nesrovnalosti v pojmech se často řeší dobře zvolenými příklady. A nakonec se stejně lidé vracejí k příkladům, než k textu. Učebnice z tohohle seriálu prostě nebude, informační hodnotu ale mít bude.

Zasílat nově přidané příspěvky e-mailem