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

Michal Augustýn
15. 3. 2010 8:37

struktura + ladění anonymních funkcí + těšení

Daniel jistě ví o čem píše, ale bohužel mi článek přijde trošku blbě strukturovaný :( Např. dva způsoby implementace tříd proložené povídáním o „modulech“.

Btw. kód:
var foo = function () {};
je opravdu neštastný, vzhledem k ladění. Tím se totiž vytváří anonymní funkce, která se přiřazuje do proměnné foo. Takže při ladění ve stack-trace uvidíte něco jako „anonymous_fun­ction125“ (záleží na konkrétní implementaci JS).
Troufnu si tvrdit, že je lepší funkce pojmenovávat, tedy psát:
var foo = function foo () {};

Ale Javascript je tak bohatý jazyk s rozmanitými možnosti, jak zapsat jednu věc, že IMHO nejde napsat článek o JS, na kterém by si někdo něco „špatného“ nenašel ;-) Kolikrát i záleží na kontextu, ve kterém autor JS uvažuje (použití v prohlížeči, na serveru, v databázi, …).

Nicméně se těším na další díly :) A přednášku na IDF :)

Tom5 aura:83
15. 3. 2010 8:44

Re: struktura + ladění anonymních funkcí + těšení

Naprosto souhlasím s to nešťastnou strukturou.

A nechávat si rozuzlení třídy na další díl, je také nevhodné. Pokud jsou uvedeny špatné příklady, měl by být hned uveden ten správný.

Martin Malý aura:93
15. 3. 2010 9:39

Re: struktura + ladění anonymních funkcí + těšení

Víte… ono to rozuzlení zabíralo v celém textu (cca 45.000 znaků) dobrou třetinu. Přemýšleli jsme s autorem, že bychom ho – právě kvůli takovým komentářům – vydali celý v jednom kuse, ale tak dlouhý text většina čtenářů „neučte“. Jediná možnost, jak nechat „správný“ postup v jednom článku se „špatným“, bylo jejich společné vydání (30.000 znaků). Jakýmkoli způsobem bráno se text vždy logicky rozpadal na „jak se to dělá a dělat nemá“, „jak se to dělat má a proč“ a „jak se to dá udělat elegantně“. Nakonec jsme usoudili, že čtenář ví, co je to „seriál“, a chápe, že ačkoli je každý díl logicky uzavřen, bude něco řečeno až příště…

Karel
Karel (neregistrovaný) 93.90.162.---
16. 3. 2010 9:53

Re: struktura + ladění anonymních funkcí + těšení

1. Seriál nemá být psán stylem „tady máte jeden díl, ale zatím ho nečtěte, protože bez toho dalšího v tom budete mít akorát bordel“. Tento díl v žádném případě není „logicky uzavřen“. Spíše než odbornou publikaci váš seriál zatím připomína mexickou telenovelu – tak dnes jsme se nic nedozvěděli, ale v příštím díle se už Esmeralda určitě vdá!

2. Buď jste měli oba (špatný i správný) postupy publikovat v jediném díle, nebo jste měli ten správný publikovat jako první. Psychologové už dávno vědí, že v člověku zůstávají hlavně první dojmy. Můžete do článku stokrát psát, že „takhle se to dělat nemá“, ale protože tu chybí jakékoliv srovnání (a jak se to tedy dělat má?), povedlo se vám v řadě lidí „zakotvit“ vámi uvedené „nesprávné“ postupy jako ty jediné správné (protože žádné jiné jste v článku neuvedl). To je síla podvědomí.

3. Javascript neumím a ani se ho neplánuji učit. Článek jsem četl jen proto, že mně zajímá, jak jsou jednotlivé metodiky (zde OOP) implementovány v různých jazycích. Nemohu proto posoudit obsahovou správnost článku, ale pouze formální. A po formální stránce je to tedy opravdu průšvih.

Ondřej Žára aura:93
15. 3. 2010 9:37

Re: struktura + ladění anonymních funkcí + těšení

Zde jen kratka noticka: uvedeny zapis „var A = function B() {}“ je principialne spravny napad, ovsem v Internet Exploreru (6–8) timto vzdy vznika v globalnim objektu vlastnost B, nezavisle na hodnote A.

Tedy, pokud treba pisu:

MujNamespace.Tri­da.prototype.Me­toda = function Trida_Metoda() {}

tak v IE bude najednou existovat window.Trida_Me­toda.

Daniel Steigerwald aura:52
15. 3. 2010 17:14

Re: struktura + ladění anonymních funkcí + těšení

