RecomandariThis is a featured page

Vom formula, in continuare, o serie de sfaturi (reguli) privind scrierea judicioasa a programelor JavaScript. Suplimentar, vom mentiona diverse biblioteci utile, modalitati de testare a codului si altele de rulare a scriptu­rilor JavaScript. .


1. Aspecte importante privind filosofia limbajului

Trebuie retinute in primul rand urmatoarele aspecte :
· totul in JavaScript este considerat obiect, inclusiv functiile
· orice obiect este intotdeauna mutabil - poate fi alterat oricand (chiar si obiectele predefinite)
· operatorul"." este echivalent cu dereferentierea; astfel, constructia obiect. proprietate este similara cu obiect ["proprietate"]
· operatorul new creeaza obiecte apartinand clasei specificate de functia constructor
· functiile ascund orice este definit in interiorul lor
· cuvantul-cheie this este relativ la contextul executiei, si nu la cel al declararii
· valoarea proprietatii prototype poate fi modificata oricand

In al doilea rand, un dezvoltator de aplicatii trebuie sa adopte sau sa initieze o metodologie de redactare a codului. Astfel, programele trebuie modularizate, divizate in fisiere separate care sa fie focalizate asupra unor sarcini precise. Este necesara adoptarea unei conventii de scriere a codului, inclusiv a comentariilor, atat de utile.
Inainte de a concepe programul propriu-zis, se poate incepe cu plasarea comentariilor, conform pasilor importanti ai algoritmului de imple­mentat.

Un scenariu posibil este cel in care initial avem :
//cream un tablou de stocare a adreselor Web
// pe care le preluam din document
...
// determinam elementele <a>
...
//baleiem elementele <a> gasite
...// preluam URL-urile,
//adica valorile atributului href

Ulterior scrierii liniilor de cod, fragmentul de program poate avea forma:

//cream un tablou de stocare a adreselor Web
// pe care le preluam din document
var adrese = [];
//determinam elementele <a>
var legaturi = document.getElementsByTagName ("a")
// baleiem elementele <a> gasite
for ( var i = 0; i < legaturi.length; i++) (
// preluam URL-urile,
// adica valorile atributului href
adrese.push (legaturi[i] .getAttribute("href"));
}

Pentru o procesare eficienta a datelor XHTML/XML, elementele care prezinta interes trebuie identificate unic via atributul id si apoi referite simplu cu getElementById ( ). De asemenea, se poate folosi si atributul class pentru a opera oricand modifidiri de stil. Desigur, paginile Web si documentele XML ar trebui sa fie rational construitc, prezentand o structura clara. Scripturile nu trebuie sa se bazeze pe structuri precise de marcaj, ci este necesar sa fie dezvoltate intr-o maniera cat mai generica. Acest aspect va contribui la cresterea flexibilitatii codului.

2. Utilizarea bibliotecilor JavaScript

Biblioteci reprezentative
Atunci cand prelucrarile sunt mai complexe, cea mai buna solutie este sa se recurga la o biblioteca ]avaScript specifica. Recomandam folosirea si aprofundarea bibliotecilor :
· Dojo desemneaza un complex toolkit de dezvoltare, oferind pe baza unui sistem de pachete (module), fiecare identificat unic de un spatiu de nume, facilitati pentru realizarea unor interactiuni Web conduse de evenimente. Desigur, exista suport si pentru realizarea altor sarcini. Suplimentar, pune la dispozipe.un sistem de creare (inclusiv decla­rativa) a componentelor Web de interfata (widget-uri) si un API referitor la realizarea unor elemente de grafica 2D, independenta de browser.
Pentru amanunte, exemple si documentatii, vizitati adresa http://dojotoolkit.org
· Prototype reprezinta una dintre cele mai populare biblioteci JavaScript, fiind bazata pe paradigma obiectuala si oferind facilitati in special pentru procesari XML. A fost dezvoltata initial pentru mediul Ruby on Rails, din care sunt inspirate unele caracteristici ale sale. Biblioteca Prototype si documentatia aferenta sunt disponibile la adresa http://www.prototypejs.org/
· Script.aculo.us este o extensie a bibliotecii Prototype, mai ales in directia realizari unor efecte vizuale - multe dintre ele, bazate pe animatie si a sabloanelor de interactiune cu utilizatorul (e.g., autocompletare, editare dinamica, drag & drop etc.)
Se faciliteaza, de asemenea, manipu­larea arborilor DOM.
Detalii la http://script.aculo.us/
· Yahoo! User Interface (YUI) reprezinta o biblioteca atent testata, focallzata asupra interactiunii cu utilizatorul;
de exemplu, pot fi folosite diverse controale (meniuri, vizualizari arborescente, calendare etc.).
Situl YUI este disponibil la adresa http://developer.yahoo.com/yui/
· MochiKit faciliteaza scrierea - independenta de navigator - a diverselor scripturi, oferind module specializate pentru indeplinirea de activitati de baza (MochiKit.Base), a procesarilor DOM (MochiKit.DOM), a trans­ferurilor asincrone de date (MochiKit.Async), a tratarii evenimentelor (MochiKit.Signal) sau a realizarii de efecte vizuale (MochiKit. Visual).
Detalii si documentatii sunt disponibile la adresa http://mochikit.com/
· jQuery este conceputa pe un mecanism de extensii (plugins), API-ul oferit fiind bazat pe tehnologii precum CSS3 sau XPath, facilitand selectia sofisticata a nodurilor – vizitati http://visualjquery.com/
· Microsoft Ajax Library reprezinta o biblioteca oferita de Microsoft pentru facilitarea implementarii la nivel de client a aplicatiilor bazate pe suita de tehnologii AJAX. Desi face parte din extensia AJAX ASP.NET (ex-Atlas), poate fi utilizata liber si independent de mediul .NET.
Pentru exemplificari si documentatii, puteti consulta http://ajax.asp.net/

