Professional Documents
Culture Documents
transparente pentru utilizator. "cest aspect este 0otarator in cazul proiectelor complexe, de dimensiuni mari, care nu pot fi realizate decat cu ajutorul unor ec0ipe de programatori. "plicatiile pot fi impartite cu usurinta in module, astfel ca cel ce dez olta un modul nu trebuie sa cunoasca detaliile de implementare a celorlalte module. !onsecintele imediate sunt scaderea timpului de dez oltare a aplicatiilor, simplificarea acti itatii de intretinere a modulelor, si cresterea calitatii programelor. Pri ind limbajele orientate obiect ca o e olutie a limbajelor structurate, constatam ca notiunea de clasa este o generalizare a notiunii de structura de date. 7 clasa descrie un ansamblu de obiecte similare. 6n obiect este asadar o ariabila de un anumit tip clasa. In mod uzual, se foloseste exprimarea ca un obiect este instantierea unei clase. 6n alt concept important in cadrul programarii orientate obiect este cel de polimor,ism, care se refera la posibilitatea de a opera cu mai multe ariante ale unei functii, care efectueaza o anumita operatie in mod specific pentru anume obiecte. 8 olutia si ierar0izarea claselor de obiecte se bazeaza pe conceptul de mostenire. "stfel, procedeul numit deri/are permite definirea unei noi clase &clasa deri/ata) pornind de la o clasa existenta &clasa de ba+a), prin adaugarea de noi date si metode, e entual redefinirea unor metode. !lasa deri ata mosteneste de la clasa de baza structura de date si metodele aferente. 8ste posibila totodata si deri area unei clase din mai multe clase de baza, aceasta operatie fiind denumita mostenire multipla. "sadar, dintr-o clasa de baza pot fi deri ate mai multe clase si fiecare clasa deri ata poate de eni la randul ei o clasa de baza pentru alte clase deri ate. -e poate astfel realiza o ierarhie de clase, care sa modeleze sisteme complexe. !onstruirea ierar0iei de clase constituie acti itatea fundamentala de realizare a unei aplicatii orientate obiect, reprezentand in fapt faza de proiectare a respecti ului sistem.
. Clase
.1. !eclararea claselor
7 sintaxa simplificata a declararii unei clase este urmatoarea2 class 3ume!lasa 9 ... declaratii ariabile member ... declaratii functii member ... : %upa cum se poate obser a din aceasta alcatuire a declaratiei, clasa este asemanatoare cu o structura din limbajul !, dar care poate a ea in componenta sa membri atat de tip ariabila cat si de tip functie. "sa cum spuneam si in capitolul precedent, pentru datele din interiorul clasei se utilizeaza de obicei termenul de date membre, iar
pentru functii denumirea de ,unctii membre sau metode. 7 clasa permite incapsularea in interiorul sau a datelor si a codului. Intocmai ca in limbajul !, pentru a putea utiliza efecti un tip de date &in cazul de fata o clasa), trebuie sa definim o ariabila de acel tip. Intr-un mod similar declaratiei int i0 putem scrie2 NumeClasa /ariabila ;om considera de acum incolo ca /ariabila poarta numele de obiect. 8xprimarea uzuala este ca un obiect este instantierea unei clase.
70 unsigned Point::8etX() 3 return -0 7 unsigned Point::8et9() 3 return 50 7 /oid Point:: etX(unsigned X) 3 - . X0 7 /oid Point:: et9(unsigned 9) 3 5 . 90 0 7 "m folosit un operator nou, specific !11, ::, numit operator de re+olutie, numit si operator de acces sau de domeniu. 8l permite accesul la un identificator, dintr-un bloc in care acesta nu este izibil datorita unei alte declaratii locale. 6n exemplu de folosire este urmatorul2 c0ar =sir > # ariabila globala#$ oid functie&) 9 c0ar =sir > # ariabila locala#$ printf&#?s@n#, 22sir)$ AA afiseaza ariabila globala printf&#?s@n#, sir)$ AA afiseaza ariabila locala : Pentru definitiile functiilor membre aflate in afara declaratiei clasei este necesara specificarea numelui clasei urmat de acest operator, indicand faptul ca functia are acelasi domeniu cu declaratia clasei respecti e si este membra a ei, desi este definita in afara declaratiei.
%esi acesti doi operatori ofera metode flexibile de gestionare a obiectelor, exista situatii in care aceasta nu rezol a toate problemele &de exemplu obiectele care necesita alocarea unor ariabile dinamice in momentul crearii lor). %e aceea pentru crearea si distrugerea obiectelor in !11 se folosesc niste functii membre speciale, numite constructori si destructori. Constructorul este apelat automat la instantierea unei clase, fie ea statica sau dinamica. Destructorul este apelat automat la eliminarea unui obiect, la inc0eierea timpului de iata in cazul static, sau la apelul unui delete in cazul dinamic. %in punct de edere cronologic, constructorul este apelat dupa alocarea memoriei necesare, deci in faza finala a crearii obiectului, iar destructorul inaintea eliberarii memoriei aferente, deci in faza initiala a distrugerii sale. !onstructorii si destructorii se declara si se definesc similar cu celelalte functii membre, dar prezinta o serie de caracteristici specifice2 - numele lor coincide cu numele clasei careia ii apartin$ destructorii se disting de constructori prin faptul ca numele lor este precedat de caracterul E - nu pot returna nici un rezultat - nu se pot utiliza pointeri catre constructori sau destructori - constructorii pot a ea parametri, destructorii insa nu. 6n constructor fara parametri poarta denumirea de constructor implicit. %e remarcat este faptul ca in cazul in care o clasa nu dispune de constructori sau destructori, compilatorul de !11 genereaza automat un constructor respecti destructor implicit. -a completam in continuare clasa Point cu un constructor si un destructor2 Point::Point() FF constructor implicit 3 - . >0 5 . >0 7 Point::Point(unsigned X4 unsigned 9) 3 - . X0 5 . 90 7 Point::EPoint() 3 7 "ti remarcat cu aceasta ocazie modul de marcare a comentariilor in !112 tot ce se afla dupa caracterul FF este considerat comentariu. %e notat este faptul ca definitii de forma Point p0
sau Point 6p . ne' Point()0 duc la apelarea constructorului implicit. 7 intrebare care poate apare este moti ul pentru care am realizat functiile 8etX()4 8et9()4 etX()4 et9(), cand puteam utiliza direct ariabilele membru - si 5. %eoarece una din regulile programarii !11, adoptata in general de catre specialisti, este de a proteja ariabilele membru & eti afla in capitolul urmator cum), acestea neputand fi accesate decat prin intermediul unor functii, care au rolul de metode de prelucrare a datelor incapsulate in interiorul clasei.
in continuare accesibile in clasa deri ata, deci caracteristicile clasei de baza nu sunt pierdute. %intr-o clasa de baza pot fi deri ate mai multe clase si fiecare clasa deri ata poate ser i mai departe ca baza pentru alte clase deri ate. -e poate astfel realiza o ierarhie de clase, care sa modeleze adec at sisteme complexe. Pornind de la clase simple si generale, fiecare ni el al ierar0iei acumuleaza caracteristicile claselor #parinte# si le adauga un anumit grad de specializare. Mai mult decat atat, in !11 este posibil ca o clasa sa mosteneasca simultan proprietatile mai multor clase, procedura numita mostenire multipla. !onstruirea ierar0iei de clase reprezinta acti itatea fundamentala de realizare a unei aplicatii orientate obiect, reprezentand in fapt faza de proiectare a respecti ului sistem. -intaxa simplificata a deri arii este2 class NumeClasaDeri/ata : NumeClasaDeBa+a In continuare om deri a din clasa Point o clasa specializata, Crap0icPoint, care a #sti# sa deseneze efecti punctul pe ecran2 class 8raphicPoint : Point 3 unsigned color0 8raphicPoint(unsigned X4 unsigned 94 unsigned Color)0 E8raphicPoint()0 /oid Dra'()0 /oid etX(unsigned X)0 /oid et9(unsigned 9)0 70 8raphicPoint::8raphicPoint(unsigned X4 unsigned 94 unsigned Color) : Point(X4 9) 3 color . Color0 7 8raphicPoint::E8raphicPoint() 3 7 8raphicPoint::Dra'() 3 FF 111 FF apelare primiti/e 7
gra,ice
pentru
desenarea
e,ecti/a
punctului
8raphicPoint:: etX(unsigned X 3 Point:: etX()0 FF apelul ,unctiei etX() apartinand clasei de ba+a Dra'()0 7 8raphicPoint:: et9(unsigned 9) 3 Point:: et9()0 Dra'()0 7 -e obser a din exemplul de mai sus ca am adaugat o ariabila noua fata de clasa Point, color, pentru a putea memora culoarea cu care se face desenarea punctului. %e asemenea, am suprascris constructorul si destructorul clasei parinte. In constructorul deri at, am apelat constructorul original folosind constructia2 ClasaDeri/ata::ClasaDeri/ata() : ClasaDeBa+a() In clasa 8raphicPoint am adaugat o functie membra noua, Dra'(), care deseneaza efecti punctul pe ecran. "m suprascris functiile -etD&) si -etE&), apeland in ambele functiile originale, utilizand sintaxa2 ClasaDeBa+a::2unctie!embra() apeland apoi functia de desenare, Dra'(). Fegulile de functionare ale constructorilor si destructorilor, descrise in paragraful precedent, raman alabile si in cazul claselor deri ate, cu doua obser atii pri ind ordinea de apelare a acestora2 - la instantierea clasei deri ate, se apeleaza mai intai constructorul clasei de baza, apoi se apeleaza propriul constructor. - la distrugerea unui obiect al unei clase deri ate, este apelat mai intai propriul constructor, si apoi destructorul clasei de baza &deci in ordine in ersa crearii obiectului).
"sadar, sintaxa declaratiei unei clase deri ate incluzand controlul accesului este2 class NumeClasaDeri/ata : peci,icator#cces NumeClasaDeBa+a unde -pecificator"cces poate fi public sau pri/ate. -e obser a ca pentru a oferi clasei deri ate acces la un membru al clasei de baza, acesta trebuie declarat protected sau public. Pentru respectarea principiului incapsularii datelor, datele membre pentru care se ofera acces claselor deri ate se declara in clasa de baza cu atributul protected. %e asemenea, pentru a conser a dreptul de acces in urma deri arii, se utilizeaza deri area public. "ccesul poate fi stopat pe orice ni el ar ierar0iei de clase printr-o deri are pri ate. -tabilirea atributelor de acces ale membrilor unei clase, precum si ale deri arilor, trebuie sa se faca astfel incat dez oltarea ierar0iei de clase fara a afecta incapsularea datelor. -a reluam in continuare exemplul din capitolul precedent, completat cu specificatori de acces2 class Point 3 protected: unsigned -4 50 public: Point()0 Point(unsigned X4 unsigned 9)0 EPoint()0 unsigned long #rie()0 unsigned 8etX()0 unsigned 8et9()0 /oid etX(unsigned X)0 /oid et9(unsigned 9)0 70 class 8raphicPoint : public Point 3 unsigned color0 public: 8raphicPoint(unsigned X4 unsigned 94 unsigned Color)0 E8raphicPoint()0 /oid Dra'()0 /oid etX(unsigned X)0 /oid et9(unsigned 9)0 70 -e obser a ca ariabilele membru x si < sunt declarate protected, asa incat or fi izibile si or a ea acelasi atribut in clasa Crap0icPoint &desi nu sunt utilizate). In mod
normal, x si < ar trebui sa fie declarati pri ate, intrucat nu sunt utilizati decat in interiorul clasei Point. Gunctiile din Crap0icPoint nu acceseaza acesti doi membri direct, ci prin intermediul metodelor publice de accesare a lor oferite de clasa Point. %e notat este faptul ca implicit, daca nu este utilizat nici un specificator de acces, membrii sunt considerati pri ate. /oid main() 3 Point 6p0 p . ne' Point0 p$;- . <0 FF operatie imposibila: - este membru pri/at p$;5 . G0 FF operatie imposibila: 5 este membru pri/at p$; etX(<)0 FF corect: acces la /ariabila - prin intermediul ,unctiei etX() p$; et9(G)0 print,(?#ria . @dAn?4 p$;#ria())0 delete p0 7 "m demonstrat prin acest exemplu de program ca din exteriorul unei clase nu pot fi accesate datele membre pri ate sau protected.
Iata si un exemplu2
class Point 3 ,riend unsigned long Calcul(unsigned X4 unsigned 9)0 public: ,riend unsigned long #ltaClasa::Calcul(unsigned X4 unsigned 9)0 111 70 unsigned long Calcul(unsigned X4 unsigned 9) 3 return X 6 9 F %0 7 unsigned long #ltaClasa::Calcul(unsigned X4 unsigned 9) 3 111 7 %upa cum se ede din exemplul de mai sus, nu are nici o importanta in cadrul carei sectiuni este declarata functia prietena. Clasele prietene sunt clase care au acces la membrii pri ati ai unei clase. -intaxa declararii unei clase prietene este2 ,riend class NumeClasaPrietena Iata si un exemplu2 class PrimaClasa 3 111 70 class #DouaClasa 3 111 ,riend class PrimaClasa0 70 In exemplul de mai sus, clasa Prima!lasa are acces la membrii pri ati ai clasei "%oua!lasa. Important este sa remarcam ca relatia de prietenie nu este tran+iti/a. %aca o clasa " este prietena a clasei ,, si clasa , este prietena a unei clase !, aceasta nu inseamna ca
" este prietena a clasei !. %e asemenea, proprietatea de prietenie nu se mosteneste in clasele deri/ate.
-imbolul operatorului
&) JK -L 1 - M = N &tip) 11 -ne/ delete -L = A ? 1 - N P NN PP OO LL O O> L L> >> H> > 1> -> => A> ?> N> Q> P> OO> LL> ,
%upa cum om edea in continuare, exista doua ariante de definire a operatorilor2 R ca functie membra a clasei$ R ca functie prietena a clasei. Pentru exemplificare, ne propunem sa extindem clasa Point cu utilizarea unor operatori. class Point 3 FF 111 PointI operator (. (Point BBp)0 PointI operator $. (Point BBp)0 Point operator ( (Point BBp)0 Point operator $ (Point BBp)0 PointI operator . (Point BBp)0 int operator .. (Point BBp)0 int operator J. (Point BBp)0 int operator K (Point BBp)0 int operator ; (Point BBp)0 int operator K. (Point BBp)0 int operator ;. (Point BBp)0 70 PointI Point::operator (. (Point BBp) 3 - (. BBp1-0 5 (. BBp150 return 6this0 7 PointI Point::operator $. (Point BBp) 3 - $. BBp1-0 5 $. BBp150 return 6this0 7 Point Point::operator ( (Point BBp) 3 return Point(- ( BBp1-4 5 ( BBp15)0 7 Point Point::operator $ (Point BBp) 3 return Point(- $ BBp1-4 5 $ BBp15)0 7
int Point::operator .. (Point BBp) 3 return - .. BBp1- II 5 .. BBp150 7 int Point::operator J. (Point BBp) 3 return J(6this .. BBp)0 7 int Point::operator K (Point BBp) 3 return - K BBp1- II 5 K BBp150 7 int Point::operator ; (Point BBp) 3 return - ; BBp1- II 5 ; BBp150 7 int Point::operator K. (Point BBp) 3 return - K. BBp1- II 5 K. BBp150 7 int Point::operator ;. (Point BBp) 3 return - ;. BBp1- II 5 ;. BBp150 7 "m utilizat mai sus arianta cu functii membre. In continuare implementarea operatorului ( folosind cea de-a doua arianta. class Point 3 FF 111 ,riend Point operator ( (Point BBp=4 Point BBp%)0 7 Point operator ( (Point BBp=4 Point BBp%) 3 return Point(BBp=1- ( BBp%1-4 BBp=15 ( BBp%15)0 7 om descrie
%efinirea operatorilor ca functii membre a unei clase prezinta o restrictie majora2 primul operand este obligatoriu de tipul clasa respecti . -upradefinirea operatorilor este supusa in !11 unui set de restrictii2 - nu este permisa introducerea de noi simboluri de operatori$ - patru operatori nu pot fi redefiniti & ezi mai sus)$ - caracteristicile operatorilor nu pot fi sc0imbate2 pluralitatea &nu se poate supradefini un operator unar ca operator binar sau in ers), precedenta si asociati itatea$ - functia operator trebuie sa aiba cel putin un parametru de tipul clasa caruia ii este asociat operatorul supradefinit. Programatorul are libertatea de a alege natura operatiei realizate de un operator, insa este recomandat ca noua operatie sa fie apropiata de semnificatia initiala.
/oid 6operator ne'(si+eBt) cu mentiunea ca si+eBt este definit in stdlib1h. !0iar daca parametrul de tip si+eBt este obligatoriu, calculul dimensiunii obiectului in cauza si generarea sa se face de catre compilator. Gunctia operator delete trebuie sa primeasca ca prim parametru un pointer de tipul clasei in cauza sau /oid, continand adresa obiectului de distrus, si un al doilea parametru, optional, de tip si+eBt. Gunctia nu intoarce nici un rezultat. /oid operator delete(/oid 64 si+eBt) Irebuie sa mentionam aici ca operatorii ne' si delete supradefiniti pastreaza toate proprietatile operatorilor ne' si delete standard.
class NumeClasaDeri/ata : peci,icator#cces /irtual NumeClasaDeBa+a "ceasta declaratie nu afecteaza clasa in cauza, ci numai clasele deri ate din aceasta. "stfel, clasele Clasa= si Clasa% considerate or fi declarate irtuale. Irebuie mentionat faptul ca declararea /irtual a acestor clase a afecta definirea constructorului clasei ClasaNoua, deoarece compilatorul nu poate 0otari care date or fi transferate catre constructorul ClasaDeBa+a, specificate de constructorii Clasa= si Clasa%. !onstructorul ClasaNoua a trebui modificat astfel incat sa trimita datele pentru constructorul ClasaDeBa+a. %e asemenea, trebuie precizat ca intr-o ierar0ie de clase deri ate, constructorul clasei irtuale este intotdeauna apelat primul.
Irebuie mentionat faptul ca, in cazul con ersiei dintr-un tip clasa intr-un alt tip clasa, constructorul trebuie sa aiba acces la datele membre ale clasei de la care se face con ersia, deci trebuie declarata prietena a clasei respecti e.
(.2. 0rmarea unui ciclu de dez$oltare atat iterati$ cat si incremental bine administrat 8xista in principal doua tipuri de cicluri de dez oltare2 - ciclu de dez oltare nedefinit. In acest caz, este imposibil de stiut iteza dez oltarii sistemului, momentul la care a fi finalizat, calitatea sistemului ramanand permanent sub semnul intrebarii. 8ste posibila ca o parte din eforturile depuse sa fie ineficiente, asadar costurile dez oltarii sa fie foarte mari. - reguli clare care stabilesc fiecare aspect al ciclului. In acest de-al doilea caz, este impiedicata creati itatea si experimentul, care ar putea produce o aplicatie a and calitate sporita. !erintele utilizatorilor ajung cu dificultate la ni elul programatorilor ce realizeaza aplicatia, ingreunand procesul de dez oltare si marindu-i costurile. In realitate, nu om intalni nicaieri reunul dintre aceste cazuri distinct. In cadrul dez oltarii de sisteme soft/are, aceste doua tipuri de cicluri de dez oltare se intrepatrund, inclinand mai mult sau mai putin spre una dintre extreme, functie de deciziile luate de conducatorii acestor proiecte. --a tras in multe locuri concluzia ca un ciclu de dez oltare ideal este atat de tip iterati cat si de tip incremental. !e inseamna ca un ciclu este iterati T 6n proces iterati presupune inbunatatirea succesi a a ar0itecturii orientata pe obiecte, utilizand experienta si rezultatele obtinute in fiecare etapa sau ersiune in etapa urmatoare de analiza si dez oltare. !e reprezinta un ciclu incrementalT In cadrul unui proces incremental, fiecare trecere printr-un astfel de ciclu de analizaAdez oltare conduce la inbunatatirea deciziilor, rezultand astfel in final o solutie care intruneste ade aratele cerinte ale utilizatorilor, si are o ar0itectura clara, este eficienta si usor de intretinut. %e obicei, sistemele comerciale sunt realizate urmand un ciclu mai clar definit, deoarece sunt realizate in cadrul unor companii cu numar mare de programatori si trebuie executate intr-un inter al predefinit de timp. -pre deosebire de acestea, sistemele open source &realizate in lumea free soft/are) sunt construite dupa un ciclu mai ag definit, dar care de cele mai multe ori conduce la sisteme mai extensibile, mai flexibile, si de calitate superioara celor comerciale. -intetizat, etapele dez oltarii unui sistem orientat pe obiecte sunt2 1. 2naliza 1. Identificarea obiectelor din cadrul sistemului$ 2. Identificarea actiunilor efectuate de fiecare obiect$ . Identificare interactiunilor dintre aceste obiecte &mesajele prin care comunica obiectele). 11. 2bstractizarea 1. -tabilirea claselor ale caror instantiere sunt aceste obiecte$ 2. 8laborarea ierar0iei de clase. 111. 1mplementarea 1. Impartirea pe module &clase) a ierar0iei de clase$ 2. 8laborarea claselor de baza &fundamentale)$
. 8laborarea celorlalte clase din ierar0ie &in aceasta etapa se determina si disfunctiile in proiectareAimplementare a claselor de baza si este posibila re enirea la pct. U). #. "samblarea intr-un tot unitar a modulelor &claselor) 13. 4estarea &se realizeaza si pe parcursul etapelor III2 U-V) 3. Scrierea de documentatie &e entual in timpul etapelor III si e entual I;). Perioada de iata a unui sistem nu se rezuma insa la proiectarea si dez oltarea sa$ ea continua cu lansarea de noi ersiuni, corectarea erorilor ce nu au fost detectate in cadrul etapei de testare, adaptarea sa functie de cerintele utilizatorilor, etc. In cadrul etapei de proiectare a sistemului orientat pe obiecte, nu trebuie sa uitam ca un sistem complex bine construit este alcatuit din mai multe componente simple &atomice) care interactioneaza intre ele. -istemele monolitice au costurile de proiectare, implementare si mai ales de intretinere mult mai mari decat sistemele modulare. Programarea orientata pe obiecte ofera toate a antajele in ederea crearii de sisteme modulare. In ceea ce pri este ierar0iile de clase, exista doua categorii2 in prima, toate sau aproape toate clasele sunt deri ate dintr-o clasa de baza, radacina$ intr-a doua, pot exista mai multe ierar0ii de clase distincte. " antajul de a a ea o singura clasa de baza este acela ca se poate e ita cu usurinta mostenirea multipla$ deza antajul este ca de multe ori in cadrul procesului de implementare a claselor deri ate poate aparea necesitatea modificarii clasei de baza. In cadrul etapei de implementare a aplicatiei, este important sa se stabileasca o con entie unitara pri ind stilul de programare utilizat. %e cele mai multe ori nu are importanta stilul adoptat, insa un stil unitar poate usura foarte mult interconectarea dintre modulele componente si micsora costurile de intretinere a sistemului. In continuare oi face cate a sugestii2 R 1ndentarea - dimensiunea tabularii sa fie de U-V caractere R 2coladele -acoladele corespunzatoare sa fie aliniate ertical -pe liniile continand o acolada sa nu apara si cod R 5iniile lungi -dimensiunea unei linii de cod sa fie mai mica decat latimea ecranului -daca o linie este impartita pe mai multe randuri, cel de-al doilea rand cat si urmatoarele sa fie indentate R Codul sursa -sa nu existe spatii inainte si dupa operatorii unari -sa existe spatiu inainte si dupa operatorii binari -sa existe un spatiu dupa irgule si punct si irgula, dar nu intainte -sa nu existe spatii inainte si dupa paranteze
-sa existe spatiu inainte si dupa cu intele c0eie -sa fie utilizate linii libere pentru a separa di erse module de cod sursa si a mari lizibilitatea programului R Comentariile -textul unui comentariu sa fie separat de #AA# cu un spatiu -pe cat posibil, sa fie utilizate comentariile stil !11, #AA#, in loc de cele in stil !, #A= =A# -sa fie la obiect si de ni el cat mai inalt -sa indice operatia realizata de catre functie, efectele secundare, tipul parametrilor, alorile pe care le poate returna R !enumirile identificatorilor -denumirile sa fie cat mai descripti e posibil -sa fie e itate abre ierile criptice -sa nu fie utilizata notatia #ungureasca# &care pre ede includerea tipului unei ariabile in denumirea sa) R !repturile de acces la membri -sa se declare mai intai membrii public, apoi cei protected, iar apoi cei pri/ate -datele membre sa apara dupa declararea metodelor -prima metoda declarata sa fie constructorul, apoi destructorul R !efinirea claselor -ordinea definirii metodelor sa fie aceeasi cu a declararii acestora
,I,SI7CF"GI8 0ttp2AA///.arbornet.orgAMdragos