duminică, 20 mai 2007

Clase sau funcţii, marea dilemă...

Dacă te întrebi la ce să te mai chinuieşti cu o clasă când poţi face un include cu o grămadă de funcţii, încerc să-ţi dau câteva motive în favoarea clasei:

  1. O clasă este o structură care poate încapsula uşor variabile (adică proprietăţi) şi funcţii (adică metode). Diferenţa dintre un fişier de include cu variabile şi proprietăţi este că nu poţi crea două "instanţe" ale funcţiilor şi metodelor. Mai precis, să zicem că am o clasă db, care se ocupă cu conectare şi operaţii asupra unei baze de date. În proiectul meu trebuie să lucrez la un moment dat cu două baze de date, mai precis am nevoie să fac o copie a unei tabele, aşa că dintr-o bază fac selecţii şi în cealaltă fac inserări ale rezultatelor. Având o clasă, chestia asta e foarte uşor de făcut. Doar creez două obiecte de tip db cu proprietăţile corespunzătoare fiecăruia (host, user, db, pass, conexiune persistentă sau nu etc.). Apoi pot să fac:

    $continutTabel=$db1->select("tblUseri","nVarsta, cUsername");
    $rezultate=$db1->arrayAsociativ($continutTabel);
    for($i=0;$i<count($rezultate);$i++)
    $db2->insert("tblUseri","nVarsta, cUsername", array($rezultate[$i]["nVarsta"], $rezultate[$i]["cUsername"]));


    Şi aşa am făcut o copie de conţinut de la o bază de date la alta. Treaba se schimbă dacă aş fi avut doar un include cu nişte funcţii şi variabile (însă nu devine prea complicat dacă transmiţi ca parametru la orice query link-ul corespunzător la baza de date). Exemplul nu e foarte concludent, dar sunt cazuri în care folosirea claselor e mult mai potrivită. O să mă mai gândesc la nişte exemple.

  2. Un motiv simplu: cod mai structurat şi mai lizibil. În plus, clasele au capacitatea de moştenire, ceea ce poate fi "handy" uneori. Deci, dacă am o clasă de bază, pot crea o altă clasă care să moştenească proprietăţile şi metodele clasei de bază şi să le extindă cu noi metode şi proprietăţi.

  3. Este mult mai simplu să transmiţi proprietăţile unui obiect oarecare prin sesiune decât să salvezi o grămadă de variabile pe sesiune. Folosind codul $_SESSION["myobject"]=serialize($obiect); unde $obiect e o instanţă a unei clase, proprietăţile acestui obiect la momentul dat sunt salvate în variabila de sesiune myobject. Apoi, având această variabilă, la o schimbare de pagină sau refresh, pot să fac $obiect=unserialize($_SESSION["myobject"]); ceea ce îmi reconstruieşte obiectul iniţial cu proprietăţile pe care le-am salvat. Acum, dacă în include-ul meu aveam 50 de variabile de care am nevoie, ar trebui să le salvez pe toate în sesiune, rând pe rând (doar dacă nu le am într-un array, dar atunci codul deja devine mai greoi şi mai ilizibil în include), ceea ce e muncă de sisif!

  4. Este mult mai uşor să grupezi funcţii şi metode sub un anumit nume. Să luăm iar exemplul cu clasa db. La fiecare apel de functie aş avea $db-> ca prefix. Asta mă ajută să înţeleg uşor despre ce fel de operaţie e vorba (o operaţie asupra bazei de date) atunci când citesc codul şi să ştiu în ce clasă să mă uit ca să găsesc codul. Pe când, dacă vreau să fac cod cât de cât lizibil într-un include, aş avea nume de metode gen db_select, db_insert etc. La clase nu mai trebuie să mă mai ocup eu de astea, pentru că nu e nevoie.


Pe scurt, uite care-s avantajele claselor: capacitatea de a crea mai multe instanţe, fiecare cu proprietăţile ei; capacitate de moştenire; cod mai lizibil şi mai structurat; capacitate de (de)serializare a obiectului; funcţia constructor care se apelează automat la crearea obiectului, fără să o mai apelezi matale (ştim noi că programatorii sunt mai leneşi).

Sper că ai înţeles acum :)

Niciun comentariu: