Sunteți pe pagina 1din 3

2.1.

Tipuri abstracte de date

Prima caracteristică a limbajelor obiect este utilizarea de tipuri abstracte de date.


Tipul de dată este folosit pentru a descrie o mulţime de obiecte care au aceiaşi
reprezentare. Fiecărui tip de dată i se asociază anumite operaţii, cum ar fi operaţiile aritmetice
pentru date numerice, concatenările pentru şiruri de caractere, modificările pentru anumite
articole.
Tipul abstract de dată extinde noţiunea de tip de dată, cuprinzând şi implementarea
operaţiilor asociate tipului de dată, specificând atât structura obiectului, cât şi mesajele aplicabile
lui. Tipul abstract de dată ascunde felul în care sunt implementate operaţiile asociate obiectului,
reprezentarea internă a obiectelor, şi protejează algoritmii interni care implementează cererile din
exterior.
Un tip abstract de dată sintetizează elementele comune ale unui set de obiecte cu aceleaşi
caracteristici şi se compune din două elemente: interfaţă şi implementarea.
Interfaţa defineşte viziunea oferită tuturor utilizatorilor în termeni operaţionali şi constă
într-o listă de operaţii.
Implementarea se compune dintr-o reprezentare a structurii interne a datelor obiectului şi
realizarea procedurilor de implementare a operaţiilor interfeţei.
Limbajele care folosesc aceste tipuri de date permit definirea atât a structurii datelor, cât
şi a operaţiilor folosite în manipularea directă a lor. Structura aleasă să memoreze reprezentarea
tipului abstract de dată este invizibilă pentru utilizator. Algoritmul de reprezentare este
încapsulat.
Un tip abstract de date (TAD) cuprinde o încapsulare de date şi operaţiile asupra
acestora.
Utilizatorul invocă metoda, necunoscând detalii despre implementarea ei, sau
reprezentarea internă a datelor. Aceste considerente ne conduc la concluzia că există o interfaţă
publică, la care au acces utilizatorii, şi una privată, care ascunde reprezentarea şi implementarea.
Limbajele de programare orientate obiect folosesc clasa ca noţiune de limbaj ce defineşte
tipul de dată abstractă. Tipul serveşte la definirea de declaraţii utilizate pentru controlul statistic
al expresiilor de limbaj, în timp ce clasele sunt tipare pentru generarea şi manipularea obiectelor
care au proprietăţi şi comportament comun. Există limbaje orientate obiect (Smalltalk, Vision)
care admit ca noţiune de bază clasa, nefăcând nici un control static al tipului. Utilizarea tipului
permite însă optimizarea diferitelor părţi de program la compilare, şi de aceea multe limbaje
orientate obiect dau prioritate noţiunii de tip, legate sau nu de noţiunea de clasă (C++, Simula,
O2).
Multe limbaje orientate spre obiecte, cum ar fi Simula, Eiffel şi C++ se bazează pe
implementarea acestor tipuri. Alte limbaje neorientate spre obiecte, cum ar fi Modula-2 şi Ada,
implementează tipurile abstracte. Astfel C++, Smalltalk, au ca suport clasele, iar ADA, care nu
este un limbaj obiect oferă pachete pentru implementarea tipurilor abstracte. Obiect Pascal, preia
noţiunea de tip din Pascal cu operaţii care să permită existenţa tipurilor abstracte.
Operaţiile care caracterizează un tip abstract sunt numite funcţii. Termenul de metodă este
de asemenea utilizat în contextul obiectului.
Pentru clarificare, se desemnează prin operaţii toate acţiunile asupra unui obiect, în
general specificându-se nivelul clasei.
Avantajele tipurilor abstracte sunt multiple, dintre acestea amintim:
 capturează proprietăţile esenţiale ale tipurilor de date;
 pot fi utilizate ca specificaţii în construcţia claselor din C++;
 promovează utilizarea unei bune practici de ingineria programării.