Opravím vás. Vlastnost B vzniká v aktuálním, ne globálním scope. Pokud tedy váš příklad zabalíte do vlastního scope, pomocí anonymní funkce například, globální scope zůstane netknut. Jinak nevýhody takového zápisu shrnuji v odpovědi na jiný komentář.

Ondřej Žára aura:93
15. 3. 2010 21:45

Re: struktura + ladění anonymních funkcí + těšení

Ano, máte pravdu, jedná se o aktuální scope. Nezávisle na tom však stále platí upozornění, že Internet Explorer (resp. JScript) se v tomto směru chová jinak, než ostatní implementace (nebál bych se dokonce použít termín „špatně“).

Nakonec jsem si dovolil lehce upravit kus vašeho kódu, linkovaný z příspěvku http://zdrojak.root.cz/clanky/oop-v-javascriptu-i/nazory/7955/ (vyhodnocování shora dolů) – moje verze viz http://jsfiddle.net/zsBLH/. Je vidět, že i pojmenovaná funkce není ve scopu viditelná až do doby své deklarace – to proto, že vznikla jako „function expression“ a ne jako „function declaration“. Hezké počtení o této problematice viz https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Functions#Function_constructor_vs._function_declaration_vs._function_expression nebo http://yura.thinkweb2.com/named-function-expressions/.

Daniel Steigerwald aura:52
15. 3. 2010 16:51

Re: struktura + ladění anonymních funkcí + těšení

Blbě strukturovaný.., asi ano ;) Možná by na začátku každého článku měl být obsah. Z něj by bylo snad patrné, že odbočka k modulům svou logiku má. Mluvím o hře na privátní členy, proto zmiňuji, že své využití mají pouze mimo dědičnost a třídy. Tedy pouze u modulů nebo globálních funkcí.

K tvé připomínce. Ač je logická a správná, myslím, že vyvozuješ nedobrý závěr. Zkusme si porovnat klady a zápory obou způsobů:

// tvůj způsob
var foo = function foo() { };

// versus můj
var foo = function() { }; 

Zápis, který považuji za jediný správný, tedy anonymní funkce přiřazená do proměnné foo, skutečně způsobí, že žádný ladící nástroj (Visual Studio, Firebug, Chrome debugger atd.) nemůže zobrazit název funkce. Kde by jej také vzal, že :)

Avšak každý ladící nástroj, nás po kliku na řádek anonymous_function přenese na deklaraci funkce. Osobně se domnívám, že se s tím dá obstojně žít (a to jsou některé mé projekty velmi složité :)

Nyní k záporům. První co mi vadí, je duplikace názvů. Dříve nebo později, bude třeba kód refaktorovat, a myslet na to, že je třeba vždy měnit název na dvou místech, mi přijde otravné (můj názor). Co mi přijde horší, je rozdílný způsob vyhodnocování viditelnosti takto deklarované funkce (mimochodem, není pravda co se píše v jiném komentáři zde, že funkce se stane globální).

Kód se vyhodnocuje „odshora dolu“. Až dojde Javascript k var, proměnná foo se stane viditelná v celém svém scope. Ovšem než se Javascript pustí do samotného vyhodnocování, mrkne se, jestli v celém scope není nějaká funkce přímo pojmenována, a pokud ji nalezne, „zviditelní“ ji ihned.
Nejlépe to osvětlí příklad: http://jsfiddle.net/Y7eRB/

Nebudu argumentovat oblíbeným hypotetickým případem „něco si někde přepíšeme“, který je málo pravděpodobný, pokud zrovna nepíšeme program stylem plachta ;) Budu argumentovat tím, že až bude náš kód někdo číst, bude se lámat hlavu, proč je tam název určen 2×, a bude jej to rozptylovat od práce. No a nakonec, neznám knihovnu, ani komponentu, která by tento styl používala.

Jak vidíš, je to trade-off. Pokud trváš na svém způsobu, dobře. Buď pak ale důsledný, a používej jej všude. A donuť i všechny ostatní programátory ve svém týmu, ať jej také používají ,–)

Michal Augustýn
15. 3. 2010 17:01

Re: struktura + ladění anonymních funkcí + těšení

Teď je správný čas použít mou větu Kolikrát i záleží na kontextu, ve kterém autor JS uvažuje (použití v prohlížeči, na serveru, v databázi, …).
Mé použití JavaScriptu je ale opravdu velmi speciální (vyžadovalo i nějaké hooky v samotné implementaci)…:D

Aleš Roubíček
Aleš Roubíček (neregistrovaný) ---.47.broadband3.iol.cz
15. 3. 2010 19:46

Re: struktura + ladění anonymních funkcí + těšení

MS AJAX to v debug verzi používá, je díky tomu přehlednější call stack při debugování. Jindy to opravdu význam nemá.

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