Exemplificari

Vom ilustra in continuare o serie de facilitatzi oferite de bibliotecile amintite mai sus.
Asfel realizarea unei cererei asincrone in stilul AJAX poate fi mult simplificata de YUI:

// stabileste functiile ce vor trata
//situatiile de succes/esec al transferului
var tratament = {
success: function (obiect) {
// proceseaza obiect.responseText
},
failure: function (obiect)
// trateaza esecul
}
}
// formulam cererea GET in mod asincron YAHOO.util.asyncRequest("GET","http://www.pinguin.info/serviciu/", tratament, null);

Pentru actualizarea periodica a continutului preluat de pe server, vom putea recurge la urmatorul cod JavaScript, bazat pe biblioteca Prototype:

/* cod JavaScript folosit pentru actualizarea continutului in stilul AJAX (se bazeaza pe Prototype)
*/

// linii executate la incarcarea documentului
window.onload = function ( ) {
var executant;
//numarul de actualizari observate
var contor = 0;
if ($("numere")) {
// instantiem un executant periodic
executant = new PeriodicalExecuter( function() (
//continutul va fi actualizat cu datele primite
//de pe server de la aleatoriu.php
new Ajax.Updater("numere", "aleatoriu.php",
{
//actiunea de inserare a continutului
//intr-un element <div>
insertion: function (obj; txt) {
$ ("numere") .innerHTML += txt + " "
} ,

// actiunea de finalizare a actualizarii
onComplete: function (request)
contor++
// informam utilizatorul cate actualizari
// s-au efectuat
$ ("mesaj") .innerHTML ="Actualizarea cu numarul " + contor
}
}
}, 7); // o periodicitate de 7 sec.
}
} ;


Constructia $ ( ) este 0 prescurtare pentru getElementById ( ) . Com­ponenta de actualizare Ajax.Updater ( ) are asociate doua comporta­mente - unul referitor la inserarea de valori, celalalt la finalizarea unei actualizari. Codul va altera continutul paginii Web in care va rula scriptul. Periodicitatea este realizata cu ajutorul unui alt obiect Prototype: PeriodicalExecuter.
Documentul XHTML are urmatoarea structura (fisierul actualizator. js include tocmai codul precizat anterior):

<html>
<head>
<title>Actualizari periodice ale continutului</title>
<script src="/prototype.js"
type="text/javascript"></script>
<script src="/actualizator.js"
type="text/javascript"></script>
</head>
<body>
<p>Numerele generate, preluate de pe server:
<span id="numere"></span>
</p>
<div id="mesaj"></div>
</body>
</html>

Datele periodic actualizate vor fi furnizate de un program PHP. Inspectarea - e.g., cererea realizata, raspunsul primit, valorile timpilor de transfer etc. - se poate realiza tot prin intermediul extensiei Firebug

3. Testarea programelor

Codul trebuie dezvoltat incremental, pastrand intotdeauna doua variante:

· cea de lucru – working code (posibil “incarcata” cu bug-uri si facilitati inca netestate suficient; eventual, incluzand mai multe comentarii ‘interne’)
· cea de exploatare – production code (reprezinta liniile folosite efectiv, programele trebuind sa fie cat mai sigure si eficiente posibil).