Utilizarea tipurilor abstracte de date în specificarea comportamentului structurilor are o
mulţime de avantaje pentru proiectantul software. În primul rând mecanismul de specificare este
declarativ, ceea ce înseamnă că detaliile de programare şi dependenţele de limbaj sunt ignorate,
în al doilea rând sunt uşor de înţeles, şi sunt suficient de riguroase pentru a permite demonstrarea
faptului că o implementare dată, îndeplineşte sau nu specificaţiile enunţate.
Un tip abstract de date constă din două părţi. Prima constituie specificarea sintactică, iar
cea de a doua cuprinde un set de aşa-zise axiome.
Specificarea sintactică conţine informaţii despre nume, domenii şi spaţii ale valorilor
ataşate tipului, în timp ce axiomele definesc sensul operaţiilor prin enunţarea relaţiilor dintre ele.
Toate tipurile abstracte abordează ascunderea structurii datelor şi algoritmilor prin
operaţii care le permit abstractizarea. De exemplu, deschizând un cont acesta are două funcţii
Creditor şi Debitor, şi permite afişarea structurii datelor mai mult sau mai puţin complexe care
sunt supuse calculului şi mecanismului de debitare şi creditare. Un program client de tip abstract
poate fi scris în fraze de tipul Creditor (Calcul,1000) şi Debitor(Calcul,500).
Acest mod de scriere îmbogăţeşte limbajul şi reproduce mai lizibil manipularea directă a
datelor supuse calculului.
Regruparea în cadrul aceleiaşi entităţi, numite obiect, a operaţiilor şi datelor reprezintă
principiul încapsulării. Încapsularea ascunde datele şi algoritmii ne lăsându-le vizibile interfeţei.
În consecinţă clientul este îndepărtat de toate modificările apărute în algoritmi sau în structura
datelor.
De exemplu, toate modificările algoritmilor referitori la debit şi la credit, sau modificările
în structura datelor ce urmează a fi prelucrate, vor fi invizibile, toţi programatorii vor utiliza
interfeţe abstracte alcătuite din verbele a credita şi a debita.
Încapsularea îmbunătăţeşte modularitatea permisă de limbajele obiect.
Fiecărei operaţii aparţinând unui tip abstract de date i se pot asocia mai multe precondiţii
sau nici una. O precondiţie este, de fapt, o constrângere, care trebuie specificată în vederea
asigurării bunei funcţionări a operaţiei în cauză.
Precondiţiile şi post-condiţiile descriu proprietăţile individuale ale operaţiilor. Este
necesar a se exprima proprietăţile globale ale instanţelor TAD care trebuie păstrate tot timpul.
Aceste proprietăţi se numesc invarianţi TAD şi pot fi implementaţi în limbajele orientate spre
obiecte, în cadrul acestora ei numindu-se invarianţi ai claselor.
Într-un limbaj obiect, tipologia este fie statică fie dinamică. În cazul tipologiei statice,
tipul unei variabile este determinat la compilare, şi nu se poate schimba. În cazul tipologiei
dinamice, tipul nu este cunoscut până în momentul execuţiei. C++, Obiect Pascal, ADA practică
tipologia statică. Spre deosebire de acestea Smalltalk practică tipologia dinamică. În acest ultim
caz, limbajul este mai suplu dar prezintă incovenienţe la control.
Din punct de vedere tehnic, tipologia statică permite un maxim de control al programelor
la nivelul compilării, deci înainte de execuţie, permiţând detectarea mai rapidă a erorilor. Ea
permite de asemenea o implementare mai bună prin intermediul compilatorului, care cunoaşte
structura datelor şi modul lor de utilizare. O optimizare a accesului la date prin operaţii şi o mai
bună generalizare a performanţelor este totuşi greu de realizat.

Tipuri
Noţiunea de tip derivă din limbajele care implementează tipuri abstracte de date. Un tip
caracterizează comportamentul instanţelor sale prin descrierea operaţiilor care pot manipula astfel
de obiecte. Din acest punct de vedere, tipurile clasifică obiectele în concordanţă cu
implementarea asociată. Tipurile nu sunt altceva decât mulţimi de obiecte.
Fiecare tip are o implementare corespunzătoare care, de cele mai multe ori, nu este
altceva decât o clasă cu acelaşi nume. Tipul corespunde unei vederi externe, în timp ce
implementarea descrie modul în care obiectele de acest tip sunt reprezentate şi modul în care
fiecare operaţie este implementată în termenii acestei reprezentări.
Interfaţa clasei conţine, în mod uzual, mai multe funcţii decât interfaţa tipului
corespunzător. Acestea sunt necesare în vederea implementării vederilor externe ale tipului.
În concluzie, specificaţiile de tipuri sunt vederi externe ale unui tip dat, care descriu ce
anume este reprezentat, în timp ce implementarea unui tip, deci a unei clase, este o vedere internă
ce descrie modul în care sunt reprezentate obiectele de tipul respectiv şi modul în care sunt
implementate operaţiile în termenii acestei reprezentări.

Subtipuri
În general specificarea tipurilor se face fără a fi necesară utilizarea altor tipuri. Cu toate
acestea, există relaţii naturale, stabilite între majoritatea tipurilor. Una dintre ele este subtipizarea,
obţinându-se astfel subtipurile. Spunem că un tip T1 este subtip al tipului T2 dacă fiecare instanţă
a tipului T1 este o instanţă a tipului T2. T2 se numeşte supertip al lui T1. Această definiţie
presupune că o instanţă a tipului T1 poată fi utilizată oriunde, o operaţie oarecare aşteaptă o
instanţă a tipului T2, de exemplu tipul Automobil este un subtip al tipului Vehicul.
Posibilitatea de a utiliza instanţe ale subtipurilor în operaţii în care sunt aşteptate instanţe
ale supertipurilor acestora are consecinţe în dezvoltarea software utilizând limbajele orientate
spre obiecte.
Deoarece subtipizarea este definită în termenii comportamentului, se poate vedea această
relaţie ca o ierarhi-zare comportamentală. Cum este şi firesc, în cadrul unei astfel de ierarhii, este
posibil ca implementarea operaţiilor unui supertip să se realizeze în mod diferit faţă de
implementarea celor asociate subtipului.
Procesul de subtipizare este utilizat în organizarea tipurilor într-o dezvoltare a unui sistem.

S-ar putea să vă placă și