« 1 2 3 »
Autor Zpráva
Suta
Profil
Moderátor Chamurappi: Vytrženo z Virtuální joystick pomocí jQuery

solta:
Pouze připomínka k používání jQuery. Nauč se využívat uložení odkazu na jQuery objekt do lokální proměnné namísto jeho neustálého vytváření. Proměnné, které značí objekt vytvořený knihovou jQuery pojmenovávej (nepovinná, avšak doporučená konvence) se znakem $ na začátku.

Místo:
$('#rosette').mousedown(function(e){ ...
$('#rosette').mouseup(function(e){
$('#rosette').mouseleave(function(e){
$('#rosette').mousemove(function(e){

Používej:
$rosette = $('#rosette');
$rosette.mousedown(function(e){ ...
$rosette.mouseup(function(e){
$rosette.mouseleave(function(e){
$rosette.mousemove(function(e){

nebo
$('#rosette')
    .on("mousedown",function(e){ ... })
    .on("mouseup",function(e){ ... })
    .on("mouseleave",function(e){ ... })
    .on("mousemove",function(e){ ... });

A místo:
var x=$(this).width()/2;
var y=$(this).height()/2;
var offset = $(this).offset();

Používej:
var $this = $(this),
    x=$this.width()/2,
    y=$this.height()/2,
    offset=$this.offset();
Chamurappi
Profil
Reaguji na Sutu:
(nepovinná, avšak doporučená konvence) se znakem $ na začátku
Docela praštěná konvence. K čemu to je? V JavaScriptu se proměnné podle datových typů nepojmenovávají, to je spíš zvyklost z Basicu. Podle ECMAScriptu 3 jsou proměnné začínající dolarem vyhrazené pro strojově generovaný kód.
Na tvé ukázce je vidět, že dolar na začátku dokáže zmást automatické zvýrazňovače kódu, protože pak je JS skoro k nerozeznání od PHP.
Suta
Profil
Chamurappi:

Docela praštěná konvence. K čemu to je?
Nejrozšířenější a nejpopulárnější javascriptová knihovna na světě (můžeme se přít o tom, zda-li jí jQuery je) si pro globální přístup ke své knihovně zvolila právě znak $. Není sice jedinou knihovnou, která tento znak používá, ale její přístup a styl programování v javascriptu, který byl s jejím příchodem odstartován, je dostatečně robustní, odlišný a zasluhující pozornost. Z tohoto důvodu nevidím důvod, proč by za praštěný způsob konvence měl být považován ten, který jednoznačně v kódu odlišuje klasickou proměnnou od "jQuery objektu" (resp. "$. objektu").

Spíše mi přijde, že se na věc díváš stejně, jako na jQuery, tedy že obojí pokládáš za nepotřebnou a nesmyslnou věc.

Mnou popisovanou konvenci přijali za svou a doporučují i samotní tvůrci jQuery. Není to však jediná věc, která ti vadí, pamatuji si, že jsi také nepřítelem řetězení metod, na které já jsem si plně zvykl a dnes na něj nedám dopustit. Třeba proto, že je zápis díky jeho použití kratší a přehlednější.
Chamurappi
Profil
Reaguji na Sutu:
Z tohoto důvodu nevidím důvod, proč by za praštěný způsob konvence měl být považován ten, který jednoznačně v kódu odlišuje klasickou proměnnou od "jQuery objektu" (resp. "$. objektu").
Lidi, kteří vědí, že $ uvnitř identifikátoru je znak jako každý jiný, toto odlišení ve skutečnosti nepotřebují, stejně jako nepotřebují proměnné s čísly nazývat numNěco a proměnné s řetězci strNěco. Datový typ obvykle vyplývá z celkové logiky kódu. V JavaScriptu se podle typů běžně neprefixuje a nejrozšířenější javascriptová knihovna je pořád méně rozšířená, než JavaScript sám. Proto je to praštěné.

Krom lidí, kteří vědí, tady pak máš masu začátečníků, kteří můžou předpokládat, že:
1) Předřazením dolaru do jména získá proměnná vlastnosti jQuery objektu.
2) S jQuery je možné vynechávat závorky okolo argumentu.
3) Framework není podmnožinou jazyka. Když uvidí dolary jinde, kde není jQuery, budou dezorientovaní.
4) Proměnná zapsaná s dolarem je předvyplněná tím, co je ve stejně nazvané proměnné v PHP.
5) Proměnná zapsaná s dolarem má jiné vlastnosti přisuzované proměnným v PHP (třeba že se vyhodnocuje uvnitř řetězců, nebo že jde její název poskládat z řetězců).

Mnou popisovanou konvenci přijali za svou a doporučují i samotní tvůrci jQuery.
A proměnným určeným pro regulární výrazy dávají na začátek r. To děláš také?

Třeba proto, že je zápis díky jeho použití kratší a přehlednější.
Mně vadí kvůli nepřehlednosti. Odhazování teček s metodami na další řádky se také vymyká běžným konvencím. Samozřejmě, že zvyknout se dá na všechno, ale deformování vkusu podle jedné knihovny (která je jen knihovnou, ne jiným jazykem) mi připadá nežádoucí.
shaggy
Profil
Suta:
doporučují i samotní tvůrci jQuery
Napísal som si už dosť vlastných pluginov v jQuery, používam tú knižnicu, ale premenné stále nazývam bez $ na začiatku.
Nevidím jediný dôvod, prečo by som mal odlišovať "klasickú" premennú (čiže napr. string) od jQuery objektu. Alebo ty odlišuješ aj ostatné objekty od jQuery objektu?
A odlišuješ tiež premenné s celými číslami od premenných s reálnymi číslami?
Suta
Profil
Chamurappi:
Spoustu tvých výtek chápu. Svůj názor opírám o zkušenosti člověka pracujícího denně s jQuery. Kdybys to dělal také (což nevím), pak bys věděl, že máš-li v kódu desetitisíce řádků a v každém bloku kódu používáš jak běžné proměnné (různých typů), tak proměnné, v nichž máš uloženy objekty jQuery, pak sledováním kódu běžným okem nemusíš ihned vědět, zda-li určitá konkrétní proměnná odkazuje na standardní proměnnou, nebo zda-li v ní již je uložen objekt jQuery, nad nímž můžeš volat jeho vlastní metody. Ono drobné rozlišení pomocí prefixu (bez ohledu na to, zda-li se v javascriptu běžně prefixuje či ne) ti ve výsledku může ušetřit (a mně ušetří) spoustu času.

shaggy:
Nepoužívám, tuto výjimku dělám pouze u jQuery. Logicky proto, že jedna proměnná může být různých typů. Object jQuery nikoliv.
Chamurappi
Profil
Reaguji na Sutu:
máš-li v kódu desetitisíce řádků a v každém bloku kódu používáš jak běžné proměnné (různých typů), tak proměnné, v nichž máš uloženy objekty jQuery
… tak je kód ošklivě strukturovaný a koleduje si o chyby, nehledě na to, jaké konvence názvů používá. Skripty externě přilepované na DOM mají tendenci špagetovatět. Podle toho, co píšeš, ti musí připadat nepříjemné i seskládávat vary dohromady, ne? Informaci, jestli je v proměnné jQuery objekt, chceš mít furt na očích, ale příkaz vymezující rozsah její platnosti doporučuješ odsunout. To mi nepřipadá rozumné, zamyslím-li se nad potenciálními riziky a škodami.

Nepracuji sice denně s jQuery, ale pracuji samozřejmě s DOMem, takže vědět, jestli je v proměnné číslo, nebo HTML element, nebo kolekce, je pro mě obdobně důležité. Nějaké konvence pro názvy proměnných mám, ale necítím potřebu si je nálepkovat podle typů, řídím se spíš sémantikou a tím, jakou sehrávají roli (což je někdy podobné).

nebo zda-li v ní již je uložen objekt jQuery, nad nímž můžeš volat jeho vlastní metody
Na proměnné, která není jQuery objekt, většinou ty metody neexistují, tudíž pokus o zavolání selže a chybová konzole ti řekne docela přesně, kde jsi se seknul. Většinou víš, co chceš s čím dělat, a šance, že se spleteš, mi připadá na první pohled u obou postupů stejně malá. V tomto případě je totiž rozhodující pro vznik omylu celkový „život“ proměnné, takže tím, že si množinu všech proměnných rozdělíš do dvou umělých škatulek podle určité základní charakteristiky, si nepomůžeš. Protože ta charakteristika je očividná i bez prefixu.

Prefixování identifikátorů může mít smysl tam, kde je těžké najít chybu — tedy pokud jsou typy stejné (nebo hodně podobné), ale význam jiný, takže popletený kód sice funguje (nehlásí chybu), ale blbě. Kupříkladu setInterval vrací sice číslo, ale to, že je to číslo, není důležité, podstatné je, že značí interval, proto si proměnnou nazvu tak, abych se i při náměsíčném programování štítil s ní pracovat jako s číslem.

ti ve výsledku může ušetřit (a mně ušetří) spoustu času
Pochybuji. I o tom, že ji šetří tobě. Než jsi na tuto konvenci přešel, pletl sis často typy?
Většina těch, kdo ji vyznávají, se při prvním zpochybnění odvolává zejména na jiné lidi, kteří konvenci prosazují, z toho důvodu to spíš vidím jako snahu o standardizaci jakési nové módy. Móda zápisu sehraje důležitou úlohu, jakmile vymizí nekompatibility prohlížečů, kvůli kterým se frameworky uchytily.

tuto výjimku dělám pouze u jQuery. Logicky proto, že jedna proměnná může být různých typů. Object jQuery nikoliv.
Tomuto nějak nerozumím. Nevidím mezi typy proměnných žádný významný rozdíl.
_es
Profil
Suta:
Logicky proto, že jedna proměnná může být různých typů. Object jQuery nikoliv.
Logicky to je akosi nezmysel. V JS nie je syntakticky nič ako „objekt jQuery“. A aj v premennej nazvanej $x môže aj číslo či textový reťazec.
Suta
Profil
_es:
V tomto tvojom článku
Omlouvám se, ale s článkem nemám nic společného, vidím jej poprvé. Použitý prefix u argumentů funkce je logicky nesmysl, pokud by tedy již v té době nebyly do uvedené metody zasílány objekty jQuery...

K řádné reakci na poslední dva uvedené příspěvky se dostanu nejdříve v neděli.
_es
Profil
Suta:
s článkem nemám nic společného
Pardon, poplietol som si prezývky.

Použitý prefix u argumentů funkce je logicky nesmysl, pokud by tedy již v té době nebyly do uvedené metody zasílány objekty jQuery...
Tomu nerozumiem, čo znamená „v tej dobe“? Funkcia predsa môže byť volaná s hocijakými počtom argumentmi s hocijakými hodnotami. Tá konvencia sa teda podľa teba argumentov funkcie týka, či netýka? Lebo to sú tiež len lokálne premenné funkcie, rovnaké ako tie definované cez var.
peta
Profil
OT
Osobne povazuji $ pro jquery za zajimave zprestreni, ktere ma ale dve zasadni nevyhody:
- Shodu s php. Lide se pak snazi do js kodu michat php promenne, delaji chybne apostrofy a pod.
- Shodu s jinymi frameworky. Pak se frameworky vzajemne pomlati a nekdy nefunguje ani jeden.

Suta
misto 1 pouzivej 2 nebo 3 - volil bych 2 nebo 3
misto 4 pouzivej 5 - volil bych 5 nebo 6
6: rosette = $('#rosette');
Radeji dam prednost tomu, abych tam mel zavorky nez bych musel vysvetlovat nekomu, proc mu nejede toto v php:
$id = 'u235';
echo "
$rosette = $('#rosette');
$rosette.id = '$id';
";
Joker
Profil
Suta:
Nejrozšířenější a nejpopulárnější javascriptová knihovna na světě (…) si pro globální přístup ke své knihovně zvolila právě znak $.
Není právě tohle naopak důvod ten dolar nepoužívat?
Přijde mi to hrozně matoucí, zejména pro začátečníky. Navíc to může být zdrojem nepříjemných chyb, lze pak snadno zaměnit proměnnou a vlastnost jQuery objektu, viz třeba$map vs $.map.

A proč vlastně mít speciální prefix pro jQuery objekty? Měl bych prefixovat i jiné objekty? Řetězce, čísla? Ve výsledku bychom tedy měli používat maďarskou notaci?

Není to zcestné v jazyce, kde je typ proměnné určený jejím obsahem, takže v dané proměnné může být vlastně cokoliv?
joe
Profil
Chamurappi:
Docela praštěná konvence. K čemu to je?
Nepřijde mi a jsem za jedno se Sutou. Kromě toho, že prefixování jQuery objektů doporučují samotní tvůrci frameworku, takové označení ušetří čas, pokud se správně používá a dodržuje.

Mějme pravidlo, celkem jednoduché, že název proměnné s $ na začátku bude pouze objekt jQuery, nic jiného. Pak vím, že u takové proměnné můžu volat funkce jQuery a nemusím zjišťovat, jestli proměnná je nebo není instancí jQuery.

Krom lidí, kteří vědí, tady pak máš masu začátečníků, kteří můžou předpokládat, že:
Uvádíš správně, masu začátečníků - ti by se nejprve měli naučit samotný JavaScript :-) a teprve potom se pouštět do jQuery a jiných frameworků. Neznalost v tomto případě neomlouvá a pokud někdo nepozná rozdíl mezi voláním funkce a definováním proměnné, je to jen jeho chyba, může se ale stát každému.

Příklad:

$(".items").on("click", "a", function () {
  var $this = $(this);
  $this.animate(...);
  console.log(this.href);
});

Kam bych si v tomto příkladu měl ukládat výsledek $(this)? Do that? Nepohodlné - musím vymýšlet jiný název. Co když pak budu chtít volat funkci animate? Musím se podívat, jestli vůbec mohu a nebo to risku a pak zjistím, že ji nevolám na jQuery objektu.

Joker:
viz třeba$map vs $.map
Tečka je v kódu celkem vidět, pokud ne, skončíš s velikou pravděpodobností na chybě. Přijde mi to stejné, jako bys tvrdil, že case-sensitive je matoucí, protože MyClass "se přece dá snadno zaměnit" za Myclass. Od toho už jsou ale právě frameworky, aby na chybu upozorňovaly a nebo samotné jazyky, které nedovolí zkompilovat takový kód.


Odpověď na otázku - ano, je to dobrý nápad a rozhodně ho doporučuju všude, kde to jen jde.
_es
Profil
joe:
Mějme pravidlo, celkem jednoduché, že název proměnné s $ na začátku bude pouze objekt jQuery, nic jiného.
Ako zabezpečíš, že funkciu f definovanú function f($x){nejaký kód} bude niekto iný volať práve s argumentom „jQuery objektom“?

Od toho už jsou ale právě frameworky, aby na chybu upozorňovaly
No ale jQuery je len jedna objektofunkcia, nie nejaké vylepšenie programovacieho jazyka, teda nemá na veľa chýb či „chýb“ ako upozorniť.

nebo samotné jazyky, které nedovolí zkompilovat takový kód.
Ktorú konkrétnu chybu? JS ani nie je nutne treba kompilovať. A je to benevolentný jazyk, kde je trebárs neexistujúca vlastnosť undefined.

Kam bych si v tomto příkladu měl ukládat výsledek $(this)? Do that? Nepohodlné - musím vymýšlet jiný název.
Ale z iného názvu je viac zrejmé, že v that nemusí vždy byť $(this) a zdrojom možných problémov by mohlo byť práve zavádzajúce pomenovanie.

prefixování jQuery objektů doporučují samotní tvůrci frameworku
V oficiálnej dokumentácii také pravidlo používané nie je, napríklad: http://api.jquery.com/queue/#example-0
shaggy
Profil
joe:
Kam bych si v tomto příkladu měl ukládat výsledek $(this)? Do that?
Ja napr. používam toto:
var thisObj = $(this);
v čom je to horšie od tvojho zápisu? Mám tak odlíšené this a $(this).

Pak vím, že u takové proměnné můžu volat funkce jQuery a nemusím zjišťovat, jestli proměnná je nebo není instancí jQuery.
Ale to viem aj v prípade, že nepoužívam dolárový prefix. A ak tú premennú napĺňaš "externými" dátami, musíš kontrolovať, či skutočne obsahuje jQuery objekt.
Príklad - mám plugin. Na začiatku použijem môj zápis, čiže:
var thisObj = $(this);
o 30 riadkov ďalej, potrebujem v rámci toho pluginu robiť s thisObj. Už samotný fakt, že viem o existencii tej premenej znamená, že aj viem, čo sa v nej nachádza, nie? A nepotrebujem k tomu dolár na začiatku.
Joker
Profil
joe:
Já v první řadě stále nechápu, proč bych se k jednomu z objektů na stránce měl chovat jinak než k těm ostatním.
Nebo by se měly prefixovat i jiné objekty? Co když vývojář nějakého jiného objektu taky řekne, že proměnné obsahující ten objekt mám prefixovat dolarem?

vím, že u takové proměnné můžu volat funkce jQuery a nemusím zjišťovat, jestli proměnná je nebo není instancí jQuery.
Úplně stejný argument se dá použít pro cokoliv jiného.
Když budu používat maďarskou notaci a všechny proměnné se „s“ na začátku budou vždy jen řetězce a s „i“ na začátku vždy jen čísla, bude hned vidět, že třeba proměnná sMujText je řetězec a můžu na ní používat řetězcové funkce.
To jsem samozřejmě vynechal fakt, že to, aby v dané proměnné „vždycky“ byl nějaký konkrétní typ, nelze nijak vynutit.

Pak je další případ: Co proměnné, ve kterých může, ale nemusí být jQuery objekt? Dolar, nebo bez dolaru? Není pak divné volat jQuery funkce na proměnné bez dolaru?

Přijde mi to stejné, jako bys tvrdil, že case-sensitive je matoucí, protože MyClass "se přece dá snadno zaměnit" za Myclass.
Ano, použít ve stejném kódu proměnné s názvy MyClass a Myclass mi přijde pěkně zhovadilé.
Ovšem to není chyba rozlišení velikosti písmen v daném jazyce, ale dané programátorské konvence.
joe
Profil
_es:
Ako zabezpečíš, že funkciu f definovanú function f($x){nejaký kód} bude niekto iný volať práve s argumentom ‚jQuery objektom‘?
Pokud budu pracovat se schopnými lidmi, pak by mi stačilo napsat

/**
 * Funkce ...
 * @param {jQuery} $x
 */
function f($x) { ... }
pokud ne, tak na začátku funkce budu parametry kontrolovat a vyhazovat vyjímky
/**
 * Funkce ...
 * @param {jQuery} $x
 */
function f($x) {
  if (!($x instanceof jQuery)) {
    throw "Parametr $x musi byt jQuery objekt".
  }
}

No ale jQuery je len jedna objektofunkcia, ...
Ktorú konkrétnu chybu? JS ani nie je nutne treba kompilovať...
To jsem myslel špíš obecně, ne k jQuery :)

Ale z iného názvu je viac zrejmé, že v that nemusí vždy byť $(this)
Tak právě proto jsem se ptal, kam by kdo ten jQuery objekt uložil. Pokud si zavedu pravidlo s $, jednoznačně vím co je a co naopak není jQuery objekt
this - není
$this - je

shaggy:
Ja napr. používam toto:
Neberu ti to, ale jak o pár řádů níž poznáš, zda se jedná o jQuery nebo ne? :-) Skoro bych čekal, že tam bude uložené jen this, pro další zpracování ve vnořených funkcích. Tak dobře, když použiju tvůj zápis:

$(".items").on("click", "a", function () {
  
  var thisObj = $(this);
  thisObj.animate(..., function () {
    // tady se chci dostat ke zvyraznenemu this, takze je treba ho ulozit do dalsi promenne, jake?
  });
  console.log(this.href);
});

Už samotný fakt, že viem o existencii tej premenej znamená, že aj viem, čo sa v nej nachádza, nie?
Víš ty, ale ne člověk co na to kouká po tobě :-)

Kromě toho místo prefixu zavádíš suffix, který je delší než jeden znak, ale když se s tím chceš psát...

Joker:
Nebo by se měly prefixovat i jiné objekty?
Netřeba :) Takové pravidlo je vhodné u knihoven, které jsou často používané a to jQuery je.

Co když vývojář nějakého jiného objektu taky řekne, ...
Znám ještě jednu knihovnu s dolarama, MooTools, ale tu radši nepoužívám.

bude hned vidět, že třeba proměnná sMujText
Když bude proměnná mujText, taky z ní poznám, že jde o text. To už záleží na názvech proměnných. Pravidlo s $ pro jQuery je jen taková vyjímka.

Co proměnné, ve kterých může, ale nemusí být jQuery objekt?
To je otázka... snad jediné místo, kde by tohle mohlo vzniknout jsou parametry funkcí, pokud chci nabídnout funkci volat s jiným počtem parametrů a tak si přesouvám hodnoty parametrů z jednoho na druhý.

Pokud ale má být jQuery a zároveň nemusí, pak je buď jQuery a nebo null. V tom případě s $.

Ovšem to není chyba rozlišení velikosti písmen v daném jazyce, ale dané programátorské konvence.
Nepoužívá se něco podobného celkem často?

var auto = new Auto();
auto.rozjedSe();
auto.opravit(Auto.OPRAVA_ZAKLADNI);

Takové pojmenování mi přijde celkem běžné, že záleží jen na velikosti písmen.
_es
Profil
joe:
by mi stačilo napsat
To máš potom tú „jQuery premennú“ označenú dvakrát - aj prefixom aj v dokumentačnom komentáre. Na čo?

na začátku funkce budu parametry kontrolovat a vyhazovat vyjímky
No ale to je z hľadiska výkonu aplikácie nepriaznivé.

jednoznačně vím co je a co naopak není jQuery objektthis - není$this - je
Myslel som to, že v čase behu kódu nemusí $this zodpovedať $(this) - stačí pozabudnúť na vnorenie funkcií - je to zavádzajúci názov. Okrem toho aj výraz this môže obsahovať „jQuery objekt“.

buď jQuery a nebo null
Na čo si dopredu vytvárať také nepraktické obmedzenie? To sa snáď nedá vymyslieť funkcia, ktorá by nejako užitočne pracovala s „jQuery objektmi“ aj s „nejQuery“ objektmi?
shaggy
Profil
joe:
Pokud budu pracovat se schopnými lidmi, pak by mi stačilo napsat
...
pokud ne, tak na začátku funkce budu parametry kontrolovat a vyhazovat vyjímky

A vysvetlíš mi, ako tomu zabráni použitie dolára v názve premennej? Ak je to vstup, ktorý sa nevytvára v rámci tvojho kódu a vkladá ho niekto iný, tak by si mal kontrolovať vždy, nie? Dolár na tom nič nezmení.

// tady se chci dostat ke zvyraznenemu this, takze je treba ho ulozit do dalsi promenne, jake?
To nerieši ani tvoj dolárový prefix. Takže rovnaká otázka platí aj pre teba.
Chamurappi
Profil
Reaguji na joa:
Pak vím, že u takové proměnné můžu volat funkce jQuery a nemusím zjišťovat, jestli proměnná je nebo není instancí jQuery.
Pokud proměnnou plníš sám (tedy můžeš se spolehnout na dodržení konvenci) a nevíš, co v té proměnné je, co bys s ní jinak chtěl dělat? Její účel v rámci zbytku kódu přeci musíš znát, abys věděl, k čemu tam je a co s ní chceš provádět. U proměnné potřebuješ znát především název a účel, název ti naznačuje účel a z účelu jednoznačně vyplývá datový typ (předpokládaný). Samotná znalost názvu a typu je úplně k ničemu.

Ztotožňuji se s názorem, že konvence nevynucované kompilerem/interpreterem mají bránit hůře odhalitelným chybám. Zrovna tebou později uvedené new Auto() je dobrý příklad — funkce Auto je nazvaná s velkým počátečním písmenem, aby bylo jasné, že je konstruktorem, tedy že by se měla volat s new, jinak hrozí špatná funkčnost (ale nikoliv nutně vyvolání výjimky). Uděláš-li náhodou chybu v tom, že voláš na nejQuery objektu nějakou jQuery funkci, dozvíš se to od prohlížeče velmi rychle, včetně přesného určení místa.

> „Už samotný fakt, že viem o existencii tej premenej znamená, že aj viem, čo sa v nej nachádza, nie?“
> Víš ty, ale ne člověk co na to kouká po tobě :-)
Ale co s ní ten člověk chce dělat, když vůbec neví, co v ní je? Neměl by na ní šahat, pokud netuší, k čemu slouží.

Kam bych si v tomto příkladu měl ukládat výsledek $(this)? Do that? Nepohodlné - musím vymýšlet jiný název.
Takže konvence ti v tomto specifickém případě trefně nahrazuje nedostatek fantazie, který tě ovšem stejně potrápí v jiných případech, kde budeš mít víc this (a $this). Já bych si to nazval třeba odkaz nebo item.

„Nebo by se měly prefixovat i jiné objekty?“
Netřeba :) Takové pravidlo je vhodné u knihoven, které jsou často používané a to jQuery je.
Array je mnohem častěji používaný objekt a neprefixuje se. Stejně tak s DOM objekty se pracuje také hodně často a žádná ustálená konvence u nich není.
Staré Google Maps používaly u všech funkcí prefix G, nové už to naštěstí nedělají.

Znám ještě jednu knihovnu s dolarama, MooTools, ale tu radši nepoužívám.
Ještě bys mohl znát tu, která užívání dolarů k hledání elementů vymyslela.
Joker
Profil
joe:
Pravidlo s $ pro jQuery je jen taková vyjímka.
Stále nechápu proč.
Můžu mít na stránce třeba 50 objektů a jQuery bude jeden z nich, ani nemusí být nějak výjimečný, proč kvůli tomu hned dělat humbuk?

Vzít prostě jeden z desítek objektů na stránce a říct „K tomuhle jednomu objektu se budeme chovat jinak než ke všem ostatním“ mi přijde úplně iracionální.
Navíc dělat výjimky specificky pro jQuery objekt pak ve čtenářích kódu obrácenou vazbou podporuje dojem, že jQuery je nějaký výjimečný druh objektu.

Podle mého názoru je to škodlivé právě proto, že to jednak podporuje dojem, že jQuery je nějaká speciální vlastnost JavaScriptu a jednak to vytváří nesprávné představy o použití jQuery (jako že u jQuery lze vynechat tečku a místo $(this) psát jen $this)

A poznámka, vůbec největší „pecka“ nastane, když budu používat jQuery v kombinaci s jinou knihovnou definující dolar a budu používat jQuery.noConflict().
Pak by to vypadalo:
var neco = $.foo(); // něco úplně jiného než jQuery
var $this = jQuery(this);

Takové pojmenování mi přijde celkem běžné, že záleží jen na velikosti písmen.
To ovšem nejsou názvy proměnných, ale název proměnné a název třídy.
V případě jQuery je to ještě navíc komplikované tím, že dolar je pro název proměnné neobvyklý znak, takže spoustě lidí nedojde, že $ je vlastně název proměnné.
Suta
Profil
Reaguji na Chamurappiho:
„tuto výjimku dělám pouze u jQuery. Logicky proto, že jedna proměnná může být různých typů. Object jQuery nikoliv.“
Tomuto nějak nerozumím. Nevidím mezi typy proměnných žádný významný rozdíl.
Nevyjádřil jsem se přesně. Já chápu object jQuery významově velmi odlišný. Ano, na jedné straně je to skutečně stále jediná JavaScriptová funkce, na druhé straně je ve spoustě projektů tak zásadním stavebním kamenem, že srovnání jeho funkční a strukturální podstaty s běžnými datovými typy v JavaScriptu mi přijde neporovnatelné.

Krom lidí, kteří vědí, tady pak máš masu začátečníků, kteří můžou předpokládat, že:“ (viz [#4])
Všechny uvedené argumenty jsou pouze hypotetické. A i pokud by nebyly, nevidím žádnou složitou cestu k jejich (myšleno těchto "začátečníků") rychlému prozření.

Na proměnné, která není jQuery objekt, většinou ty metody neexistují, tudíž pokus o zavolání selže a chybová konzole ti řekne docela přesně, kde jsi se seknul.
Já se ale nechci zbytečně dostávat k tomuto kroku, když jej můžu eliminovat jednoduše daleko dříve.

Odhazování teček s metodami na další řádky se také vymyká běžným konvencím.
Co je mi po běžných konvencích, pokud mi jejich porušení přinese rapidní zpřehlednění kódu.

Filozofii knihovny jQuery vystihuje věta: "Pište méně, dělejte více." Tuto filozofii lze rozdělit na tři části:
1. Hledání elementů a manipulace s nimi
2. Řetězení volání metod jQuery na skupině elementů
3. Používání obalu jQuery a implicitní iterace.

Srovnej následující dva zápisy. Asi se nemá smysl bavit o použitém způsobu, který využívá průchodu jednotlivými uzly, právě to je jedna z velkých předností jQuery, na níž staví.

$("ul.tree_expanded").addClass("active").prev("a").addClass("trigger_expanded").find("span.a").addClass("xxx").end().find("span.b").remove().end().nextMethod();

$("ul.tree_expanded")
    .addClass("active")
    .prev("a")
    .addClass("trigger_expanded")
    .find("span.a")
        .addClass("xxx")
    .end()
    .find("span.b")
        .remove()
    .end()
    .nextMethod();


Reaguji na uživatele _es:
„Použitý prefix u argumentů funkce je logicky nesmysl, pokud by tedy již v té době nebyly do uvedené metody zasílány objekty jQuery...“
Tomu nerozumiem, čo znamená „v tej dobe“?
Myšleno "v době vydání článku". Odkaz jsi již odstranil, nicméně pokud si dobře vzpomínám, byl tam uveden rok 2004.

„Mějme pravidlo, celkem jednoduché, že název proměnné s $ na začátku bude pouze objekt jQuery, nic jiného.“
Ako zabezpečíš, že funkciu f definovanú function f($x){nejaký kód} bude niekto iný volať práve s argumentom „jQuery objektom“?
Zde musím opět podotknout, že s prefixováním argumentů funkce se neztotožňuji. Jeden z možných problémů je právě ten, o kterém jsi napsal.

„prefixování jQuery objektů doporučují samotní tvůrci frameworku“
V oficiálnej dokumentácii také pravidlo používané nie je, napríklad: http://api.jquery.com/queue/#example-0
Pokud vím, tak není. Najdeš jej však na mnoha místech knihy (kterou napsal kolektiv autorů knihovny jQuery), která se podrobně věnuje především samotné filozofii stylu programování, který maximálně využívá všech hlavních výhod, které "programování za pomocí knihovny jQuery" nabízí. Viz jQuery Kuchařka programátora.


Reaguji na petu:
Osobne povazuji $ pro jquery za zajimave zprestreni, ktere ma ale dve zasadni nevyhody:
- Shodu s php. Lide se pak snazi do js kodu michat php promenne, delaji chybne apostrofy a pod.
- Shodu s jinymi frameworky. Pak se frameworky vzajemne pomlati a nekdy nefunguje ani jeden.
První bod je úplná blbost, viz moje reakce na Chamurappiho argumenty týkající se "začátečníků" a lidí, kteří "nevědí". Druhý je pak stejná blbost, jako samotné používání více frameworků, které by se mezi sebou mohly či měly mlátit.

Reaguji na Jokera:
Joker:
Navíc to může být zdrojem nepříjemných chyb, lze pak snadno zaměnit proměnnou a vlastnost jQuery objektu, viz třeba$map vs $.map.
U tvého příkladu jsou tvary "$m" a "$.m" díky tečce vizuálně dostatečně odlišné. Já osobně používám na mnoha místech hned vedle sebe oba zmíněné tvary. Skutečně stačí, abys věděl, jaký je mezi nimi rozdíl. A ano, chce-li někdo tento prefix používat, měl by to vědět.

Není to zcestné v jazyce, kde je typ proměnné určený jejím obsahem, takže v dané proměnné může být vlastně cokoliv?
Již se opakuji. Právě proto, že v proměnné může být skutečně cokoliv, v jQuery objektu máš vždy pouze "jeden" jQuery objekt, nad nímž můžeš volat pouze specifické metody, které jsou s ním spojené.

--------------------
Ještě přidám reakci na dohady v posledních několika příspěvcích ohledně prefixu u this ($this). Nebavme se stále dokola pouze o rozdílu mezi this a $this. Jelikož ukládání objektů jQuery do mezipaměti je běžnou praxí, můžeme se ve zdrojovém kódu na mnoha místech setkat s níže uvedeným kódem. Přehled, kdy pouhým okem okamžitě vidím, kde pracuji s jQuery je myslím dosti patrný.

var
    $clientX = $(".clientX"),
    $clientY = $(".clientY"),
    $pageX = $(".pageX"),
    $pageY = $(".pageY"),
    $screenX = $(".screenX"),
    $screenY = $(".screenY");

$("html").mousemove(function(event) {
    $clientX.html(event.clientX);
    $clientY.html(event.clientY);
    $pageX.html(event.pageX);
    $pageY.html(event.pageY);
    $streenX.html(event.screenX);
    $screenY.html(event.screenY);
});

Pokusím se o souhrn, připomínám, že se jedná o tvrzení, s nímž se ztotožňuji.

Znak $ nemá v jazyku JavaScript žádný zvláštní význam, webový prohlížeč s ním nakládá jako s jakýmkoliv jiným písmenem abecedy. Jednoduše se jedná o oblíbenou konvenci pro psaní kódu knihovny jQuery. Předponu $ používáme pro zdůraznění skutečnosti, že proměnná obsahuje objekt jQuery, a ne například element modelu DOM. Název proměnné $foobar totiž svým vzhledem připomíná operaci $("foobar") knihovny jQuery.

To je užitečné, zejména když chceme používat jak objekt jQuery, tak v něm uložený element modelu DOM:

var $foo = $("foo"), foo = $foo[0];

// Nyní můžeme používat objekt jQuery:
$foo.show();

// a také element modelu DOM:
var id = foo.id;

Závěrem připomenu, že svůj pohled nikomu nevnucuji, jak jsem psal hned v úvodním příspěvku, jedná se o doporučenou konvenci, která však nemusí vyhovovat každému. Nechť si každý vybere ten způsob zápisu zdrojového kódu, v němž se co nejlépe vyzná a oproti jiným způsobům mu přinese konkrétní výhody.
Chamurappi
Profil
Reaguji na Sutu:
na druhé straně je ve spoustě projektů tak zásadním stavebním kamenem
Proč by měla popularita ovlivňovat pojmenovávací konvenci? Mně takové ocenění za zásluhy pořád nedává smysl. Ve všech ohledech je to furt jen objekt.
Naopak mi přijde poněkud neergonomické systematicky prodlužovat nemalé množství názvů proměnných znakem, na jehož napsání je zapotřebí stisk dvou kláves.

Všechny uvedené argumenty jsou pouze hypotetické. A i pokud by nebyly, nevidím žádnou složitou cestu k jejich (myšleno těchto "začátečníků") rychlému prozření.
Nechce se mi dohledávat odkazy (můžu nadhodit jeden nedávný, u něhož ale není příčina jistá), věz však, že všechna popsaná zmatení jsme tu už viděli.

„Na proměnné, která není jQuery objekt, většinou ty metody neexistují, tudíž pokus o zavolání selže a chybová konzole ti řekne docela přesně, kde jsi se seknul.“
Já se ale nechci zbytečně dostávat k tomuto kroku, když jej můžu eliminovat jednoduše daleko dříve.
Nedostaneš se k němu prakticky nikdy, protože víš, co v té proměnné je, a víš, proč s ní chceš pracovat. Omlouvám se, že se opakuji, ale tento argument s joem ignorujete a mně připadá zásadní.
Šance, že budeš chtít omylem volat na nejQuery objektu jQuery funkci, je zanedbatelně malá, nehledě na to, jestli má proměnná prefix.

Srovnej následující dva zápisy.
Oba se mi nelíbí. Druhý mi přijde horší, protože řádky nezakončené středníkem, za kterými nenásleduje blok příkazů, vypadají podezřele. Musím při pohledu na něj potlačovat nacvičené reflexy.

s prefixováním argumentů funkce se neztotožňuji
A co prefixování názvů funkcí podle návratové hodnoty? To byl prapůvodní účel maďarské notace — aby programátora na první pohled praštilo do očí, že míchá neslučitelné. Jinýmy slovy: prefixVýstup = prefixKonvertor(vstup); — a pokud se prefixy neshodují, je něco špatně (ovšem jinak špatně, než aby chybu nahlásil hned kompiler).

Najdeš jej však na mnoha místech knihy (kterou napsal kolektiv autorů knihovny jQuery)“ … „Viz jQuery Kuchařka programátora.
Podotýkám, že mně je celkem jedno, kdo tu konvenci dodržuje a doporučuje.
Ale stáhnul jsem z tebou odkázané stránky zdrojové kódy ke knize a tam u kódu na bublinovou nápovědu čtu:
  if ($(this).attr('title')) {
    $tt_title = $(this).attr('title');
    $(this).attr('title', '');
  }
V kódu pro modální okna jsem zase našel tuhle perlu:
  var $IE6 = typeof document.addEventListener !== 'function' && !window.XMLHttpRequest;
O kus dál tamtéž:
  var $modal_top = '-' + Math.floor($modal_height / 2) + 'px';
  var $modal_left = '-' + Math.floor($modal_width / 2) + 'px';
Takže dolarem někdy značí atribut zjištěný pomocí jQuery, někdy boolean nijak nesouvisející s jQuery, někdy číslo zjištěné pomocí jQuery a někdy řetězec určený jako vstup do stylovací funkce jQuery. Docela guláš.
Ale znovu zdůrazňuji, že je mi jedno, co kde říkají a píšou autoři jQuery, jejich nedůslednost není vadou zde probírané konvence.

Závěrem připomenu, že svůj pohled nikomu nevnucuji, jak jsem psal hned v úvodním příspěvku, jedná se o doporučenou konvenci
Doporučení nemá do vnucování daleko, protože málokdo zváží při studiu JavaScriptu všechny možné aspekty, které tady teď rozebíráme. Samozřejmě, že nakonec všichni máme možnost svobodné volby. Povídáme si proto, abychom mohli rozhodovat způsobileji :-)


Reaguji na _es:
Pardon, poplietol som si prezývky.
Já se omlouvám, že jsem bez varování odkázal na přestárlý článek (od Pacholliniho). Pochází z doby, kdy jQuery neexistovalo, zapamatoval jsem si ho jen kvůli těm podivným dolarům.
Joker
Profil
Suta:
Já chápu object jQuery významově velmi odlišný.
Trochu mi připadá, že podstata té odlišnosti je z velké části v tom, že jQuery je in. Něco na způsob: „Podívejte, my frikulíni tady používáme jQuery!“

Srovnej následující dva zápisy.
Upřímně, oba dva mi přijdou extrémně nepřehledné a nechtěl bych takový kód udržovat.
Podobně jako Chamurappiho mě v první chvíli napadlo, že chybí středníky na konci řádků. Až potom mi došlo, že tam vlastně být nemají. U mě osobně by tohle asi byl daleko větší zdroj chyb, než chybné ne-/považování proměnné za jQuery objekt, protože občas bych tam asi ten středník automaticky udělal.

Předponu $ používáme pro zdůraznění skutečnosti, že proměnná obsahuje objekt jQuery, a ne například element modelu DOM.
Právě to mi přijde jako problém. Respektive nepřijde si vybrat jeden objekt v dokumentu a u něj používat jiné konvence programování než u ostatních.

Když shrnu můj postoj:
1. Nepřipadá mi správné pro jeden objekt v dokumentu používat jiné konvence než pro všechny ostatní.
2. Zpětnou vazbou to programátory, zejména začátečníky, vede k představě, že jQuery není normální objekt, ale něco speciálního. Ale nejen začátečníky, je dost případů, kdy různé mýty šíří i pokročilí programátoři.
3. Je to zbytečné. Nevzpomínám si, že by se mi stalo, že bych si proměnnou navrhl jako jQuery objekt a pak ji používal jako něco jiného, nebo naopak. Co se mi skutečně stalo je, že se do proměnné uložil výsledek něčeho, o kterém jsem si myslel, že to je jQuery objekt, ale ve skutečnosti nebyl.
4. Dolarový prefix (ani nic jiného) stejně nezaručí, že v proměnné bude jQuery objekt. Viz 3. bod, drtivá většina chyb nebude spočívat v tom, že bych zapomněl, co v proměnné vlastně mám, ale v tom, že tam přiřadím výsledek nějakého výrazu, který je jiného typu než očekávám. Pak jediný rozdíl je v tom, že místo „Myslel jsem si, že proměnná foo je jQuery objekt, ale není“ to bude „Myslel jsem si, že proměnná $foo je jQuery objekt, ale není“. A pokud je správně výsledek toho výrazu, budu ještě navíc muset přejmenovat tu proměnnou (abych dodržel konvenci).
_es
Profil
Suta:
Zde musím opět podotknout, že s prefixováním argumentů funkce se neztotožňuji. Jeden z možných problémů je právě ten, o kterém jsi napsal.
Ale argument funkcie je lokálna premenná tej funkcie - to je potom nejaké zvláštne pravidlo - na nejaké premenné ho aplikovať a na nejaké nie - to je asi potenciálny zdroj problémov.

Přehled, kdy pouhým okem okamžitě vidím, kde pracuji s jQuery je myslím dosti patrný.
Okom by to bolo predsa vidieť aj bez dolára - volajú sa metódy mousemove a html - to sú metódy jQuery.

Předponu $ používáme pro zdůraznění skutečnosti, že proměnná obsahuje objekt jQuery, a ne například element modelu DOM.
Ak sú ale tie „objekty jQuery“ navrhnuté a používané ako náhrada za natívne objekty DOM, tak to akosi stráca zmysel. Neviem o tom, že by bolo v móde nejako špeciálne nazývať premenné na ukladanie objektov DOM. Alebo čo názvy funkcii? Z kódu f(g()) tiež nie je vidno, s akým typom sa pracuje. Ak funkcia g vracia „objekt jQuery“ mala by byť nazvaná $g? Pripadá mi to celé ako nepraktická móda - ako obľúbenosť názvov začínajúcich na X alebo Q.
Suta
Profil
Díky za věcné komentáře.
Podle reakcí soudím, že tady nejde ani tak o jeden konkrétní způsob, který se vymyká běžným konvencím (tedy samotná myšlenka propagovat prefix dolarem pro jQuery objekt). Je to spíš o odlišném stylu programování, kdy jeden hájí striktnější postupy, na něž je zvyklý, a jiný se nebojí od zaběhnutého způsobu odchýlit.

Jako příklad uvedu řetězení, které jsem uváděl. Jak Chamurappi, tak Joker jsou zmateni při pohledu na uvedený zápis, kde řádek není ukončený středníkem a přijde jim nepřehledný, snad více, než ten na jednom řádku. Přitom mě přijde naopak velmi! přehledný. Zvykl jsem si na něj, a tedy vím, že na konci řádku středník nutně očekávat nemusím. Pokud vím, tak javascript používá středník pro ukončení příkazu, odsazení řádku pak může sloužit jako formátovací nástroj.

Musím souhlasit s tím, že velká část je určitá popularizace jQuery. Pokud by zde byl pouze tento fakt, tuto konvenci bych nepoužíval.
Joker
Profil
Suta:
Podle reakcí soudím, že tady nejde ani tak o jeden konkrétní způsob, který se vymyká běžným konvencím (tedy samotná myšlenka propagovat prefix dolarem pro jQuery objekt). Je to spíš o odlišném stylu programování, kdy jeden hájí striktnější postupy, na něž je zvyklý, a jiný se nebojí od zaběhnutého způsobu odchýlit.
Já bych to řekl právě naopak.
Co mi přijde divné je ta myšlenka něčím prefixovat instance konkrétního objektu.
Jako kdybych řekl, že všechny proměnné kde očekávám že budou čísla budou mít prefix třeba „n_“. Přece čísla jsou základní prvek programů, jsou velmi často používaná, mají specifický způsob zacházení, atd. atd. Ale nic jiného, logické hodnoty, řetězce, objekty, atd. bych měl pořád stejně. Prostě to je divné.

Jak Chamurappi, tak Joker jsou zmateni při pohledu na uvedený zápis, kde řádek není ukončený středníkem a přijde jim nepřehledný
Poznámka, ty středníky nejsou jediný, ani hlavní, důvod, proč mi to přijde extrémně nepřehledné.
Hlavní důvod je to, že se v jednom příkazu kombinuje vyhledávání prvků dokumentu a manipulace s nimi a ještě navíc se během toho příkazu, jestli dobře počítám, pracuje se šesti různými sadami elementů.
Například já jsem profesionální programátor, který má určité zkušenosti s jQuery, byť bych se neprohlásil za odborníka na jQuery (ale o to právě jde). Přesto pro mě nebylo jednoduché rozeznat, co ten příkaz vlastně udělá.
Uvedený kód je špatně udržovatelný, protože je nesrozumitelný.
Jasně, kdysi jsem taky měl myšlenku, že když se mi danou funkčnost podaří dostat na méně řádků kódu, jsem lepší programátor. A docílit toho, že jeden monstrózní příkaz (nejlépe nacpaný do jednoho řádku) vyřešil 50 různých věcí jsem považoval za programátorsky geniální řešení.
Pak jsem pochopil, že je to blbost.

Čili pokud to motto jQuery „Write less, do more“ znamená splácat co nejvíc různých operací do jednoho příkazu, do kterého se pak všichni budou bát sáhnout aby něco nerozbili, tak to je podle mého názoru špatný přístup.
Suta
Profil
Joker:
Shodu nenajdeme, jelikož se skutečně jedná o rozdílný přístup k samotné struktuře zdrojového kódu.

Vycházím z vlastní praxe, kde mám nejeden projekt postaven následujícím způsobem (osvědčil se mi také styl komentářů nad každým větším blokem kódu, než-li komentovat jednotlivé řádky):

/**
Popis bloku kódu
...
...
*/

$("ul.tree_expanded")
    .addClass("active")
    .prev("a")
    .addClass("trigger_expanded")
    .find("span.a")
        .addClass("xxx")
    .end()
    .find("span.b")
        .remove()
    .end()
    .nextMethod();

Pro mě osobně je uvedený způsob skutečně:

1. Krásně přehledný
2. Velmi dobře udržovatelný
3. Efektivní
4. Slučitelný s efektivitou jQuery motta „Write less, do more“

Tuším, že ty nebudeš souhlasit s jediným bodem. Chápu a respektuji.
shaggy
Profil
Suta:
1. Krásně přehledný
Ani by som nepovedal. Ak to po tebe preberie menej skúsený programátor, tak si napr. bude myslieť, že remove() na riadku 15 patrí k odkazu, ktorý sa nachádza pred ul.tree_expanded.

2. Velmi dobře udržovatelný
Ani toto nie je pravda. Môže za to použitie metódy end(), ktorú sám moc nepoznám a po prečítaní dokumentácie robí presne niečo iné, ako by som od nej očakával.

Je vidieť, že potrebuješ robíť s ul.tree_expanded, resp. s odkazom, ktorý mu predchádza, na viacerých miestach (čoho dôkazom je použitie end()).
A teraz sa zamysli, ktoré volanie je efektívnejšie. Môj kód:
var myTree = $("ul.tree_expanded");
var myTreeAnchor = myTree.prev("a");
...
myTree.addClass("active");
myTreeAnchor.addClass("trigger_expanded");
myTreeAnchor.find("span.a").addClass("xxx");
myTreeAnchor.find("span.b").remove();
myTreeAnchor.nextMethod();

alebo tvoj kód?
Mám pocit, že som napísal menej riadkov, tým pádom som sa držal tvojho obľúbeného hesla, však? ;-)
Joker
Profil
Suta:
Odchýlili jsme se od tématu, nicméně:
1. Krásně přehledný
Přehledný?! Jak jsem psal, trvalo mi docela dlouho rozklíčovat, co ten kód vlastně udělá. Na metodu end jsem se taky musel podívat do manuálu, jako shaggy. A doteď si nejsem úplně jistý, co vlastně bude výsledkem volání remove() na řádku 15.
Taky mi přijde nevhodné, aby jeden příkaz dělal pět nesouvisejících věcí.

2. Velmi dobře udržovatelný
Není, protože se vsadím, že když si k tomu sedne jiný programátor, bude na to brejlit tak jako já. A vsadím se, že nemálo programátorů z různých důvodů skončí tím, že to smaže a napíše znovu podle aktuálních požadavků.

3. Efektivní
Oproti rozdělenému kódu to bude pomalejší o ta dvě volání end().

4. Slučitelný s efektivitou jQuery motta ‚Write less, do more‘
Mno, kód co napsal shaggy mi přijde přehlednější, efektivnější a je kratší.

Prostě podle mě splácat to do jednoho příkazu nemá vůbec žádnou výhodu, naopak jen samé nevýhody.
« 1 2 3 »

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: