Documente Academic
Documente Profesional
Documente Cultură
Curs 1, 2
Extragerea cerintelor
Mesajele sincrone blocheaza expeditorul pana se termina operatia (aia cu - - -), iar
cele asincrone (dreapta) nu intrerup executia expeditorului.
Clase
Reprezinta un grup de obiecte care au proprietati similare (atribute), un
comportament comun (operatii), relatii comune cu alte obiecte (relatii intre clase)
si aceeasi semantica.
O clasa e reprezentata printr-un dreptunghi cu 3
compartimente (cele pentru atribute si operatii pot lipsi, dar
numele e mereu prezent).
Clasele definite in etapa de “Analiza a cerintelor” contin de regula numai numele
si atributele, fara specificarea fiecarui tip de atribut. Clasele astea se numesc clase
conceptuale.
Reprezentarea detaliata a unei clase e contruita in etapa de proiectare de detaliu.
Sunt precizate vizibilitatea informatiilor din clasa (public/private), tipul variabilelor
si lista de parametri a fiecarei operatii.
Diagrama de clase reda un set de clase si relatiile dintre ele. Clasele pot fi asociate
(A lucreaza pentru B), sau generalizate (mostenire). In cazul asocierii se pot atasa
nume de rol.
Pot fi mai multe clase asociate prin aceeasi relatie (asociere binara, ternara, n-
ara). Pot fi asociate mai multe obiecte ale unei clase la un alt obiect (sau obiecte)
ale unei alte clase. In acel caz se adauga numarul obiectelor pe relatie (one-to-
many/many-to-many, dar specifici cate - * e evident oricat).
Ascocierile pot fi unidirectionale, asta inseamna ca numai unul din obiecte are
acces la celalalt (ex: fereastra are acces la
cursor, dar cursorul nu are la fereastra).
Clasa de asociere contine atributele relatiilor intre
doua clase.
Agregarea este o forma particulara de asociere,
care exprima un cuplaj temporar de tipul “compus-
componenti”. Mai multe obiecte ale unei clase pot face parte dintr-un singur alt
obiect la un anumit punct in timp, iar la
distrugerea acelui obiect, obiectele initiale
pot face apoi parte din alt obiect (ex:
profesorii sunt intr-un departament, se distruge departamentul, dar profii inca
pot merge in alt departament).
Relatia de compunere functioneaza similar. Ca notatie, rombul (de la agregare)
este umplut. O astfel de relatie semnifica distrugerea obiectelor (ex: profesor) la
distrugerea obiectului ce le contine (ex: piese auto intr-o masina, distrugi masina,
se duc si piesele).
Relatia de dependenta este cea mai slaba relatie intre doua clase. Exprima de
obicei o relatie temporara intre obiecte: obiectul clasei dependente
interactioneaza pentru scurt timp cu obiectul clasa tinta. O clasa A depinde de o
clasa B daca o metoda a clasei A are un parametru de tip B. (ex: Om depinde de
Mancare pentru ca om.mancanca(mancare)). Relatia de dependenta poate fi
adnotata cu un stereotip care ofera informatii depsre natura relatiei.
Relatia de generalizare se bazeaza pe notiunile de clasificare, generalizare,
specializare si extindere. Factorizeaza elementelor comune (atribute, operatii,
constrangeri) ale unui ansamblu de clase intr-o clasa mai generala, numita
superclasa. Se formeaza astfel un arbore de mostenire. Exista si clase abstracte,
care nu pot fi instantiate (si orice e la OOP).
Curs 4, 5
Modelarea interfetelor
Proiectarea arhitecturala
Criterii de proiectare
Pot fi organizate in 5 grupuri:
1. Performanta
timp de raspuns
throughput
utilizare de memorie
2. Increderea in sistem (dependability)
robustetea – cat rezista la intrari neprevazute
fiabilitate
disponibilitate (uptime)
toleranta la defecte
securitate
siguranta – sa nu puna oameni in pericol (WTF?)
3. Cost (la astea se fac compromisuri)
costul dezvoltarii
costul tranzitiei la utilizator (deployment) – instalare + instructie
costul actualizarii
costul mentenantei
4. Mentenanta
extensibilitate
usurinta de modificare
adaptabilitate
portabilitate
calitatea codului
5. Criteriile utilizatorului final
utilitatea – il ajuta sistemul in munca lui?
usurinta de utilizare
Identificarea subsitemelor
Descompunera initiala in subsisteme pleaca de la clasele identificate in modelul
de analiza. Se grupeaza in acelasi subsistem clasele corelate functional si numarul
de asocieri dintre clasele din subsisteme diferite trebuie sa fie cat mai mic.
Relatiile de dependenta intre subsisteme se definesc prin intermediul interfetelor
subsistemelor. Un subsistem se caracterizeaza prin serviciile pe care le furnizeaza
altor subsisteme. Un serviciu este un
set de operatii corelate care au un
scop comun. Acest set formeaza
interfata/interfelete subsistemului.
Subsistemele trebuie sa fie cat mai independente unul de altul. O modificarea a
unui subsistem trebuie sa aiba influenta minima asupra altor subsisteme. O
schimbare mica a cerintelor nu trebuie sa duca la modificari majore ale
arhitecturii. Efectul unei conditii de eroare trebuie sa fie izolat unui subsistem. Un
subsistem trebuie sa poata fi inteles ca o entitate de sine-statatoare.
Repository
Subsistemul pastreaza un set de date care alcatuiesc un repo si ofera servicii de
creare, acces si modificare a datelor. Potrivit pentru sisteme cu baze de date.
Avantaje: pot fi adaugate usor noi subsisteme
Dezavantaje: accesul la repo duce la o “strangulare” (reduce performanta) si
cuplarea intre repo si fiecare alt subsistem e mare (modfici repo-ul, mofici
celelalte subsisteme)
MVC
Subsistemul Model tine reprezentarea datelor.
Subsistemul View e responsabil de vizualizarea modelului.
Subsistemul Controller gestioneaza interactiunea cu utilizatorul.
Potrivit sistemelor interactive, mai ales cand sunt necesare multe vederi ale
modelului.
Client-Server
Clinetii cunosc interfata serverului (sau serverelor), dar serverul nu stie (si nu-i
pasa) interfetele clientilor.
Portabilitate – serverul poate fi accesat din orice sistem de operare si
independent de mediul de comunicare
Transparenta locatiei – chiar daca serverul este distribuit
Performanta inalta, scalabilitate si fiabilitate.
Peer-to-peer
O generalizare a client-server, in care subsistemele pot fi atat clienti cat si servere.
Fluxul controlului in fiecare subsistem este independent, exceptand sincronizarile
necesare pentru tratarea cererilor.
Arhitectura e mai greu de implementat caci poate introduce posibilitatea de
deadlock si complica fluxul controlului la nivelul fiecarui subsistem (peer).
Three-tier
Sunt 3 niveluri ierarhice: interfata utilizator – logica aplicatiei – baza de date.
Folosit in sistemele bazate pe Web: browserul e primul nivel, serverul web e al
doilea, iar baza de date e ultimul.
Avantaj: fiecare nivel poate fi imbunatatit independent.
Four-tier
Three-tier in care Interfata utilizatorului e descompusa in prezentarea clientului si
prezentarea serverului.
Avantaj: nivelul prezentarii clientului poate oferi o gama larga de interfete
utilizator care pot partaja elemente ale nivelului prezentarii serverului.
Intr-un sistem multi-user, fiecare tip de utilizator (actor) are anumite drepturi de
acces la resursele sistemului. Se determina obiectele partajate de actori – fisiere,
procese, instante ale claselor, se defineste mecanismul de control al accesului la
obiectele partajate si, in functie de cerintele de securitate, se stabilesc reguli de
autentificare a utilizatorilor si necesitatile de criptare a unor date.
Exista 3 mecanisme de control al fluxului operatiilor intr-un sistem:
1. Dirijat procedural
Operatiile asteapta intrarile de la un actor
Folosit in sistemele mai vechi si cele implementate in limbaje
procedurale
Dificil de utilizat in limbajele orientate obiect, secventierea
operatiilor fiind distribuita in seturi mari de obiecte
2. Dirijat de evenimente
Sistemul contine o bucla principala in care se asteapta un eveniment
extern
La producerea unui eveniment, el e transferat obiectului
corespunzator
Structura de control simpla, cu centralizare a intrarilor in bucla
principala
Folosit in sistemele bazate pe evenimente generate de GUI
3. Fire de executie
Threaduri care se executa in paralel
Threadurile pot fi create/distruse la diferite momente de timp
Intr-un thread se asteapta intrari de la un actor
Intr-un sistem trebuie luate in considerare si cazurile limita. Anumite exceptii pot
fi chiar tolerate de sistem si incluse in proiectarea unor componente.
Curs 6
Proiectarea de detaliu
Activitati:
Detalierea modelului arhitectural – descrierea claselor
Optimizarea modelului arhitectural – imbunatatire timp raspuns, utilizare
memorie, complexitatea codului
Reutilizare
Definirea interfetelor subsistemelor
Sablonul Bridge
Sablonul Strategy
Sablonul Command
Sablonul Subiect-Observator
Analiza functionala
Testarea programelor
Teste unitare
Se efectueaza la nivelul unei unitati de program: functie, procedura, etc.
Sunt realizate de programatorul care implementeaza unitatea program. Unitatea
tratata este considerata independenta care nu necesita prezenta altor unitati ale
programului.
Unitatile program cu care interactioneaza unitatea testata sunt simulate prin:
Modulul ciot (<<stub>>) – simuleaza modulele apelate de modulul testat
Modulul driver (<<driver>>) – simuleaza cazurile de apel ale modului testat
Modulul driver apeleaza modulul care urmeaza sa fie testat, furnizandu-i date de
intrare.
Metode de alegere a cazurilor de test pentru testarea unitara
Testarea functionala (“black box”): datele de test se aleg pe baza specificatiei
unitatii testate
Testarea structurala (“white box”): datele de test se aleg pe baza codului unitatii
testate
Testarea random: datele de test sunt generate in mod aleator pe baza domeniilor
de valori ale variabilelor de intrare
Testarea bazata pe mutatii: se introduc defecte in cod; o suita de test care nu
detecteaza defectul introdus e considerata ineficienta
Testarea claselor
Presupune separarea fiecarei metode si testarea comportarii in timp a obiectelor.
Testarea “Alpha-Omega” presupune trecerea unui obiect al clasei testate prin
toate starile sale, de la creare pana la distrugere, prin apelul tuturor metodelor
clasei. Este o testare minimala a unei clase.
Ordinea de apel a metodelor depinde de tipul clasei:
Non-modal – clasa care accepta orice mesaj (apel) in orice stare, ordinea de
apel nu conteaza
Quasi-modal – clasa in care constrangerile privind ordinea mesajelor se
schimba in acelasi timp cu starea obiectelor claselor (exemplu: containere –
stiva plina/goala)
Modal – clasa care are constrangeri permanente si fixe privind ordinea
mesajelor
Testarea claselor in JUnit:
1. Crearea unui obiect si selectarea metodei de start
2. Selectarea valorilor parametrilor de intrare a metodei
3. Calculul valorilor care se asteapta sa fie returnate de metoda
4. Executia metodei selectate asupra obiectului creat folosind valorile
sleectate ale parametrilor de intrare
5. Verificarea rezultatului
Testarea de integrare
Scopul este de a integra modulele dezvoltate independent intr-un sistem
functional.
Se verifica interactiunile dintre module, grupuri de module, pana la nivel de
sistem. In cazul unui program alcatuit din clase, modulele sunt functii membre ale
claselor. Clasele sunt testate individual prin teste unitare. Testele de integrare
presupun, ca si testele unitare, realizarea de module “ciot” si module “driver”.
Metoda big-bang presupune integrarea intr-un program executabil a tuturor
modulelor existente la un moment dat. Problema e ca apar toate erorile posibile
in acelasi timp.
Integrarea progresiva este mai eficienta, la fiecare nou test se adauga cate un
singur modul. Astfel, erorile apar treptat.
Integrarea ascendenta (de jos in sus)
Mai intai se testeaza modulele care nu apeleaza alte module. E nevoie de un
modul driver pentru fiecare modul al programului (si niciun ciot).
Avantaje: nu se folosesc module ciot, cele driver fiind mult mai usor de
implementat; modulele de nivel coborat se apeleaza de multe ori, deci e mai
avantajos sa fie implementate, nu simulate de cioturi.
Dezavantaje: Programul e disponibil numai dupa integrarea ultimului modul;
corectarea erorilor poate necesita reproiectarea; principalele erori sunt
descoperite de abia la sfarsit
Se verifica daca softul satisface cerintele specificate. Sunt teste ale sistemului si
echipamentului complet. Ocupa cel mai mult timp din perioada de testare. Toate
testele sunt de tip “black box”.
Teste functionale
Se folosesc cazuri derivate din cerintele functionale. Includ si teste de interfata cu
utilizatorul.
Teste de performanta
Se verifica daca performanta corespunde cerintelor in conditii normale si
nefavorabile.
Teste de comunicare (cu interfete externe)
Se verifica fluxul datelor si al controlului prin interfete externe. Se folosesc
protocoale de comunicatie.
Teste ale utilizarii resurselor
Cat de mult e utilizat CPU, RAM, spatiu pe disc, reteaua.
Teste de fiabilitate
Se verifica satisfacerea cerintelor de fiabilitate. Se folosesc toate statisticile
operationale (date de test random generate conform unei legi de probabilitate).
Testarea e trecuta cand rata de esec e sub o valoare ceruta.
Teste de securitate
Se verifica daca sistemul e protejat impotriva anumitor atacuri.
Teste de portabilitate
Teste de siguranta in functionare (nu pierzi fisiere/informatii)
Teste de stres
Testarea de acceptare
Scopul este de a verifica daca produsul respecta cerintele clientului. La aceste
teste participa si clientul.
Testarea se face in mai multe etape: alfa si beta (crapa mult, crapa putin).
Alfa se efectueaza folosind cerintelor utilizatorului pana cand clientul si
dezvoltatorul cad de acord ca programul e o reprezentare satisfacatoare a
cerintelor. La beta programul e distribuit unui numar select de utilizatori pentru a
il testa in conditii reale.
Teste regresive
Dupa corectarea unor erori se fac astfel de teste pentru a verifica ca nu au aparut
alte erori. Testele astea se fac in timpul dezvoltarii si in timpul perioadei de
operare a softului.
Curs 9
Testarea functionala
Bazata pe specificatia componentei testate si focalizata pe verificarea
comporatarii sale externe. Obiectul testat e tratat ca o “cutie neagra”.
Testarea ad-hoc
Programul este executat in mod repetat pentru intrari random, observandu-se
comportarea sa.
Testarea structurala
Revizii software
Sunt efectuate asupra artefactelor produse in procesul de dezvoltare software:
documente de specificare a cerintelor, documente de proiectare, planuri de
management, cod sursa.
Scopul este de a identifica defecte si de a imbunatatii calitatea. Reviziile se
efectueaza la inceputul dezvoltarii pentru a fi mai economice, dar se fac si in
fazele finale (de ex. asupra manulului de utilizare).
Se impart in 4 categorii:
Revizii tehnice
Prezentari (walkthroughs)
Audituri
Inspectii
Reviziile tehnice evalueaza articole software pentru a le imbunatati din punct de
vedere tehnic prin corectarea defectelor sau prin abordari alternative.
Obiectivele unei revizii tehnice:
Articolele revizuite sa fie conforme cu specificatiile facute anterior
Sa fie produse in conformitate cu standardele prevazute
Fiecare modificare sa fie implementata corect
Articolele revizuite sa nu contina defecte
Procesul de revizie are 2 etape:
1. Pregatirea (inainte de intrunire)
Fiecare membru al echipei studiaza articolele supuse reviziei si
inregistreaza fiecare problema intalnita. Problemele sunt trimise
autorului articolului revizuit
Autorul studiaza problemele si trimite un formular cu raspunsul sau
Conducatorul echipei clasifica toate problemele in majore/minore/de
editare
2. Intrunirea
Se decide daca fiecare probleam trebuie sa fie inchisa (e rezolvata
problema), trebuie sa fie modificat articolul sau trebuie rejectata
problema
Prezentarile sunt utile in evaluarea timpurie a documentelor, a modelelor si a
codului in fazele de specificare a cerintelor software, proiectare si implementare.
Obiectivul prezentarii este de a evalua articolul software (cautarea defectelor) si
de a educa si a rezolva problemele de stil. Inainte de intrunire, membri echipei
studiaza articolul si in timpul intrunirii autorul prezinta articolul revizuit (spre
deosebire de reviziile tehnice unde doar se vorbeste despre probleme).
Auditurile sunt revizii efectuate de grupuri externe. Se verifica sa se respecte
standardele, specificatiile si procedurile stabilite.
Inspectiile au rol de a depista defecte care trebuie corectate. Se fac inainte de
testare pentru a verifica proiectarea cazurilor de test si procedurilor de testare.
Sunt eficiente si economice, pot detecta >50% din numarul total de defecte din
timpul dezvoltarii.
Curs 11
Acest model se recomanda pentru proiectele in care cerintele sunt bine intelese
de la inceput si nu se modifica pe parcursul procesului de dezvoltare.
Nu e potrivit pentru proiecte cu cerinte vagi/neclare, proiecte cu cerinte care se
pot schimba si proiecte de lunga durata.
Modelul in “V”
Este o varianta a modelului waterfall, care include elaborarea planurilor de test in
fazele de specificare si proiectare. Avantajul fata de modelul cascada este ca
sansele de succes sunt mai mari, datorita elaborarii planurilor de test in primele
etape ale procesului de dezvoltare.
Iteratiile
Scopul fiecarei iteratii este de a produce un produs executabil prin care se poate
demonstra partilor interesate o parte din functionalitatile viitorului produs.
Durata unei iteratii depinde de proiect, cu cat o iteratie e mai scurta cu atat mai
usor se primeste feedback. Obiectivele unei iteratii se stabilesc pe baza iteratiilor
precedente.
In fiecare iteratie se adauga functionalitati noi proiectului anterior si, la nevoie, se
modifica prototipul anterior pe baza feedbackului.
Avantaje:
In fiecare etapa e livrat un executabil
Flexibil in schimbarea cerintelor
E mai usor de depanat
Dezavantaj: arhitectura intiiala e greu de testat, si se poate ajunge la o abordare
“build and fix”, deci afecteaza calitatea produsului final.
Calitatea produselor software
1. Functionalitatea
2. Fiabilitatea
3. Eficienta
4. Securitatea
5. Compatibilitatea
6. Usurinta de intretinere
7. Usurinta de utilizare
8. Portabilitatea