Dezvoltarea unei aplicat ii software de [625857]
Ministerul Educat ¸iei Nat ¸ionale s ¸i Cercet ˘arii S ¸tiint ¸ifice
Universitatea ”OVIDIUS” Constant ¸a
Facultatea de Matematic ˘a s ¸i Informatic ˘a
Specializarea Informatic ˘a
Dezvoltarea unei aplicat ¸ii software de
informare a c ˘al˘atorilor din autobuzeleRATC
Lucrare de licent ¸ ˘a
Coordonator s ¸tiint ¸ific:
Conf. univ. dr. Puchianu Crengut ¸a
Absolvent: [anonimizat] ¸caru Petric ˘a
Constant ¸a
2017
Cuprins
Cuprins i
Lista Figurilor iii
1 Motivat ¸ie 2
1.1 Structura lucr ˘arii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Starea actual ˘a a domeniului 4
2.1 Definirea problemei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Probleme ˆıntˆampinate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2.1 Solut ¸ia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3 Descrierea problemei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4 Obiectivele sistemului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.5 Participant ¸i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.6 Scenarii de baz ˘a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3 Analiza software a sistemului 7
3.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.2 Documentul de cerint ¸e . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.3 Modelul funct ¸ional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
i
Cuprins Cuprins
3.4 Diagrama de secvent ¸e de sistem . . . . . . . . . . . . . . . . . . . . . . . 15
3.4.1 Evenimente de sistem . . . . . . . . . . . . . . . . . . . . . . . . 15
3.4.2 Diagrame de secvent ¸e de sistem . . . . . . . . . . . . . . . . . . . 15
3.4.3 Diagrama de context . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.4.4 Modelul domeniului . . . . . . . . . . . . . . . . . . . . . . . . . 19
4 Proiectarea s ¸i implementarea aplicat ¸iei 22
4.0.1 Arhitecturi s ¸i stiluri arhitecturale . . . . . . . . . . . . . . . . . . . 22
4.1 Modele de proiectare de atribuire a responsabilit ˘at ¸ilor . . . . . . . . . . . . 24
4.2 Diagrama de interact ¸iune . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.3 Diagrame de clase ˆın faza de proiectare . . . . . . . . . . . . . . . . . . . 47
4.4 Modelarea bazei de date . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5 Concluzii 54
6 Anexe 55
6.1 Anexa 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
6.2 Anexa 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
6.3 Anexa 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Referint ¸e bibliografice 63
ii
Lista Figurilor
3.1 Diagrama cazurilor de utilizare software . . . . . . . . . . . . . . . . . . . . . 14
3.2 Diagrama de secvent ¸e de sistem pentru Achizit ¸ionare Bilet . . . . . . . . . . . 17
3.3 Diagrama de secvent ¸e de sistem pentru Autentificare S ¸ofer . . . . . . 17
3.4 Diagrama de secvent ¸e de sistem pentru Creare cont s ¸ofer . . . . . . . . . . . . 18
3.5 Diagrama de secvent ¸e de sistem pentru Vizualizare Autobuze . . . . . 18
3.6 Diagrama de context a sistemului FutureBus . . . . . . . . . . . . . . . . . 19
3.7 Diagrama de clase a sistemului FutureBus . . . . . . . . . . . . . . . . . . 21
4.1 Diagrama secvent ¸e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.2 Diagrama de comunicare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.3 Diagrama de secvent ¸e pentru cazul de utilizare Achizit ¸ionare bilet . . 27
4.4 Fereastr ˘a achizit ¸ionare bilet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.5 Selectare linie si tip bilet pentru achizit ¸ionare de bilet . . . . . . . . . . . . . . 30
4.6 C ˘al˘atorul nu a selectat nici linia s ¸i nici coloana . . . . . . . . . . . . . . . . . 31
4.7 C ˘al˘atorul a primit un cod de c ˘al˘atorie . . . . . . . . . . . . . . . . . . . . . . . 31
4.8 Meniul aplicat ¸iei s ¸i biletele achizit ¸ionate . . . . . . . . . . . . . . . . . . . . . 34
4.9 Diagrama de secvent ¸e pentru cazul de utilizare Autentificare S ¸ofer . . 35
4.10 Autentificare S ¸ofer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.11 Autentificare S ¸ofer, credent ¸iale gres ¸ite . . . . . . . . . . . . . . . . . . . . . . 38
iii
Lista Figurilor Lista Figurilor
4.12 Fereastra de localizare autobuz . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.13 Diagrama in faz ˘a de proiectare pentru cazul de utilizare Vizualizare autobuze . 43
4.14 Meniul principal s ¸i fereastra de vizualizare a autobuzelor . . . . . . . . . . . . 44
4.15 Diagrama de clase de proiectare pentru cazul de utilizare Achizit ¸ionare bilet . . 48
4.16 Diagrama de clase de proiectare pentru cazul de utilizare Vizualizare-autobuze . 49
4.17 Diagrama de clase de proiectare pentru cazul de utilizare Autentificare S ¸ofer . . 50
4.18 Diagrama bazei de date de tip Mysql . . . . . . . . . . . . . . . . . . . . . . . 51
1
Capitolul 1
Motivat ¸ie
Aplicat ¸ia prezentat ˘aˆın cadrul acestei lucr ˘ari reprezint ˘a un factor important ˆın dezvoltarea so-
ciet˘at ¸ii, permit ¸ ˆand c ˘al˘atorilor s ˘a vizualizeze ˆın timp real locat ¸ia autobuzului s ¸i s ˘a-s ¸i achizit ¸ioneze
cu us ¸urint ¸ ˘a un bilet.
1.1 Structura lucr ˘arii
Lucrarea este compus ˘a din cinci capitole prezentate ˆın cele ce urmeaz ˘a.
Primul capitol prezint ˘a ideea de baz ˘a a lucr ˘arii s ¸i succint restul capitolelor cuprinse ˆın
lucrare.
ˆIn al doilea capitol se realizeaz ˘a descrierea principalelor probleme ˆıntr-o firm ˘a de trans-
port ˆın comun c ˆat s ¸i problemele pe care c ˘al˘atorii le ˆıntˆampin ˘aˆın fiecare zi atunci c ˆand uti-
lizeaza mijloace de transport ˆın comun. Totodat ˘a se ofer ˘a s ¸i solut ¸ii pentru rezolvarea tuturor
acestor probleme.
Capitolul trei cuprinde analiza software a sistemului ce trebuie implementat. Anali-
za software a sistemului este foarte utila deoarece in timpul efectuarii ei se ˆınt ¸elege modul
de funct ¸ionare a sistemului. Totodat ˘a,ˆın timpul analizei software se realizeaz ˘a s ¸i modelul
funct ¸ional, responsabil pentru descrierea comportamentului sistemului curent si a interactiu-
nilor lui cu actorii software.
Diagramele de clase sunt prezentate ˆın acest capitol s ¸i cu ajutorul lor se face o rapid ˘a
trecere la crearea codului aplicat ¸iei.
Toate diagramele mai sus ment ¸ionate au fost prezentate prin diagrame UML (acronim
pentru Unified Modeling Language[UMLS]), realizate cu ajutorul programului Astah [Astah].
ˆIn cel de-al patrulea capitol sunt prezentate modelele rezultate ˆın urma proiect ˘arii aplicat ¸iei
cu ajutorul diagramelor prezentate anterior ˆın capitolul 3. Tot aici sunt prezentate stilurile
arhitecturale care stau la baza form ˘arii arhitecturii obiectuale a oric ˘arui sistem software s ¸i
2
Motivat ¸ie Structura lucr ˘arii
modelele de proiectare si de atribuire a responsabilit ˘at ¸ilor. Pe l ˆang˘a prezentarea modelelor
de baz ˘a,ˆın capitolul 4 au fost prezentate modelele s ¸i stilurile utilizate pentru realizarea arhi-
tecturii aplicat ¸iei. Tot aici, pe baza diagramelor de secvent ¸e ˆın faza de proiectare, s-au realizat
descrieri ale codului surs ˘a s ¸i exemplific ˘ari ale utilit ˘at ¸ii acestuia.
ˆIn cadrul acestui capitol au fost exemplificate sistemele de gestiune a bazelor de date
utilizate c ˆat s ¸i modul proiect ˘arii bazelor de date aferente.
ˆIn ultimul capitol au fost discutate concluziile realiz ˘arii acestei lucr ˘ari cˆat s ¸i contribut ¸iile
proprii, bibliografia si anexele lucr ˘arii.
3
Capitolul 2
Starea actual ˘a a domeniului
2.1 Definirea problemei
O firm ˘a de transport ˆın comun are, ca scop principal, realizarea serviciului de transport per-
soane din oras ¸ele ˆın care aceste firme ˆıs ¸i desf ˘as ¸oar ˘a activitatea. Pentru realizarea transportu-
lui exist ˘a un orar aproximativ al mijloacelor de transport ˆın comun.
2.2 Probleme ˆıntˆampinate
Pe parcursul activit ˘at ¸ii mijloacelor de transport, exist ˘a posibilitatea aparit ¸iei urm ˘atoarelor
probleme:
1.Defect ¸iuni tehnice ale autobuzului sau microbuzului ceea ce duce la nerespectarea
programului s ¸i implicit pierderea c ˘al˘atorilor. V ˘azˆand faptul c ˘a autobuzul ˆıntˆarzie prea
mult, c ˘al˘atorul poate comanda un TAXI.
2.Pe liniile pe care circul ˘a mai multe autobuze, ˆın funct ¸ie de fluxul c ˘al˘atorilor, pot ap ˘area
ˆıntarzieri. C ˘al˘atorii nu s ¸tiu unde se afl ˘a autobuzul pe care-l as ¸teapt ˘a s ¸i dac ˘a sunt ˆın
ˆıntarziere ˆıl pot pierde.
3.Persoanele str ˘aine unor oras ¸e, nes ¸tiind locurile din care-s ¸i pot procura bilet, pierd timp
ˆın c˘autarea ghis ¸eelor. Dac ˘a nu g ˘asesc niciun ghis ¸eu de la care s ˘a-s ¸i cumpere bilet,
c˘al˘atoresc f ˘ar˘a bilet s ¸i risc ˘a s˘a fie amendat ¸i.
2.2.1 Solut ¸ia
Pe baza aplicat ¸iei prezentat ˘aˆın continuare ˆın aceast ˘a lucrare, se ˆıncearc ˘a evitarea tuturor
acestor probleme ˆıntˆampinate de c ˘atre c ˘al˘atori prin crearea unei ret ¸ele virtuale de autobuze.
4
Starea actual ˘a a domeniului Descrierea problemei
2.3 Descrierea problemei
Pentru a realiza un sistem software, trebuie ca acesta s ˘a treac ˘a prin mai multe faze de dez-
voltare. Analiza s ¸i proiectarea software trebuie s ˘a fie terminate ˆınainte de scrierea codului
propriu-zis.
Pentru a realiza o descriere grafic ˘a a modelelor comportamentului s ¸i structurii sistemu-
lui, se utilizeaz ˘a limbajul UML(Unified Modelling Language)[UMLS], limbaj de modelare
standard din 1997.
Pentru a modela cu ajutorul acestui limbaj, se combin ˘a conceptele UML ˆın cadrul mod-
elelor care poart ˘a numele de diagrame. Cu ajutorul limbajului UML se pot construi mai
multe tipuri de diagrame: de clase, de cazuri de utilizare, de st ˘ari, de secvent ¸e, de obiecte,
de activitate, de interact ¸iune etc.[UMLS].
Dezvoltarea aplicat ¸iei FutureBus a pornit de la urm ˘atoarea descriere a problemei:
O firm ˘a de transport ˆın comun dores ¸te achizit ¸ionarea acestei aplicat ¸ii pentru a eficientiza
buna funct ¸ionare a relat ¸iei produc ˘ator-consumator. ˆIn cazul de fat ¸ ˘a, produc ˘atorul serviciilor
este firma de transport, iar consumatorul este reprezentat de c ˘al˘ator. ˆIn prezent, acest lu-
cru este realizat la un nivel de baz ˘a, nepun ˆandu-se accent pe cerint ¸ele s ¸i nevoile c ˘al˘atorilor.
Exist ˘a un anumit num ˘ar de autobuze/microbuze care preiau c ˘al˘atorii din stat ¸ii special ame-
najate. Nu exist ˘a un timp mediu pe care-l face un autobuz parcurg ˆand distant ¸a dintre dou ˘a
stat ¸ii. De aceea, timpul ˆın care se ajunge ˆıntr-o anumit ˘a stat ¸ie este imprecis.
2.4 Obiectivele sistemului
Aplicat ¸iaFutureBus ˆındeplines ¸te urm ˘atoarele obiective:
1.Respectarea programului de vizit ˘a a fiec ˘arei stat ¸ii de c ˘atre autobuzul aferent.
2.Evitarea pierderii c ˘al˘atorilor s ¸i cres ¸terea num ˘arului acestora.
3.Prestarea unui serviciu de transport de calitate oferit at ˆat c˘al˘atorilor uzuali c ˆat s ¸i celor
str˘aini.
2.5 Participant ¸i
Persoanele direct interesate ˆın dezvoltarea unui sistem software s ¸i cei care interact ¸ioneaz ˘a
ˆın mod constant cu sistemul, au un rol important ˆın procesul de dezvoltare software. Ter-
menul stakeholder reprezint ˘a persoana care are un impact fie el negativ, fie el pozitiv asupra
5
Starea actual ˘a a domeniului Scenarii de baz ˘a
activit ˘at ¸ii s ¸i act ¸iunilor unei companii sau organizat ¸ii. Aces ¸ti stakeholder-i se ˆımpart ˆın pri-
mari(primii afectat ¸i) s ¸i secundari(cei implicati indirect), iar cei secundari au o influent ¸ ˘a im-
portant ˘aˆın dezvoltarea aplicat ¸iei. Pentru aceast ˘a aplicat ¸ie, persoanele cheie conform struc-
turii de mai sus ar fi directorii, s ¸efii de birou, s ¸oferii de autobuze,vanz ˘atorii de bilete s ¸i con-
trolorii, aces ¸tia fiind ˆıncadrat ¸i ˆın grupa primar ˘a.ˆIn grupa secundar ˘a sunt ˆıncadrat ¸i c ˘al˘atorii.
2.6 Scenarii de baz ˘a
Pentru a putea ˆınt ¸elege modul de funct ¸ionare al acestei aplicat ¸ii, se va explica pas cu pas cum
se realizeaz ˘a o c ˘al˘atorie ˆıntr-o zi obis ¸nuit ˘a a unui c ˘al˘ator care foloses ¸te autobuzele pentru a
se deplasa ˆın oras ¸. Pentru aceasta vom presupune faptul c ˘a domnul Popescu Marcel, un
nume atribuit simbolic unui utilizator al sistemului FutureBus , dores ¸te s ˘a se deplaseze in
Constant ¸a, de la C ˘amin Pesc ˘arie la Universitate. Domnul Popescu nu este preg ˘atit de plecare
s ¸i nu s ¸tie dac ˘a s˘a se gr ˘abeasc ˘a sau nu. Dar, utiliz ˆand un smartphone, el ruleaz ˘a aplicat ¸ia s ¸i
vede ˆın timp real o hart ˘a cu toate autobuzele disponibile. Poate selecta cu us ¸urint ¸ ˘a autobuzul
despre care dores ¸te informat ¸ii prin simpla ap ˘asare a imaginii cu autobuzul dorit. Aplicat ¸ia
verific ˘a imaginea pe care Domnul Popescu a accesat-o s ¸i ˆıl informeaz ˘a printr-un mesaj unde
se afl ˘a autobuzul s ¸i ˆın cˆat timp ajunge ˆın stat ¸ia Pesc ˘arie. Astfel c ˘a domnul Popescu s ¸tie dac ˘a
s˘a se gr ˘abeasc ˘a sau nu.
Un al doilea scenariu posibil pentru care poate fi folosit ˘a aceast ˘a aplicat ¸ie este descris
dup˘a cum urmeaz ˘a: vom presupune c ˘a domnul Popescu Marcel, un nume atribuit simbolic
unui vizitator al oras ¸ului Constant ¸a, dores ¸te s ˘a c˘al˘atoreasc ˘a cu autobuzul. Nes ¸tiind de unde
s˘a-s ¸i achizit ¸ioneze bilet, urc ˘aˆın unul din autobuzele RATC f ˘ar˘a bilet s ¸i risc ˘a s˘a fie amendat
de c˘atre controlori. Dar, rul ˆand aplicat ¸ia FutureBus , poate cump ˘ara cu us ¸urint ¸ ˘a un bilet,
select ˆand datele deja furnizate de c ˘atre aplicat ¸ie. Biletul achizit ¸ionat prin intermediul acestui
sistem software este salvat ˆın smartphone-ul dumnealui iar la un eventual control nu poate fi
suprataxat. Astfel c ˘a domnul Popescu reus ¸es ¸te s ˘a cumpere bilet ˆıntr-un mod foarte simplu s ¸i
nu pierde timpul c ˘autˆand un ghis ¸eu de unde s ˘a-s ¸i procure bilet.
Un alt scenariu posibil prin intermediul c ˘aruia poate fi explicat ˘a utilitatea acestei aplicat ¸ii,
ˆıl vom descrie mai jos: V om presupune c ˘a domnul Popescu Marcel, un nume atribuit sim-
bolic unui director RATC , dores ¸te vizualizarea h ˘art ¸ii cu autobuzele de pe traseu. Ruleaz ˘a
aplicat ¸iaFutureBus s ¸i astfel vede ˆın timp real locat ¸ia exact ˘a a autobuzelor, precum s ¸i
viteza cu care se circul ˘a pe traseu. Astfel c ˘a monitorizarea autobuzelor va fi facut ˘a eficient,
cu un efort minim.
6
Capitolul 3
Analiza software a sistemului
3.1 Introducere
Prin definit ¸ie, un sistem software este o colect ¸ie de componente care interact ¸ioneaz ˘aˆıntre
eleˆıntr-un mod bine-definit, ˆımpreun ˘a cu suportul persistent folosit s ¸i documentat ¸ia afer-
ent˘a[CBMFP].
Analiza software a sistemului reprezint ˘a o activitate ˆın care sunt realizate anumite modele
conceptuale, a c ˘aror rezultat evident ¸iaz ˘a o abstractizare a domeniului problemei rezolvat ˘a de
sistem[CBMFP].
Prin intermediul acestei analize se obt ¸in informat ¸ii esentiale privind structura codului,
riscurile s ¸i deficient ¸ele rezultate ˆın urma test ˘arii programului.
ˆIn cadrul realiz ˘arii unui sistem software, primul produs realizat este documentul de cerint ¸e.
Acesta este o descriere a funct ¸ionalit ˘at ¸ilor s ¸i propriet ˘at ¸ilor sistemului, as ¸a cum este v ˘azut de
c˘atre cei care sunt interesat ¸i ˆın funct ¸ionarea lui, precum s ¸i modul ˆın care poate fi folosit acest
sistem[CBMFP].
7
Analiza software a sistemului Documentul de cerint ¸e
3.2 Documentul de cerint ¸e
Documentul cerint ¸elor cont ¸ine 4 sect ¸iuni importante:
1.Descrierea sistemului cont ¸ine c ˆateva fraze care caracterizeaz ˘a sistemul s ¸i implicit obiec-
tivele acestuia.
2.Actorii software descriu unul sau mai multe roluri pe care le joac ˘a utilizatorii care
interact ¸ioneaz ˘a cu sistemul.
3.Cerint ¸ele funct ¸ionale specific ˘a tot ceea ce face sistemul.
4.Cerint ¸ele nefunct ¸ionale(atribute de calitate) reprezint ˘a propriet ˘at ¸ile sistemului sau prestat ¸iile
sistemului, as ¸a cum sunt v ˘azute de c ˘atre stakeholder-i[CBDAS].
Documentul de cerint ¸e al FutureBus este prezentat ˆın continuare:
1.Descrierea sistemului:
Sistemul realizeaz ˘a informarea c ˘al˘atorilor cu privire la locat ¸ia s ¸i timpul p ˆan˘a la destinat ¸ie
al autobuzelor din Constant ¸a.
2.Actorii software: S ¸ofer, c ˘al˘ator, administrator.
3.Cerint ¸e funct ¸ionale:
F 1 Creare cont s ¸ofer
F 1.1 Afis ¸eaz ˘a un formular ce permite introducerea datelor
F 1.2 Verific ˘a corectitudinea datelor
F 1.3 Creeaza un cont de utilizator s ¸i o parol ˘a pe care le memoreaz ˘a
F 1.4 Trimite prin email s ¸oferului datele create
F 1.5 Afis ¸eaz ˘a un mesaj
F2 Autentificare s ¸ofer
F 2.1 Permite introducerea datelor de autentificare de c ˘atre s ¸ofer, prin afis ¸area unui
formular
F 2.2 Verific ˘a corectitudinea datelor de autentificare ale s ¸oferului, din punct de vedere
sintactic
F 2.3 Afis ¸eaz ˘a un mesaj de Bun venit
F 2.4 Memoreaz ˘a datele de autentificare
F 2.5 Dac ˘a datele introduse de c ˘atre s ¸ofer nu sunt corecte, afis ¸eaz ˘a un mesaj de eroare
F3 Furnizare locat ¸ie autobuz
F 3.1 Permite selectarea unei opt ¸iuni
F 3.2 Memoreaz ˘a datele localiz ˘arii autobuzului
F 3.3 Afis ¸eaza un mesaj
8
Analiza software a sistemului Modelul funct ¸ional
F4 Vizualizare locat ¸ie autobuz
F 4.1 Afis ¸eaz ˘a autobuzele disponibile ˆın momentul curent
F 4.2 Permite selectarea unui autobuz, s ¸i vizualizarea detaliilor acestuia
F5 Achizit ¸ionare bilet
F5.1 Afis ¸eaz ˘a o list ˘a cu cu liniile disponibile s ¸i tipurile de bilete
F5.2 Permite selectarea unei linii s ¸i a unui tip de bilet
F5.3 Verific ˘a dac ˘a opt ¸iunile selectate sunt valide
F5.4 Dac ˘a utilizatorul are credit suficient, realizeaz ˘a achizit ¸ionarea unui bilet
F5.5 Memoreaz ˘a datele biletului achizit ¸ionat
F5.6 Dac ˘a opt ¸iunile selectate nu sunt valide, afis ¸eaz ˘a un mesaj de eroare
F5.7 Dac ˘a utilizatorul nu are credit suficient, afis ¸eaz ˘a un mesaj de eroare
F6 Vizualizare bilete achizit ¸ionate
F6.1 Afis ¸eaz ˘a lista biletelor achizit ¸ionate.
F6.2 Afis ¸eaz ˘a detalii despre biletele cump ˘arate.
4.Cerint ¸e nefunct ¸ionale(CN):
CN1 Aplicat ¸ia trebuie s ˘a foloseasc ˘a o baz ˘a de date pentru a memora datele.
CN2 Utilizare:
S ¸oferii nu trebuie s ˘a urmeze un curs pentru a folosi aplicat ¸ia, deoarece este bazat ˘a
pe interfet ¸e grafice.
Aplicat ¸ia trebuie s ˘a ruleze pe sisteme de operare Android cu versiune cel put ¸in
egal˘a cu 4.0.
CN3 Robustet ¸e:
Aplicat ¸ia trebuie s ˘a verifice datele introduse de c ˘atre˘sofer. Dac ˘a sunt incorecte,
aplicat ¸ia trebuie s ˘a afis ¸eze mesaje de eroare s ¸i s ˘a permit ˘a s ¸oferului reintroducerea
datelor corecte.
CN4 Portabilitate:
Aplicat ¸ia trebuie s ˘a fie implementat ˘aˆın limbajul de programare Java.
3.3 Modelul funct ¸ional
ˆIn cadrul fazei de analiz ˘a este creat modelul funct ¸ional, care cont ¸ine descrierea cazurilor de
utilizare software s ¸i diagrama cazurilor de utilizare.
Un caz de utilizare software descrie comportamentul potent ¸ial al unui clasificator (sistem/-
subsistem/clas ˘a),ˆın interact ¸iunea lui cu unul sau mai mult ¸i actori software.
Un caz de utilizare furnizeaz ˘a o secvent ¸ ˘a coerent ˘a de funct ¸ionalitate a unui clasificator prin
mesajele schimbate de clasificator, cu unul sau mai mult ¸i actori software.
9
Analiza software a sistemului Modelul funct ¸ional
Conform sursei [CBMFP], orice caz de utilizare poate fi descris textual, printr-un s ¸ablon:
1.Nume: este numele cazului de utilizare software
2.Descriere: descrie comportamentul sistemului s ¸i interact ¸iunea lui cu actorii software
implicat ¸i, pentru ˆındeplinirea unui obiectiv.
3.Actori software: sunt enumerat ¸i actorii software implicat ¸i. Poate exista un actor prin-
cipal care determin ˘aˆınceperea execut ¸iei acestui caz de utilizare.
4.Eveniment declans ¸ator: se specific ˘a act ¸iunea realizat ˘a de actorul principal.
5.Precondit ¸ii: descriu starea sistemului ˆınainte de ˆınceperea execut ¸iei cazului de uti-
lizare.
6.Postcondit ¸ii: descriu starea sistemului dup ˘a executarea acestui caz de utilizare.
7.Referint ¸e ˆıncrucis ¸ate: sunt enumerate cerint ¸ele funct ¸ionale ˆındeplinite de sistem, ˆın
acest caz de utilizare.
8.Flux principal: descriu interact ¸iunea dintre actori s ¸i sistem, prin act ¸iunile pe care le
face fiecare participant.
9.Flux alternativ: descrie act ¸iunea sistemului s ¸i a actorilor ˆın anumite situat ¸ii.
10.Flux de eroare: descrie act ¸iunea sistemului ˆın situat ¸ii except ¸ionale.
S-a realizat aceast ˘a descriere am ˘anunt ¸ita a cazurilor de utilizare ale sistemului FutureBus
ca urmare a s ¸ablonului prezentat anterior:
Caz de utilizare 1
Nume: Autentificare s ¸ofer
Descriere: Descrie comportamentul sistemului s ¸i interact ¸iunea acestuia cu s ¸oferul pen-
tru a putea realiza autentificarea ˆın sistem
Actori software: S ¸ofer
Eveniment declans ¸ator: S ¸oferul cere autentificarea ˆın sistem
Precondit ¸ii: Sistemul a verificat datele de autentificare ale s ¸oferului
Postcondit ¸ii: Sistemul a memorat locat ¸ia autobuzului s ¸i a afis ¸at un mesaj
Referint ¸e ˆıncrucis ¸ate: F2.1-F2.5,F3.1,F3.3
10
Analiza software a sistemului Modelul funct ¸ional
Flux principal
Sofer Sistem
1.Cere autentificarea ˆın sistem 2. Cere introducerea datelor de autentificare.
3. Introduce datele de autentificare s ¸i le trimite. 4.Verific ˘a corectitudinea datelor [A1] .
5.Memoreaz ˘a datele de autentificare.
6.Afis ¸eaz ˘a dou ˘a opt ¸iuni ˆıntr-o fereastr ˘a.
7.Alege opt ¸iunea Pornes ¸te localizare autobuz. 8.Memoreaz ˘a datele localiz ˘arii autobuzului.
9.Afis ¸eaz ˘a un mesaj.
Flux alternativ
[A1] Datele nu sunt corecte:
1.Sistemul afis ¸eaz ˘a un mesaj de eroare.
2.Fluxul continu ˘a cu pasul 2 din fluxul principal.
Caz de utilizare 2
Nume: Vizualizare autobuze
Descriere: Descrie comportamentul sistemului s ¸i interact ¸iunea acestuia cu c ˘al˘atorul
pentru a putea reda locat ¸ia curent ˘a a autobuzelor.
Actori software: C˘al˘ator
Eveniment declans ¸ator: C˘al˘atorul solicit ˘a vizualizarea autobuzelor ˆın momentul curent
Precondit ¸ii: Sistemul a verificat existent ¸a autobuzelor ˆın trafic
Postcondit ¸ii: Sistemul a afis ¸at autobuzele disponibile ˆın momentul curent
Referint ¸e ˆıncrucis ¸ate: F4.1-F4.2
Flux principal:
C˘al˘ator Sistem
1.Cere vizualizarea autobuzelor prezente ˆın trafic. 2.Verific ˘a autobuzele prezente ˆın trafic s ¸i le
afis ¸eaz ˘a pe hart ˘a.
3.Cere vizualizarea unui autobuz din cele furnizate. 4.Afis ¸eaz ˘a detalii despre autobuzul selectat.
11
Analiza software a sistemului Modelul funct ¸ional
Caz de utilizare 3
Nume: Achizit ¸ionare bilet
Descriere: Descrie comportamentul sistemului s ¸i interact ¸iunea acestuia cu c ˘al˘atorul
pentru a putea cump ˘ara un bilet pe o anumita rut ˘a de c ˘al˘atorie.
Actori software: C˘al˘ator
Eveniment declans ¸ator: C˘al˘atorul cere achizit ¸ionarea unui bilet.
Precondit ¸ii: Sistemul a verificat datele selectate de c ˘atre c ˘al˘ator.
Postcondit ¸ii: Sistemul a memorat datele s ¸i a furnizat un bilet de c ˘al˘atorie.
Referint ¸e ˆıncrucis ¸ate: F5.1-F5.7,F6.1-F6.2
Flux principal
C˘al˘ator Sistem
1.Cere achizit ¸ionarea unui bilet. 2.Afis ¸eaz ˘a o list ˘a cu liniile s ¸i tipurile de bilete
3.Selecteaz ˘a linia s ¸i tipul biletului dorit. 4.Verific ˘a validitatea optiunilor selectate de c ˘atre
c˘al˘ator.
5.ˆIn funct ¸ie de opt ¸iunile alese, verific ˘a dac ˘a are credit
suficient s ¸i achizit ¸ioneaz ˘a un bilet [A2] .
6.Memoreaz ˘a biletul cump ˘arat.
7.Afis ¸eaz ˘a detalii despre biletul curent.
8.Cere vizualizarea biletelor achizit ¸ionate. 9.Afis ¸eaz ˘a biletele cumparate.
Flux alternativ
[A1] Nu a selectat linia s ¸i tipul biletului:
1.Afis ¸eaz ˘a un mesaj de eroare.
2.Continu ˘a cu pasul 2 din fluxul principal.
[A2] Nu are credit suficient:
1.Afis ¸eaz ˘a un mesaj de informare.
2.Continu ˘a cu pasul 2 din fluxul principal.
12
Analiza software a sistemului Modelul funct ¸ional
Caz de utilizare 4
Nume: Creare cont s ¸ofer
Descriere: Descrie comportamentul sistemului s ¸i interact ¸iunea acestuia cu administra-
torul pentru a crea un cont pentru s ¸ofer.
Actori software: Administrator
Eveniment declans ¸ator: Administratorul cere crearea unui cont unui s ¸ofer
Precondit ¸ii: Sistemul a verificat datele introduse de c ˘atre administrator.
Postcondit ¸ii: Sistemul a memorat datele s ¸i a furnizat informat ¸iile despre noul cont
creat.
Referint ¸e ˆıncrucis ¸ate: F1.1-F1.5
Flux principal
Administrator Sistem
1.Cere crearea unui cont nou 2.Afis ¸eaz ˘a un formular
3.Completeaz ˘a formularul 4.Verific ˘a datele introduse [A1]
5.Creaz ˘a un cont de utilizator s ¸i parol ˘a
6.Memoreaza contul creat
7.Trimite datele noului cont c ˘atre s ¸ofer s ¸i afis ¸eaz ˘a un mesaj
Flux alternativ
[A1] A introdus un e-mail invalid sau contul deja exist ˘a.
1.Afis ¸eaz ˘a un mesaj de eroare.
2.Continu ˘a cu pasul 2 din fluxul principal.
Modelul funct ¸ional cont ¸ine, totodat ˘a, diagrama cazurilor de utilizare, cazurile de utilizare s ¸i
relat ¸iile dintre aceastea. Leg ˘aturile dintre ele sunt de mai multe feluri s ¸i sunt prezentate ˆın
13
Analiza software a sistemului Modelul funct ¸ional
tabelul urm ˘ator[UMLS]:
Denumire Semantic ˘a Sintaxa concret ˘a
UML
Relat ¸ia de asociere Descrie comunicarea dintre
actori s ¸i sistem
Relatia de dependent ¸ ˘a mar-
cat˘a cu stereotipul includeOri de cate ori va fi executat
cazul de utilizare A, va fi exe-
cutat s ¸i cazul de utilizare B
Relat ¸ia de dependent ¸ ˘a mar-
cat˘a cu stereotipul extendDac˘a se execut ˘a cazul A s ¸i
esteˆındeplinit ˘a o condit ¸ie, se
execut ˘a s ¸i cazul B
Relat ¸ia de generalizare Are loc ˆıntre actori sau ˆıntre
cazuri de utilizare
Diagrama cazurilor de utilizare software pentru aplicat ¸ia FutureBus este prezentat ˘aˆın
Figura 3.1.
Figura 3.1 : Diagrama cazurilor de utilizare software
14
Analiza software a sistemului Diagrama de secvent ¸e de sistem
3.4 Diagrama de secvent ¸e de sistem
3.4.1 Evenimente de sistem
Aparit ¸ia evenimentelor de sistem este determinat ˘a de c ˘atre act ¸iunile actorilor asupra sis-
temului software, furniz ˆand un r ˘aspuns vizibil actorului declans ¸ator. Avem trei tipuri de
evenimente:
1.flux de date(determinate de act ¸iuni ce cont ¸in transmiterea datelor sau a informat ¸iilor)
2.control(apar ca urmare a act ¸iunilor ce nu cont ¸in explicit date)
3.temporale(ap ˘arute datorit ˘a trecerii timpului)
Important este c ˘a act ¸iunile efectuate de actorii software produc evenimente de sistem [CBDAS].
ˆIn urma analizei cazului de utilizare Autentificare s ¸ofer a aplicat ¸iei FutureBus
s-au dedus urm ˘atoarele evenimente de sistem:
Evenimente flux de date Evenimente de control
Cere autentificarea ˆın sistem Trimite date din formularul de autentificare
Completeaz ˘a formularul Trimite opt ¸iunea selectat ˘a
3.4.2 Diagrame de secvent ¸e de sistem
Conform sursei [CBDAS], diagramele de secvent ¸e de sistem sunt o specializare a diagramelor
de secvent ¸e, deoarece arat ˘a interact ¸iunea dintre actori s ¸i sistem, prin intermediul mesajelor
trimise ˆıntre ei. Mesajul este comunicarea ˆıntre dou ˘a obiecte ˆıntr-un sens. Destinatarul ˆın
aceast ˘a comunicare poate fi chiar expeditorul (datorit ˘a modific ˘arii st ˘arii obiectului curent).
ˆIn tabelul urm ˘tor facem o trecere ˆın revist ˘a a conceptelor diagramei de secvent ¸e s ¸i a sintaxei
15
Analiza software a sistemului Diagrama de secvent ¸e de sistem
lorˆın limbajul UML.
Concept-Semantic ˘a Sintaxa UML
Linia de viat ¸ ˘a – indic ˘a existent ¸a unui obiect pe o pe-
rioad ˘a de timp
Mesajul<<create>> -ˆın aceast ˘a perioad ˘a este
creat un obiect
Mesajul<<destroy>> – descrie distrugerea unui
obiect
Activare – indic ˘a executarea unei operat ¸ii de c ˘atre
obiectul ˆınsus ¸i sau prin intermediul altor obiecte
Mesajul<<return>> – indic ˘a tipul de date al
informat ¸iilor returnate de destinatar
Diagramele de secvente de sistem realizate ˆın urma analizei aplicat ¸iei FutureBus le vom
prezenta ˆın cele ce urmeaza. ˆIn Figura 3.2 este prezentat ˘a diagrama de secvent ¸e de sistem
pentru cazul de utilizare Achizit ¸ionare Bilet .
16
Analiza software a sistemului Diagrama de secvent ¸e de sistem
Figura 3.2 : Diagrama de secvent ¸e de sistem pentru Achizit ¸ionare Bilet
Diagrama de secvent ¸e de sistem pentru cazul de utilizare Autentificare S ¸ofer
este prezentat ˘aˆın Figura 3.3.
Figura 3.3 : Diagrama de secvent ¸e de sistem pentru Autentificare S ¸ofer
Diagrama de secvente de sistem pentru cazul de utilizare Creare cont s ¸ofer este
prezentat ˘aˆın Figura 3.4.
17
Analiza software a sistemului Diagrama de secvent ¸e de sistem
Figura 3.4 : Diagrama de secvent ¸e de sistem pentru Creare cont s ¸ofer
Diagrama de secvent ¸e de sistem pentru cazul de utilizare Vizualizare Autobuze
este prezentat ˘aˆın Figura 3.5.
Figura 3.5 : Diagrama de secvent ¸e de sistem pentru Vizualizare Autobuze
18
Analiza software a sistemului Diagrama de secvent ¸e de sistem
3.4.3 Diagrama de context
Diagrama de context a sistemului software poate fi reprezentat ˘a prin actorii software ce
interact ¸ioneaz ˘a cu sistemul s ¸i operat ¸iile acestuia. Este realizat ˘a din perspectiv ˘a structural ˘a,
unde sistemul este reprezentat printr-o clas ˘a ale c ˘arei operat ¸ii sunt operat ¸ii de sistem. ˆIn
Figura 3.6 putem vedea diagrama de context a sistemului FutureBus .
Figura 3.6 : Diagrama de context a sistemului FutureBus
3.4.4 Modelul domeniului
ˆIn realizarea unui sistem software, un pas important ˆıl reprezint ˘a modelul domeniului care
are la baz ˘a diagrama de clase. Acest model cont ¸ine obiecte ale unei companii: c ˘al˘atori,
directori, controlori, s ¸oferi, informat ¸ii structurate, etc. Pentru a se realiza o diagram ˘a de
clase, se utilizeaz ˘a urm ˘atoarele concepte:
1.Clas˘a: descrierea unui grup de obiecte cu propriet ˘at ¸i similare, cu acelas ¸i comporta-
ment, cu aceleas ¸i relat ¸ii cu alte obiecte s ¸i cu o aceeas ¸i semantic ˘a;
2.Atribut: caracteristici ale obiectelor det ¸inute de clase;
3.Operatie: funct ¸ie sau transformare aplicat ˘a unui obiect;
19
Analiza software a sistemului Diagrama de secvent ¸e de sistem
Clasele sunt legate prin relat ¸ii, fiecare tip av ˆand semantica ei, pe care o explic ˘amˆın
urm˘atorul tabel [TUMLR1999]:
Denumire Semantic ˘a Sintaxa concret ˘a
UML
Relat ¸ia de asociere Mult ¸imea de leg ˘aturi ˆıntre
obiectele claselor implicate
Relat ¸ia de agregare Reprezint ˘a formarea unui lu-
cru din p ˘art ¸ile sale
Relat ¸ia de compozit ¸ie Este o relat ¸ie de agregare mai
puternic ˘a, deoarece un obiect
agregat are responsabiltatea
cre˘arii s ¸i distrugerii p ˘art ¸ilor
sale
Relat ¸ia de generalizare/spe-
cializareFace leg ˘atura ˆıntre dou ˘a clase
ˆın care una este supraclas ˘a s ¸i
cealalt ˘a este subclas ˘a
Relat ¸ia de dependent ¸ ˘a Relat ¸ie prin care dac ˘a se
modific ˘a o clas ˘a duce la
afectarea altei clase cu care
este legat ˘a
Pentru a realiza diagrama de clase, se identific ˘a substantivele din descrierea problemei,
sunt analizate s ¸i transformate ˆın clase sau atribute. Prin analiza descrierii problemei, a fost
realizat ˘a diagrama de clase pentru sistemul FutureBus. Aceasta diagram ˘a este prezentat ˘a
in Figura 3.7.
20
Analiza software a sistemului Diagrama de secvent ¸e de sistem
Figura 3.7 : Diagrama de clase a sistemului FutureBus
21
Capitolul 4
Proiectarea s ¸i implementarea
aplicat ¸iei
Proiectarea reprezint ˘a o activitate de baz ˘a, esent ¸ial ˘aˆın construirea unei solut ¸ii conceptuale
rezultat ˘aˆın urma cerint ¸elor identificate s ¸i descrise ˆın faza de analiz ˘a prezentat ˘aˆın capitolul
anterior. ˆIn faza de proiectare este realizeaz ˘a arhitectura software a sistemului dezvoltat.
4.0.1 Arhitecturi s ¸i stiluri arhitecturale
Arhitectura software reprezint ˘a un model de organizare a sistemelor software. Acest model
cont ¸ine subsisteme, clase sau servicii web, relat ¸iile dintre ele s ¸i mediul ˆın care se afl ˘a, s ¸i
principiile care realizeaz ˘a proiectarea s ¸i evolutia arhitecturii. Arhitectura software ajut ˘a la
ˆıntelegerea, construct ¸ia, managementul s ¸i evolut ¸ia unui sistem software [CBDAS].
ˆIn realizarea unui sistem software, se utilizeaz ˘a unul sau mai multe stiluri arhitecturale.
Un stil aritectural are la baz ˘a un vocabular de proiectare, o descriere a semanticii lui s ¸i
constr ˆangeri asupra modului ˆın care este folosit.
22
Proiectarea s ¸i implementarea aplicat ¸iei Proiectarea s ¸i implementarea aplicat ¸iei
Se cunosc mai multe stiluri arhitecturale, prezentate succint ˆın cele ce urmeaza:
1.Stilul arhitectural conducte s ¸i filtre
Fluxul de date este citit de c ˘atre filtre iar transmiterea datelor se face cu ajutorul con-
ductelor. Acest stil poate fi reutilizat, suport ˘a atˆat concurent ¸ ˘a cˆat s ¸i anumite tipuri de
analiz ˘a. Cu toate acestea, se poate ajunge la o organizare dificil ˘a a calculului s ¸i nu se
recomand ˘a pentru aplicat ¸iile bazate pe evenimente.
2.Stilul arhitectural client-server
Pentru a fi utilizat acest stil, sistemul trebuie s ˘a fie format dintr-un num ˘ar de procese
client s ¸i un num ˘ar de procese server ce interact ¸ioneaz ˘a realiz ˆand o activitate. Orga-
nizarea aceasta este benefic ˘a deoarece faciliteaz ˘a independent ¸a client ¸ilor, oferind un
puternic control asupra resurselor serverului. Cu toate acestea, nu este la fel de puter-
nic ca s ¸i ret ¸eaua peer to peer.
3.Stilul arhitectural bazat pe evenimente
Evenimentele rezult ˘a din comunicarea componentelor. O component ˘a anunt ¸ ˘a o alta de
aparitia unui eveniment, dac ˘a acesta s-a inregistrat. Avantajul utiliz ˘arii acestui stil este
c˘a poate fi reutilizat. Totus ¸i apar probleme la corectitudinea funct ¸ionalit ˘at ¸ii sistemului
sauˆın timpul schimbului de date.
4.Stilul arhitectural pe straturi
ˆIn cadrul acestui stil, organizarea se face pe nivele, fiecare nivel furnizeaz ˘a servicii
stratului superior s ¸i ˆıi este client celui inferior. ˆIn cadrul acestui stil, baza o reprezint ˘a
izolarea logicii fat ¸ ˘a de considerentele interfet ¸ei cu utilizatorul. Astfel rezult ˘a o aplicat ¸ie
a c˘arei aspect vizual se modific ˘a usor, neafect ˆandu-se alte nivele. Un avantaj al uti-
liz˘arii acestui stil, este faptul c ˘a suport ˘a reutilizarea ˆıns˘a nu toate sistemele pot fi struc-
turate us ¸or pe straturi.
5.Stilul Model-View-Controller
ˆIn cadrula cestui stil, baza o reprezint ˘a izolarea logicii fat ¸ ˘a de considerentele interfet ¸ei
cu utilizatorul. Astfel rezult ˘a o aplicat ¸ie a c ˘arei aspect vizual se modic ˘a us ¸or, nea-
fectˆandu-se alte nivele[CBDAS].
MVC descompune obiectele aplicai ¸ei ˆın 3 categorii:
(a)Model – cu rol ˆın ment ¸inerea st ˘arii curente a aplicat ¸iei
(b)View – are rol ˆın verificarea componentelor interesate ˆın mod direct de starea
actual ˘a a aplicat ¸iei
(c)Controller – are rol procesarea s ¸i r ˘aspunderea la evenimente
ˆIn funct ¸ie de arhitectura sistemului, aceste stiluri pot fi combinate. ˆIn proiectarea
arhitecturii sistemului FutureBus , ca s ¸i stiluri arhitecturale am utilizat stilul client-
server combinat cu stilul MVC(Model-View-Controller)[CBDAS].
23
Proiectarea s ¸i implementarea aplicat ¸iei Modele de proiectare de atribuire a responsabilit ˘at ¸ilor
4.1 Modele de proiectare de atribuire a respons-
abilit ˘at ¸ilor
Cu ajutorul acestor modele se descriu principii fundamentale ale proiect ˘arii orientate spre
obiecte s ¸i atribuirii responsabilit ˘at ¸ilor claselor.O responsabilitate reprezint ˘a obligat ¸ia pe care
o anumit ˘a clas ˘a trebuie s ˘a oˆındeplineasc ˘a.
Exist ˘a probleme pentru a c ˘aror rezolvare este g ˘asit˘a cu ajutorul anumitor modele de
proiectare [CBDAS].
ˆIn continuare vom enumera modelele de proiectare utilizate ˆın realizarea arhitecturii
sistemului FutureBus s ¸i problemele generale pe care acestea le rezolv ˘a.ˆIn sect ¸iunea
4.1.2 urmeaz ˘a s˘a explic ˘am modul ˆın care am folosit aceste modele la proiectarea sistemului
FutureBus .
1.Expert(Information Expert)
Pentru a s ¸ti c ˘arei clase i se atribuie o anumit ˘a responsabilitate, utiliz ˘am acest model.
Asadar, o anumit ˘a responsabilitate este atribuit ˘a acelei clase ce det ¸ine toate informat ¸iile
necesare ˆındeplinirii ei.
2.Creator
Acest model se foloses ¸te pentru a atribui unei clase B responsabilitatea cre ˘arii unui
obiect al altei clase A. Pentru a putea da aceast ˘a responsabilitate trebuie ca o clasa B sa
verifice dac ˘a agreg ˘a obiectele lui A sau contine obiecte ale lui A sau foloses ¸te obiecte
ale lui A sau are date de init ¸ializare ce vor fi transmise lui A atunci c ˆand obiectul este
creat.
3.Cuplare slab ˘a(Low Coupling)
ˆIn cele mai multe cazuri, cuplarea se utilizeaz ˘a pentru a vedea leg ˘atura dintre elemente
sau c ˆate cunos ¸tinte are un element despre alte elemente. Pentru a realiza cuplarea ˆıntre
dou˘a clase A s ¸i B, una din urm ˘atoarele afirmat ¸ii trebuie s ˘a fie adevarata:
(a)A are un atribut de tip B;
(b)un obiect al clasei A apeleaz ˘a servicii ale unui obiect din clasa B;
(c)A are o operat ¸ie ce refer ˘a un obiect al clasei B;
(d)A este o subclas ˘a direct ˘a sau indirect ˘a a lui B;
(e)B este o interfat ¸ ˘a s ¸i A este o clas ˘a ce realizeazt ˘a interfat ¸a lui B;
4.Coeziune ˆınalt˘a(High Coesion)
ˆIn programarea orientat ˘a spre obiecte, pentru a putea vedea c ˆat de corelate sunt re-
sponsabilit ˘at ¸ile unei clase, se utilizeaz ˘a coeziunea. Astfel c ˘a o clas ˘a cu coeziune ˆınalt˘a
are responsabilit ˘at ¸ile str ˆans legate ˆıntre ele nepun ˆand accentul pe prea multe obiective.
24
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
5.Controller
Atunci c ˆandˆın sistem se primesc evenimente externe, se adaug ˘a cˆate o clas ˘a numit ˘a
controller care decupleaz ˘a sursa evenimentelor externe de clasele interne ce se ocup ˘a
cu gestionarea evenimentului sau evenimentelor, dup ˘a caz. ˆIn proiectarea aplicat ¸iei,
fiec˘arui caz de utilizare ˆıi este asociat unul sau mai mult ¸i controlleri, ˆın funct ¸ie de
complexitatea cazului de utilizare. Astfel se ˆımp˘art ¸e fluxul de control ˆın p˘arti gestion-
abile.
6.Polimorfism
Polimorfismul foloses ¸te supraclase abstracte sau interfet ¸e. Atunci c ˆand apar probleme
ˆın crearea de clase reutilizabile sau ˆın rezolvarea unei reponsabilit ˘at ¸iˆın clase diferite,
se utilizeaz ˘a acest model ce foloses ¸te operat ¸ii specifice claselor al c ˘aror comportament
variaz ˘a.
7.Invent ¸ie (en: Pure Invention)
Atunci c ˆand unei clase ˆıi revine o responsabilitate astfel ˆıncat s ˘a nu fie ˆınc˘alcate prin-
cipiile de coeziune ˆınalt˘a s ¸i cuplare slab ˘a, solut ¸ia problemei ˆıi revine acestui model
de proiectare. Astfel c ˘a acesta atribuie responsabilit ˘at ¸ile unei clase artificial ˘a pentru a
p˘astra un echilibru pe baza acelor principii. Clasa software artificial ˘a este inventat ˘a de
c˘atre proiectant[CBDAS].
4.2 Diagrama de interact ¸iune
Modul ˆın care interact ¸ioneaz ˘a dou ˘a sau mai multe obiecte ˆın cadrul unui caz de utilizare, este
descris prin intermediul diagramelor de interact ¸iune.
Diagramele de interact ¸iune sunt de doua tipuri:
1.diagrama de secvent ¸e;
2.diagrama de comunicare;
Avantajul utiliz ˘arii diagramelor de secvent ¸e este faptul c ˘a acestea indic ˘a ordinea ˆın care sunt
transmise mesajele, av ˆand astfel s ¸i o flexibilitate mult mai mare dec ˆatˆın cazul diagramelor
de comunicare.
Cele dou ˘a diagrame evident ¸iaz ˘a acelas ¸i lucru s ¸i anume colaborarea obiectelor c ˆand este
realizat fiecare caz de utilizare cu diagrama de interact ¸iune aferent ˘a[CBDAS]. Diferent ¸a din-
tre cele dou ˘a tipuri de diagrame o vom exemplifica dup ˘a cum urmeaz ˘a: Figura 4.1 reprezint ˘a
diagrama de secvent ¸e, iar Figura 4.2 reprezint ˘a diagrama de comunicare.
25
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
Figura 4.1 : Diagrama secvent ¸e
Figura 4.2 : Diagrama de comunicare
ˆIn continuare vom prezenta ˆın faza de proiectare diagrama de secvente pentru cazul de uti-
lizareAchizit ¸ionare bilet ˆın Figura 4.3.
26
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
Figura 4.3 : Diagrama de secvent ¸e pentru cazul de utilizare Achizit ¸ionare bilet
27
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
Pentru a realiza interfat ¸a cu utilizatorul s-a folosit limbajul XML care a facilitat modul
de interact ¸iune cu utilizatorul. O parte demonstrativ ˘a a codului XML este prezentat ˘aˆın codul
surs˘a ce urmeaz ˘a:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="drawable/backsms"
tools:context=".ControllerBilete">
<ImageView
android:layout_width="180px"
android:layout_height="50px"
android:src="drawable/btnc"
android:id="+id/button"
android:layout_below="+id/spinner"
android:layout_centerHorizontal="true"
android:layout_marginTop="26dp" />
<Spinner
android:id="+id/spinner"
android:layout_width="280dp"
android:layout_height="43px"
android:background="drawable/spinner"
android:layout_marginBottom="34dp"
android:layout_alignBottom="+id/spinner_calatorie"
android:layout_centerHorizontal="true">
</Spinner>
<Spinner
android:id="+id/spinner_calatorie"
android:layout_width="280dp"
android:layout_height="43px"
android:background="drawable/spinner"
android:layout_alignParentBottom="true"
android:layout_alignLeft="+id/spinner"
android:layout_alignStart="+id/spinner"
android:layout_marginBottom="184dp">
</Spinner>
<TextView android:text="string/message_received"
android:id="+id/txtmesaj"
android:layout_width="350dp"
android:layout_height="200dp"
28
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
android:textSize="25dp"
android:textAlignment="center"
android:textColor="color/colorPrimaryDark"
android:layout_below="+id/button"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="33dp" />
</RelativeLayout>
ˆIn Figura 4.4 afis ¸ ˘am o fereastr ˘a rezultat ˘aˆın urma codului inserat mai sus, din care utilizatorul
poate selecta linia s ¸i tipul biletului pentru a-s ¸i achizit ¸iona un bilet.
Figura 4.4 : Fereastr ˘a achizit ¸ionare bilet
Pentru implementarea acestui caz de utilizare, conform diagramei de secvent ¸e regasit ˘a
ˆın Figura 4.3, am folosit clasa ControllerBilete, pentru a gestiona cu us ¸urint ¸ ˘a fluxul de con-
trol.
Conform sursei [CBLDPOO], aceast ˘a clas ˘a decupleaz ˘a sursa evenimentelor externe de
cele interne, gestion ˆand evenimentul.
Aceast ˘a clas ˘a cont ¸ine mai multe metode pentru a putea realiza achizit ¸ionarea unui bilet.
MetodaonCreate(Bundle savedInstanceState) care creeaz ˘a o instant ¸ ˘a nou ˘a a
ferestrei de achizit ¸ie a biletului, acest lucru put ˆand fi vizibil ˆın codul urm ˘ator:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bilet);
getSupportActionBar().setTitle("");
29
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
getSupportActionBar().setBackgroundDrawable(getResources()
.getDrawable(R.drawable.toolbar));
mydb = new ManagerBazaDeDate(this);
creareMesaj();
}
Figura 4.5 prezint ˘a o demonstrat ¸ie a unei achizit ¸ion ˘ari de bilet.
Figura 4.5 : Selectare linie si tip bilet pentru achizit ¸ionare de bilet
30
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
Dac˘a utilizatorul aplicat ¸iei nu a selectat linia sau tipul biletului, aplicat ¸ia afis ¸eaz ˘a un
mesaj de informare, acest lucru fiind vizibil ˆın Figura 4.6.
Figura 4.6 : C˘al˘atorul nu a selectat nici linia s ¸i nici coloana
Dac˘a au fost selectate at ˆat linia c ˆat s ¸i tipul biletului, atunci se primes ¸te un cod de
c˘al˘atorie care este afis ¸at pe ecran (Figura 4.7).
Figura 4.7 : C˘al˘atorul a primit un cod de c ˘al˘atorie
31
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
MetodacreareMesaj() creeaz ˘a un mesaj ˆın funct ¸ie de ceea ce c ˘al˘atorul selecteaz ˘a
din fereastra de Achizit ¸ionare bilet. Aceast ˘a metod ˘a este prezentat ˘a dup ˘a cum urmeaz ˘a:
protected void creareMesaj(){
intentFilter = new IntentFilter();
intentFilter.addAction("SMS_RECEIVED_ACTION");
spinner=(Spinner)findViewById(R.id.spinner);
adapter=ArrayAdapter.createFromResource(this,
R.array.linie,android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.
layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new
AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int
position, long id) {
if(position==0){
msg1="neselectat";
return;
}else {
if (position == 6) {
msg1 = "540";
} else {
if (position == 9) {
msg1 = "243";
} else {
msg1 = (String) parent.getItemAtPosition(position);
}
}
}
}
public void onNothingSelected(AdapterView<?> parent) {
Toast.makeText(getBaseContext(), "Selecteaza linia pe care doresti
calatoria!", Toast.LENGTH_LONG).show();
}
});
spinner_calatorie=(Spinner)findViewById(R.id.
spinner_calatorie);
adapter_calatorie=ArrayAdapter.createFromResource(this,R.
array.calatorie,android.R.layout.simple_spinner_item);
adapter_calatorie.setDropDownViewResource(android.R.
layout.simple_spinner_dropdown_item);
spinner_calatorie.setAdapter(adapter_calatorie);
spinner_calatorie.setOnItemSelectedListener(new
AdapterView.OnItemSelectedListener() {
Override
public void onItemSelected(AdapterView<?> parent, View view, int
position1, long id) {
32
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
if(position1==0){
msg2="neselectat";
return;
}else{
if(position1==1){
msg2="L";
}else {
if (position1 == 2) {
msg2 = "ZI";
} else {
if (position1 == 3) {
msg2 = "ESTIVAL";
}
}
}
}
}
Override
public void onNothingSelected(AdapterView<?> parent) {
Toast.makeText(getBaseContext(), "Selecteaza tipul calatoriei!",
Toast.LENGTH\_LONG).show();
}
});
no="0747193218";
btnSendSms=(ImageView)findViewById(R.id.button);
btnSendSms.setOnClickListener(new View.OnClickListener() {
Override
public void onClick(View v) {
if(msg1!="neselectat" msg2!="neselectat") {
if (msg2 == "ESTIVAL") {
mesaj = msg2;
sendSms(mesaj);
} else {
mesaj = msg2 + msg1;
sendSms(mesaj);
}
}
else
Toast.makeText(getBaseContext(), "Selecteaza linia si tipul
biletului!", Toast.LENGTH\_LONG).show();
}
});
Dup˘a ce se creeaz ˘a mesajul, acesta trebuie s ˘a fie trimis c ˘atre num ˘arul de telefon de la care se
primes ¸te un mesaj ce cont ¸ine un cod de c ˘al˘atorie.
protected void sendSms(String message){
String number=no;
message=mesaj;
33
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
SmsManager manager= SmsManager.getDefault();
manager.sendTextMessage(number, null, message, null, null);
Context context = getApplicationContext();
CharSequence text = "Va rugam sa asteptati mesajul de confirmare!";
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
}
ˆInAnexa1 este prezentat codul surs ˘a care face posibil ˘a inserarea ˆın baza de date a
informat ¸iilor biletului nou achizit ¸ionat.
ˆIn cadrul urm ˘atoarei ferestre, exist ˘a posibilitatea select ˘arii unei opt ¸iuni dintr-un meniu
creat special pentru utilizatorii care frecventeaz ˘a aplicat ¸ia. Astfel c ˘aˆın Figura 4.8 se poate
observa acest meniu simplu din care se pot vizualiza biletele achizit ¸ionate.
Figura 4.8 : Meniul aplicat ¸iei s ¸i biletele achizit ¸ionate
ˆIn continuare vom prezenta ˆın faza de proiectare diagrama de secvente pentru cazul de
utilizareAutentificare S ¸ofer ˆın Figura 4.9.
34
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
Figura 4.9 : Diagrama de secvent ¸e pentru cazul de utilizare Autentificare S ¸ofer
Preluarea datelor ˆın cadrul aplicat ¸iei se face ˆın clasaAutentificare S ¸ofer . Co-
dul surs ˘a care face posibil acest lucru este prezentat dup ˘a cum urmeaz ˘a:
bLogin.setOnClickListener(new View.OnClickListener() {
35
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
Override
public void onClick(View v) {
final String username = etUsername.getText().toString();
final String password =
MD5.encrypt(etPassword.getText().toString());
Response.Listener<String> responseListener = new
Response.Listener<String>() {
Override
public void onResponse(String response) {
try {
System.out.print("aici");
JSONObject jsonResponse = new JSONObject(response);
boolean success = jsonResponse.getBoolean("success");
System.out.println("test pentru succes:"+success);
if (success) {
AlertDialog.Builder builder = new
AlertDialog.Builder(AutentificareSofer.this);
builder.setMessage("Login Success")
.setNegativeButton("Ok", null)
.create()
.show();
Intent intent = new Intent(AutentificareSofer.this,
FereastraPrincipala.class);
intent.putExtra("username", username);
AutentificareSofer.this.startActivity(intent);
} else {
AlertDialog.Builder builder = new
AlertDialog.Builder(AutentificareSofer.this);
builder.setMessage("Date de autentificare gresite")
.setNegativeButton("Reincearca", null)
.create()
.show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
};
CerereAutentificare cerereAutentificare = new
CerereAutentificare(username, password, responseListener);
RequestQueue queue =
Volley.newRequestQueue(AutentificareSofer.this);
queue.add(cerereAutentificare);
}
});
36
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
Constructorul CerereAutenficare creeaz ˘a obiectulcerereAutentificare
cu ajutorul c ˘aruia realizeaz ˘a o cerere c ˘atre server. Mai jos este codul constructorului:
public class CerereAutentificare extends StringRequest {
private static final String LOGIN_REQUEST_URL =
"https://svasile.ro/closcaru/login.php"
private Map<String, String> params;
public CerereAutentificare(String username, String password,
Response.Listener<String> listener) {
super(Method.POST, LOGIN_REQUEST_URL, listener, null);
params = new HashMap<>();
params.put("Nume", username);
params.put("Parola", password);
}
Override
public Map<String, String> getParams()
{
return params;
}
}
Descrierea de mai sus poate fi urm ˘arit˘aˆın Figura 4.10
Figura 4.10 : Autentificare S ¸ofer
ˆIn figura 4.11, dac ˘a s ¸oferul gres ¸es ¸te datele de autentificare, aplicat ¸ia afis ¸eaz ˘a un mesaj
informativ.
37
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
Figura 4.11 : Autentificare S ¸ofer, credent ¸iale gres ¸ite
Dac˘a s ¸oferul a introdus datele de autentificare corecte, fereastra nou afis ¸at ˘a permite
acestuia s ˘a porneasc ˘a localizarea sau, dup ˘a caz, sa o opreasc ˘a, acest lucru fiind vizibil ˆın
Figura 4.12.
Figura 4.12 : Fereastra de localizare autobuz
Odat ˘a pornit ˘a localizarea, se realizeaz ˘a o conectare la server ˆın care se executa interog ˘ari
asupra bazei de date pentru a se modifica c ˆampurile latitudine, longitudine s ¸i vitez ˘a.
38
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
ˆIn codul urm ˘ator se prezint ˘a conectarea la server care se face ˆın clasaCereriUpdate .
public class CereriUpdate extends StringRequest {
private static final String REGISTER_REQUEST_URL =
"https://svasile.ro/closcaru/update_autobuz.php";
private Map<String, String> params;
public CereriUpdate(String nume, Double latitudine, Double
longitudine, long viteza, Response.Listener<String> listener) {
super(Method.POST, REGISTER_REQUEST_URL, listener, null);
params = new HashMap<>();
params.put("Nume", nume);
params.put("Latitudine", latitudine + "");
params.put("Longitudine", longitudine + "");
params.put("Viteza", viteza + "");
}
Override
public Map<String,String> getParams(){
return params;
}
}
Fis ¸ierul PHP care realizeaz ˘a conectarea la baza de date s ¸i realizeaz ˘a modificarea c ˆampurilor
ment ¸ionate mai sus, este redat ˆın cele ce urmeaz ˘a:
<?php
$con = mysqli_connect("localhost:3306", "svasiler_closcar",
"Closcaru95", "svasiler_closcaru_autobuze");
$nume = $_POST["Nume"];
$parola = $_POST["Parola"];
$latitudine = $_POST["Latitudine"];
$longitudine = $_POST["Longitudine"];
$viteza= $_POST["Viteza"];
$statement = mysqli_prepare($con, "Update locatii INNER JOIN
autobuze ON locatii.Id_autobuz=autobuze.Id SET
locatii.Latitudine=?, locatii.Longitudine=?, locatii.Viteza=?
Where autobuze.Nume =?");
mysqli_stmt_bind_param($statement, "ddss", $latitudine,
$longitudine, $viteza, $nume);
mysqli_stmt_execute($statement);
$response = array();
$response["success"] = false;
if(mysqli_stmt_execute($statement)){
$response["success"] = true;
39
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
}
echo json_encode($response);
?>
Clasa care preia informat ¸iile de la s ¸ofer, le proceseaz ˘a s ¸i le trimite c ˘atre baza de date
esteLocalizareAutobuz . MetodagetLocation() seteaz ˘a perioada, acuratet ¸ea cu
care se realizeaz ˘a localizarea s ¸i priorit ˘at ¸ile de localizare.
private void getLocation() {
locationRequest = LocationRequest.create();
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
locationRequest.setInterval(LOCATION_INTERVAL);
locationRequest.setFastestInterval(LOCATION_INTERVAL);
fusedLocationProviderApi = LocationServices.FusedLocationApi;
googleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
if (googleApiClient != null) {
googleApiClient.connect();
}
}
Google Maps API are o mult ¸ime de funct ¸ionalit ˘at ¸i. Pentru a putea s ¸ti c ˘a autobuzul se
deplaseaz ˘a, am folosit metoda onLocationChanged(Location location) . Dupa
cum observam ˆın codul de mai jos, ˆın interiorul acestei metode, se preiau coordonatele au-
tobuzului care sunt trecute ˆın baza de date cu ajutorul constructorului CereriUpdate
(numeAutobuz, Latitudine, Longitudine, Viteza, responseListener) .
public void onLocationChanged(Location location) {
Toast.makeText(mContext, "Driver location :" +
location.getLatitude() + " , " + location.getLongitude(),
Toast.LENGTH_SHORT).show();
System.out.println("lat: " + location.getLatitude() + " lang:" +
location.getLongitude());
final Double Latitudine = location.getLatitude();
final Double Longitudine = location.getLongitude();
final long Viteza = (long) location.getSpeed();
LocationManager locationManager = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
40
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
String bestprovider = locationManager.getBestProvider(criteria,
true);
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
return;
}
currentlocation =
locationManager.getLastKnownLocation(bestprovider);
double speed = 0;
if (this.mLastLocation != null)
{
Location loc = new Location("");
loc.setLatitude(44.205256);
loc.setLongitude(28.6438805);
double dist = location.distanceTo(loc);
speed = location.getSpeed();
float timp = (float) (dist/speed);
Toast.makeText(mContext, speed+" t:"+timp,
Toast.LENGTH_SHORT).show();
}
if (location.hasSpeed())
{
speed = location.getSpeed();
}
this.mLastLocation = location;
Response.Listener<String> responseListener = new
Response.Listener<String>() {
Override
public void onResponse(String response) {
try {
JSONObject jsonResponse = new JSONObject(response);
boolean success = jsonResponse.getBoolean("success");
if (success) {
Log.e(TAG,"Update reusit");
} else {
Log.e(TAG,"Update nereusit");
}
41
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
} catch (JSONException e) {
e.printStackTrace();
}
}
}
CereriUpdate cereriUpdate = new CereriUpdate(numeAutobuz,
Latitudine, Longitudine, Viteza, responseListener);
RequestQueue queue =
Volley.newRequestQueue(LocalizareAutobuz.this);
queue.add(cereriUpdate);
}
Urm ˘atorul caz de utilizare descris este Vizualizare autobuze . Diagrama de
secvent ¸e a acestui caz de utilizare este prezentat ˘aˆın Figura 4.13.
42
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
Figura 4.13 : Diagrama in faz ˘a de proiectare pentru cazul de utilizare Vizualizare autobuze
43
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
Pentru implementarea acestui caz de utilizare am folosit clasele ControllerAutobuze ,
Fereastr ˘a principal ˘asiFereastr ˘a autobuze , iar pentru vizualizarea auto-
buzelor din trafic, clasa VizualizareInformatii .
Atunci c ˆand c ˘al˘atorul selecteaz ˘a din FereastraPrincipal ˘a vizualizarea autobuzelor, se
apeleaz ˘a metodacereVizualizareAutobuze() , care prin intermediul controller-ului
ControllerAutobuze creeaz ˘a o fereastr ˘aˆın care sunt afis ¸ate autobuzele din trafic (Figura
4.14).
Figura 4.14 : Meniul principal s ¸i fereastra de vizualizare a autobuzelor
Cˆand este creat ˘a fereastra cu autobuze se apeleaz ˘a o funct ¸ie built-in onCreate(Bundle
savedInstanceState) ˆın interiorul c ˘areia se seteaz ˘a cont ¸inutul ferestrei si daca este
necesar, se ˆıncarc ˘a harta(cu ajutorul metodei setMapIfNeeded() ). Codul surs ˘a este
prezentat ˆın continuare:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
SupportMapFragment mapFragment = (SupportMapFragment)
getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
setUpMapIfNeeded();
client = new
GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
}
Metoda principal ˘a care realizeaz ˘a conectarea la baza de date s ¸i afis ¸eaz ˘a autobuzele
prezente ˆın trafic, se numeste verficaAutobuze . Aceast ˘a clas ˘a se foloses ¸te de clasa
LocalizareAutobuz pentru a manipula datele de la baza de date.
44
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
Codul surs ˘a este prezentat ˆın continuare:
public void verificaAutobuz(){
mMap.clear();
mMap.setBuildingsEnabled(true);
final String[] str = {""};
Response.Listener<String> responseListener = new
Response.Listener<String>() {
public void onResponse(String response) {
try {
JSONArray jArray = new JSONArray(response);
String[] Nume = new String[jArray.length()];
String[] Latitudine = new String[jArray.length()];
String[] Longitudine = new String[jArray.length()];
String[] Timp = new String[jArray.length()];
for (int i = 0; i < jArray.length(); i++) {
JSONObject explrObject = jArray.getJSONObject(i);
Nume[i] = explrObject.getString("Nume");
Latitudine[i] = explrObject.getString("Latitudine");
Longitudine[i] = explrObject.getString("Longitudine");
Timp[i] = explrObject.getString("Timp");
}
for(int i=0;i<jArray.length();i++){
System.out.println("ajunge aici");
mMap.addMarker(new MarkerOptions().position(new
LatLng(Float.parseFloat(Latitudine[i]),
Float.parseFloat(Longitudine[i])))
.title("Autobuz").snippet("Nume:"+Nume[i]+" Timp ramas:"+Timp[i])
.icon(BitmapDescriptorFactory.fromResource(R.drawable.busicon)));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
};
LocalizareAutobuz localizareAutobuz = new
LocalizareAutobuz(str[0], responseListener);
RequestQueue queue =
Volley.newRequestQueue(FereastraAutobuze.this);
queue.add(localizareAutobuz);
}
ˆIn metodaonResponse() se interpreteaz ˘a obiectul de tip JSON primit de la server.
45
Proiectarea s ¸i implementarea aplicat ¸iei Diagrama de interact ¸iune
Urm ˘atorul cod surs ˘a reprezint ˘a clasaManagerAutobuze care conecteaz ˘a aplicat ¸ia la
fis ¸ierul localizare.php pentru a selecta datele necesare afis ¸ ˘arii autobuzelor.
public class LocalizareAutobuz extends StringRequest {
private static final String REGISTER_REQUEST_URL =
"https://svasile.ro/closcaru/localizare.php";
private Map<String, String> params;
public LocalizareAutobuz(String sir, Response.Listener<String>
listener) {
super(Method.POST, REGISTER_REQUEST_URL, listener, null);
params = new HashMap<>();
params.put("r",sir);
}
Override
public Map<String,String> getParams(){
return params;
}
}
Fis ¸ierul localizare.php este prezentat ˆın continuare:
<?php
$con = mysqli_connect("localhost:3306", "svasiler_closcar",
"Closcaru95", "svasiler_closcaru_autobuze");
$query="SELECT
autobuze.Nume,locatii.Latitudine,locatii.Longitudine,locatii.Viteza
FROM autobuze INNER JOIN locatii ON
autobuze.Id=locatii.Id_autobuz";
$return_arr = array();
if($result=mysqli_query($con, $query)){
while ($row=mysqli_fetch_array($result)) {
$response["Nume"] = $row["Nume"];
$response["Latitudine"] = $row["Latitudine"];
$response["Longitudine"] = $row["Longitudine"];
$response["Viteza"] = $row["Viteza"];
array_push($return_arr,$response);
}
}
mysqli_close($con);
echo json_encode($return_arr);
?>
La init ¸ializarea acestei clase, atunci c ˆand se creeaz ˘a contextul curent, se utilizeaz ˘a
46
Proiectarea s ¸i implementarea aplicat ¸iei Diagrame de clase ˆın faza de proiectare
metodasetMapIfNeeded() , al c ˘arei cod il vom prezenta mai jos:
private void setUpMapIfNeeded() {
if (mMap == null) {
mMap = ((SupportMapFragment)
getSupportFragmentManager().findFragmentById(R.id.map))
.getMap();
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
return;
}
mMap.setMyLocationEnabled(true);
mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
mMap.setBuildingsEnabled(true);
mMap.setTrafficEnabled(true);
if (mMap != null) {
LatLng constanta = new LatLng(44.1983174, 28.6394311);
mMap.moveCamera(CameraUpdateFactory.newLatLng(constanta));
float zoomLevel = (float) 15.0;
CameraPosition position = new CameraPosition.Builder()
.target(constanta)
.zoom(zoomLevel)
.bearing(-5)
.tilt(45)
.build();
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(position));
}
}
}
ˆIn interiorul acestei metode se realizeaz ˘a harta s ¸i modul ˆın care utilizatorul are contact cu
harta. Anexa2 cuprinde informat ¸ii cu privire la codul surs ˘a al acestui caz de utilizare.
4.3 Diagrame de clase ˆın faza de proiectare
Acest tip de diagrame reprezint ˘a o descriere a claselor s ¸i a interfet ¸elor unui sistem ˆımpreun ˘a
cu relat ¸iile dintre ele. Diagramele de clase de proiectare cont ¸in clase, interfet ¸e cu operat ¸ii s ¸i
constante, dar s ¸i relat ¸iile dintre acestea. Se creeaz ˘a foarte us ¸or s ¸i anume prin identificarea
claselor din diagramele de interact ¸iune la care se adaug ˘a relat ¸iile.
47
Proiectarea s ¸i implementarea aplicat ¸iei Diagrame de clase ˆın faza de proiectare
ˆIn continuare vom prezenta diagramele de proiectare pentru fiecare caz de utilizare ale
aplicat ¸ieiFutureBus .
ˆIn Figura 4.15 este redata diagrama de clase de proiectare pentru cazul de utilizare
Achizit ¸ionare bilet .
Figura 4.15 : Diagrama de clase de proiectare pentru cazul de utilizare Achizit ¸ionare bilet
48
Proiectarea s ¸i implementarea aplicat ¸iei Diagrame de clase ˆın faza de proiectare
ˆIn Figura 4.16 este redata diagrama de clase de proiectare pentru cazul de utilizare
Vizualizare autobuze .
Figura 4.16 : Diagrama de clase de proiectare pentru cazul de utilizare Vizualizare-autobuze
ˆIn Figura 4.17 este redata diagrama de clase de proiectare pentru cazul de utilizare
Autentificare s ¸ofer .
49
Proiectarea s ¸i implementarea aplicat ¸iei Diagrame de clase ˆın faza de proiectare
Figura 4.17 : Diagrama de clase de proiectare pentru cazul de utilizare Autentificare S ¸ofer
50
Proiectarea s ¸i implementarea aplicat ¸iei Modelarea bazei de date
4.4 Modelarea bazei de date
Conform sursei [Man2010], Sistemele de Gestiune a Bazelor de Date (SGBD) reprezint ˘a
programe cu ajutorul c ˘arora se proceseaz ˘a date. Aceste programe ajut ˘a utilizatorii s ˘a struc-
tureze datele ˆın baze de date (denumite astfel bd) s ¸i ˆın acelas ¸i timp permit exploatarea datelor
ˆın mod concurent, de c ˘atre mai muli utilizatori. SGBD-urile asigur ˘a mecanisme pentru:
1.memorarea (structurat ˘a a) datelor
2.accesul la date
3.protect ¸ia datelor ( ˆımpotriva accesului neautorizat)
4.p˘astrarea integrit ˘at ¸ii datelor
5.recuperarea din erori.
Pentru a realiza aplicat ¸ia, am utilizat structura de baz ˘a de date a cazului de utilizare
Vizualizare autobuze , regasit ˘aˆın Figura 4.18.
Figura 4.18 : Diagrama bazei de date de tip Mysql
Pentru cazul de utilizare Achizit ¸ionare bilet , SGBD-ul utilizat este SqLite iar
structura acestuia este redat ˘a dup ˘a cum urmeaz ˘a:
public static final String DATABASE_NAME = "Bilete.db";
public static final String TABLE_NAME = "bilet_tabel";
public static final String COL_1 = "ID";
public static final String COL_2 = "LINIE";
public static final String COL_3 = "TIP_BILET";
public static final String COL_4 = "COD_BILET";
public static final String COL_5 = "DATA_CUMPARARE";
public static final String COL_6 = "DATA_EXPIRARE";
Pentru a defini structura s ¸i schema bazei de date, am utilizat sintaxa DDL de creare a
unui tabel, prin metoda onCreate(SQLiteDatabase db) .
51
Proiectarea s ¸i implementarea aplicat ¸iei Modelarea bazei de date
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY
KEY AUTOINCREMENT,LINIE TEXT,TIP_BILET TEXT,COD_BILET
TEXT,DATA_CUMPARARE TEXT,DATA_EXPIRARE TEXT)");
}
Metoda care se ocup ˘a cu inserarea datelor ˆın tabele este insereazaDate(String linie,
String tip bilet, String cod bilet, String data cumparare, String
dataexpirare) .
public boolean insereazaDate(String linie, String tip_bilet,
String cod_bilet, String data_cumparare, String data_expirare){}
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_2,linie);
contentValues.put(COL_3,tip_bilet);
contentValues.put(COL_4,cod_bilet);
contentValues.put(COL_5,data_cumparare);
contentValues.put(COL_6,data_expirare);
long result = db.insert(TABLE_NAME,null,contentValues);
if(result == -1)
return false;
else
return true;
}
Metoda getBilete() preia toate informat ¸iile existente ˆın baza de date de tip SqLite s ¸i le
afis ¸eaz ˘a:
public Cursor getBilete(){
SQLiteDatabase db = this.getWritableDatabase();
Cursor res = db.rawQuery("select *from "+ TABLE_NAME+ " ORDER BY
"+ COL_1+" DESC",null);
return res;
}
ˆIn cadrul cazului de utilizare Vizualizare Autobuze , baza de date de tip MySql
cont ¸ine tabelele mai sus ment ¸ionate.
Pentru a gestiona datele am utilizat fis ¸iere PHP. Acestea se conecteaz ˘a la baza de date
s ¸i prin intermediul unui JSON(JavaScript Object Notation) realizez tranzact ¸ii ˆıntre client s ¸i
server.
Fis ¸ierullogin.php realizeaz ˘a conexiunea la baza de date s ¸i ˆın funct ¸ie de informat ¸iile
primite de la aplicat ¸ie ˆıncapsuleaz ˘a aceste informat ¸ii ˆıntr-un obiect de tip JSON. Codul aces-
52
Proiectarea s ¸i implementarea aplicat ¸iei Modelarea bazei de date
tui fis ¸ier este prezentat mai jos:
<?php
$con = mysqli_connect("localhost:3306", "svasiler_closcar",
"Closcaru95", "svasiler_closcaru_autobuze");
$nume = $_POST["Nume"];
$parola = $_POST["Parola"];
$statement = mysqli_prepare($con, "SELECT Nume,Parola FROM
autobuze WHERE Nume = ? AND Parola = ?");
mysqli_stmt_bind_param($statement, "ss", $nume, $parola);
mysqli_stmt_execute($statement);
mysqli_stmt_store_result($statement);
mysqli_stmt_bind_result($statement, $nume, $parola);
$response = array();
$response["success"] = false;
while(mysqli_stmt_fetch($statement)){
$response["success"] = true;
}
echo json_encode($response);
?>
53
Capitolul 5
Concluzii
Rezultatele prezentate ˆın aceast ˘a lucrare au fost trimise spre publicare la ”Conferint ¸a de
Interact ¸iune Om-Calculator”,Rochi 2017.
Pentru a putea crea aceast ˘a aplicat ¸ie am realizat descrierea problemei ˆın care am in-
trodus informat ¸ii obt ¸inute din diverse surse citate ˆın bibliografie. Baz ˆandu-m ˘a pe aceast ˘a
descriere am urmat etapele necesare cre ˘arii unei aplicat ¸ii software.
O alt ˘a etap ˘a important ˘aˆın realizarea aplicat ¸iei este etapa de analiz ˘a.ˆIn cadrul acestei
etape am realizat documentul de cerint ¸e. Tot aici am realizat modelul funct ¸ional care cont ¸ine
diagrama cazurilor de utilizare software dar s ¸i descrierea acestora. Cu ajutorul descrierii
problemei, am reusit s ˘a reprezint diagrama de clase care apart ¸ine modelului domeniului.
Urm ˘atorul pas ˆın dezvoltarea sistemului este reprezentat de c ˘atre construct ¸ia diagramelor
de secvent ¸e de sistem, utile deoarece furnizeaz ˘a mesaje ˆıntre actorii software si sistemul
FutureBus .
Pentru realizarea codului surs ˘a, am creat diagramele de secvent ¸e ˆın faza de proiectare
pentru fiecare caz de utilizare ˆın parte, acest pas realiza ˆandu-se ˆın etapa de proiectare. Tot ˆın
aceast ˘a etap ˘a am creat diagrame de clase software s ¸i am proiectat baza de date ˆın MySQL.
Aceasta din urm ˘a a fost utilizat ˘a de sistem pentru gestiunea datelor persistente.
ˆIn realizarea diagramelor am utilizat programul Astah[Astah], un program prietenos s ¸i
us ¸or de utilizat.
ˆImbin ˆand cele mai sus ment ¸ionate am reus ¸it implementarea sistemului FutureBus
folosind limbajele Java s ¸i PHP. Aplicat ¸ia ruleaz ˘a pe sistemul de operare Android, versiunea
cel put ¸in 4.0.
Pentru a testa funct ¸ionalitatea aplicat ¸iei am folosit 3 persoane care au realizat teste din
punctele de vedere ale actorilor software ai aplicat ¸iei. Rezultatul furnizat de c ˘atre cele 3
persoane au fost favorabile s ¸i nu au existat probleme, aplicat ¸ia furniz ˆand rezultate corecte.
54
Capitolul 6
Anexe
6.1 Anexa 1
Cod surs ˘a pentru cazul de utilizare Achizit ¸ionare bilet
Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
return super.onCreateOptionsMenu(menu);
}
Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.bilete_id:
Cursor resursa = mydb.getBilete();
if (resursa.getCount() == 0) {
afiseazaMesaj("Bilete Achizitionate", "Nu ai niciun bilet
cumparat!");
return true;
}
StringBuffer buffer = new StringBuffer();
while (resursa.moveToNext()) {
buffer.append("Id: " + resursa.getString(0) + "\n");
buffer.append("Linie: " + resursa.getString(1) + "\n");
buffer.append("Tip Abonament: " + resursa.getString(2) + "\n");
buffer.append("Cod: " + resursa.getString(3) + "\n");
buffer.append("Data cumparare: " + resursa.getString(4) + "\n");
buffer.append("Data expirare: "+resursa.getString(5)+"\n");
buffer.append("––––––––––––––––
55
Anexe Anexa 1
––-"+"\n\n\n");
}
afiseazaMesaj("Bilete Achizitionate", buffer.toString());
return true;
case R.id.about_id:
setContentView(R.layout.activity_contact);
return true;
case R.id.harta_id:
Intent homeIntent = new Intent(ControllerBilete.this,
FereastraAutobuze.class);
startActivity(homeIntent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private BroadcastReceiver intentReceiver = new
BroadcastReceiver() {
Override
public void onReceive(Context context, Intent intent) {
TextView texttxt = (TextView)findViewById(R.id.txtmesaj);
DateFormat formatData = new SimpleDateFormat("dd/MM/yyyy
HH:mm:ss");
DateFormat formatDataNou = new SimpleDateFormat("MM/yyyy");
Date astazi = Calendar.getInstance().getTime();
Date astaziNou = Calendar.getInstance().getTime();
String data_cumparare = formatData.format(astazi);
String data_expirare = formatDataNou.format(astaziNou);
System.out.println("Report Date: " + data_cumparare + " si " +
astazi.getDate() + "/" + data_expirare + " " +
astazi.getHours() + ":" + astazi.getMinutes() + ":" +
astazi.getSeconds());
getCod(intent);
System.out.println(getCod(intent));
texttxt.setText("Cod de calatorie:\n"+ getCod(intent));
int calatorie;
int abonament = astazi.getDate()+1;
int estival = astazi.getHours()+1;
int ora = astazi.getHours()+1;
calatorie = astazi.getMinutes()+40;
System.out.println(estival+"si"+ora);
boolean isInserted;
56
Anexe Anexa 1
if(msg2=="L") {
if(calatorie>=60){
calatorie=calatorie-60;
isInserted = mydb.insereazaDate(msg1, msg2, getCod(intent),
data_cumparare, astazi.getDate()+"/"+data_expirare+"
"+estival+":"+calatorie+":"+astazi.getSeconds());
}else {
isInserted = mydb.insereazaDate(msg1, msg2, getCod(intent),
data_cumparare, astazi.getDate() + "/" + data_expirare + " " +
astazi.getHours() + ":" + calatorie + ":" +
astazi.getSeconds());
}
}else {
if (msg2 == "ZI") {
isInserted = mydb.insereazaDate(msg1, msg2, getCod(intent),
data_cumparare, abonament+"/"+data_expirare+"
"+astazi.getHours()+":"+astazi.getMinutes()+":"+astazi.getSeconds());
}else{
isInserted = mydb.insereazaDate(msg1, msg2, getCod(intent),
data_cumparare,astazi.getDate()+"/"+data_expirare+"
"+estival+":"+astazi.getMinutes()+":"+ astazi.getSeconds());
}
}
if (isInserted == true)
Toast.makeText(ControllerBilete.this, "Data inserata",
Toast.LENGTH_LONG).show();
else
Toast.makeText(ControllerBilete.this, "Data neinserata",
Toast.LENGTH_LONG).show();
}
};
public void onResume(){
registerReceiver(intentReceiver,intentFilter);
super.onResume();
}
public void onPause(){
unregisterReceiver(intentReceiver);
super.onPause();
}
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage[] messages = null;
String str = "";
if(bundle!=null){
Object[] pdus = (Object[])bundle.get("pdus");
57
Anexe Anexa 2
messages = new SmsMessage[pdus.length];
for(int i =0;i<messages.length;i++){
messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
}
}
Intent broadcastIntent = new Intent();
broadcastIntent.setAction("SMS_RECEIVED_ACTION");
broadcastIntent.putExtra("sms",str);
context.sendBroadcast(broadcastIntent);
}
}
6.2 Anexa 2
Cod surs ˘a pentru cazul de utilizare Autentificare S ¸ofer
private void managePermissions() {
if(ActivityCompat.checkSelfPermission(this,
Manifest.permission.INTERNET)!=
PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this, new
String[]{Manifest.permission.INTERNET},MANIFEST_PERMISSION_INTERNET);
}
else{
showToast();
}
}
private void showToast() {
Toast.makeText(this,"Permisiune pentru
internet",Toast.LENGTH_LONG).show();
}
Override
public void onRequestPermissionsResult(int requestCode, NonNull
String[] permissions, NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions,
grantResults);
switch (requestCode){
case MANIFEST_PERMISSION_INTERNET:
if(grantResults.length>0 && grantResults[0] ==
PackageManager.PERMISSION_GRANTED){
showToast();
}
58
Anexe Anexa 2
else{
if(ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.INTERNET)){
new AlertDialog.Builder(this).
setTitle("Internet Permission").
setMessage("Trebuie sa dai permisiune de accesare a internetului!
Reincearca aceasta operatie!").show();
}
else{
new AlertDialog.Builder(this).
setTitle("Internet Permission").
setMessage("Permisiune acordata! Pentru a dezactiva mergi la
setari!").show();
}
}
break;
}
}
public class FereastraPrincipala extends Activity implements
OnClickListener {
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.user_activity);
Button startButton = (Button)findViewById(R.id.btnStart);
Button stopButton = (Button)findViewById(R.id.btnStop);
stopButton.setEnabled(false);
startButton.setOnClickListener(this);
stopButton.setOnClickListener(this);
}
Override
public void onClick(View v) {
Button startButton = (Button)findViewById(R.id.btnStart);
Button stopButton = (Button)findViewById(R.id.btnStop);
switch (v.getId()) {
case R.id.btnStart:
Intent startIntent = new
Intent(FereastraPrincipala.this,LocalizareAutobuz.class);
startIntent.setAction(Constants.ACTION.STARTFOREGROUND_ACTION);
String user = getUsername();
startIntent.putExtra("name",user);
startService(startIntent);
startButton.setEnabled(false);
stopButton.setEnabled(true);
59
Anexe Anexa 2
break;
case R.id.btnStop:
Intent stopIntent = new Intent(FereastraPrincipala.this,
LocalizareAutobuz.class);
stopIntent.setAction(Constants.ACTION.STOPFOREGROUND_ACTION);
startService(stopIntent);
startButton.setEnabled(true);
stopButton.setEnabled(false);
break;
default:
break;
}
}
public String getUsername(){
Bundle extras = getIntent().getExtras();
String userName="";
if (extras != null) {
userName = extras.getString("username");
}
return userName;
}
}
public class ManagerConexiune {
Context context;
public ManagerConexiune(Context context){
this.context = context;
}
public boolean isConnected(){
ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Service.CONNECTIVITY_SERVICE);
if(connectivityManager!=null){
NetworkInfo networkInfo =
connectivityManager.getActiveNetworkInfo();
if(networkInfo!=null){
if(networkInfo.getState() == NetworkInfo.State.CONNECTED) return
true;
}
}
return false;
}
}
60
Anexe Anexa 3
6.3 Anexa 3
Cod surs ˘a pentru cazul de utilizare Vizualizare autobuze
private GoogleMap mMap;
private static int MY_PERMISSION_FINE_LOCATION = 101;
Handler myHandler = new Handler();
int delay = 3000;
Runnable runnable;
private GoogleApiClient client;
public Action getIndexApiAction() {
Thing object = new Thing.Builder()
.setName("Maps Page")
.setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]"))
.build();
return new Action.Builder(Action.TYPE_VIEW)
.setObject(object)
.setActionStatus(Action.STATUS_TYPE_COMPLETED)
.build();
}
Override
public void onStart() {
super.onStart();
myHandler.post(myRunnable);
client.connect();
AppIndex.AppIndexApi.start(client, getIndexApiAction());
}
Override
protected void onPause() {
myHandler.removeCallbacks(runnable);
super.onPause();
}
private Runnable myRunnable = new Runnable() {
Override
public void run() {
verificaAutobuz();
runnable=this;
myHandler.postDelayed(runnable, delay);
}
};
Override
public void onStop() {
61
Anexe Anexa 3
super.onStop();
myHandler.removeCallbacks(myRunnable);
AppIndex.AppIndexApi.end(client, getIndexApiAction());
client.disconnect();
}
62
Referint ¸e bibliografice
[CBDAS] Popovici D. M. (coordonator), Bogdan C. M., Rusu A., Chelai O., Nicola A.,
Medii virtuale multimodale distribuite, Editura Universitaria Craiova s ¸i Editura Prouni-
versitaria Bucures ¸ti, 978-606-26-0049-5, 2014, vol 1, 354 pag.
[UMLS] OMG Unified Modelling Language Superstructure,version 2.0, ptc/03-0802, 2003.
[CBMFP] Popovici D. M. (coordonator), Manca C., Bogdan C. M., Zaharescu E., Medii vir-
tuale multimodale distribuite, Editura Universitaria Craiova s ¸i Editura Prouniversitaria
Bucures ¸ti, 978-606-26-0049-5, 2014, vol 2, 271 pag.
[TUMLR1999] Ivar Jacobson, Grady Boocs, James Rumbaugh, The Unified Modelling
Language Reference Manual, Addison-Wesley, 1999.
[CBLDPOO] Crengut ¸a M ˘ad˘alina Bogdan, Luca Dan Serbanati, Programare orientat ˘a spre
obiecte cu exemplific ˘ariˆın limbajul Java, vol.2, 2010.
[Astah] Astah Shortcut Keys, Editor Astah, URL: http://astah.net/tutorials/shortcut-keys ,
site vizitat pe 18 iunie 2017
[Man2010] Christian Mancas ¸ Facultatea de Matematic ˘a s ¸i Informatic ˘a, Universitatea Ovid-
ius , Curs SGBD I III, 2007 – 2008
63
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Dezvoltarea unei aplicat ii software de [625857] (ID: 625857)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