O buna practica implica sa testam constant scripturile si sa ne intrebam care va fi comportamentul aplicatiei cand suportul pentru JavaScript nu exista sau este inhibat de catre utilizator si cand metodele utilizate nu sunt disponibile in mediul de executie considerat. Astfel, inainte de a utiliza o anumita tehnologie (JavaScript, cookie-uri, DOM, AJAX), trebuie sa testam daca exista support pentru aceasta.
Un alt aspect important este cel referitor la‘scurgerile de memorie’ (memory leaks), mai exact la fenomenul de ‘poluare’ a memoriei de catre obiectele ce nu sunt dealocate corespunzator – navigatorul Internet Explorer este recunoscut drept cel mai ‘neglijent’.
Erorile comune de programare pot fi detectate in maniera statica (fara a se rula codul) de catre instrumentul JSLint, disponibil online la www.jslint.com. Acest program este integral conceput in JavaScript.
Pentru a testa executia codului conceput, putem crea scenarii de test (test cases) si, mai mult, putem specifica unitati de testare (test units) pe baza cadrului general XUnit – detalii la http://xprogramming.com/software.htm. Pentru JavaScript, avem la dispozitie instrumentul JsUnit, oferit in regim open source de situl www.jsunit.net. Acest instrument este scris integral in JavaScript si ofera suport pentru depanare de cod. De asemenea, testele efectuate pot fi jurnalizate, astfel incat erorile detectate sa poata fi usor analizate ulterior prin consultarea unui document XML.
Suport pentru depanare, inspectie de variabile si rulare incrementala ofera si extensia Firebug, deja amintita pe parcursul acestui capitol. Cu ajutorul obiectului console, putem afisa la consola Firebug diverse tipuri de mesaje via metodele:

console.debug (‘Informatii privind depanarea’);
console.warn (‘Mesaj de avertisment’);
console.eroare (‘Aparitia unei erori’);
console.info (‘Un mesaj de informare’);

Folosind acestea, nu vom eluda regula prin care se stipuleaza ca erorile sa nu fie raportate utilizatorului final.
Un alt instrument care poate prezenta interes mai ales in ceea ce preveste testarea interactiunii cu utilizatorului este Selenium. Aceasta extensie Firefox simuleaza actiunile utilizatorului si le poate ‘inregistra’ la nivel de navigator. Pentru detalii, vizitati http://www.openqa.org/selenium-ide/.
Atunci cand sunt necesare procesari XML, programele trebuie sa verifice daca exista suport din partea mediului de executie – de exemplu, navigatoarele mai vechi nu implementeaza intreg modelul DOM. Inainte de folosirea unor metode, putem detecta faptul ca nu sunt disponibile:
if (!document.getElementById ║
!document.getElementByTagName) {
return; / / nu exista suport
}

Aceeasi observatie este valabila pentru obiectul HMLHttpRequest.
De asemenea, trebuie sa scriem codul pe cat posibil mai independent de un anumit browser, fara a abuza de diverse facilitati ‘exotice’ – in timp, mentenanta codului va scadea, iar utilizatorii ar putea avea o experienta precara in cadrul alicatiei dezvoltate.
Trebuie sa mentionam si faptul ca pentru Firefox putem crea un profil-utilizator special pe care sa-l folosim in activitatea de depanare a codului (mai ales in ceea ce priveste extensiile dezvoltate). Ceea ce trebuie sa facem este sa executam Firefox din linia de comanda, adaugand optiunea – profilemanager. Odata stabilit numele noului profil, putem rula navigatorul prin firefox –P profil.
Din moment ce ati dezvoltat programe folositoare, publicati-le pe Web, solicitati feedback din partea altor utilizatori / programatori, creati o comunitate de interes si constituiti un API consistent punand la dispozitie functionalitatile implementate.


4. Alte contexte de utilizare a limbajului JavaScript

Poate v-ati intrebat daca nu exista posibilitatea de a ingloba interpretorul JavaScript in alte aplicatii, concepute in diverese limbaje.
Fundatia Mozilla pune la dispozitie SpiderMonkey, un modul scris in limbajul C care poate fi inglobat ca biblioteca dinamica in diverse programe. Sursele, inclusiv documentatia, sunt disponibile liber la adresa http://www.mozilla.org/js/spidermonkey.
Dezvoltatorii Java au oportunitatea incorporarii scripturilor JavaScript via Rhino – http://www.mozilla.org/rhino/.
In aceasta maniera, programele JavaScript pot fi utilizate si in cadrul aplicatiilor de sine statatoare (de exemplu, cele desktop) sau pot rula chiar la nivel de server.
De asemenea, un dialect JavaScript este prezent in cadrul Adobe Flash este vorba, desigur, de ActionScript. Folosind platformele Flex si /
sau AIR, exista posibilitatea dezvoltarii facile de aplicatii Web expunand o interfata bazata pe componente Flash specificate declarativ via limbajul MXML.


anomistu
anomistu
Latest page update: made by anomistu , Jul 1 2008, 6:19 PM EDT (about this update About This Update anomistu Edited by anomistu

1828 words added

view changes

- complete history)
Keyword tags: None
More Info: links to this page
There are no threads for this page.  Be the first to start a new thread.