Documente Academic
Documente Profesional
Documente Cultură
PROIECT DE DIPLOMĂ
Gestiunea Proiectelor
BUCUREŞTI
2014
Cuprins
1. Introducere ..................................................................................................................................... 6
1.1 Prezentarea contextului ........................................................................................................... 6
1.2 Scopul lucrării ............................................................................................................................ 6
1.3 Sumar ........................................................................................................................................ 7
2. Prezentare generală ....................................................................................................................... 8
2.1 Proiect ....................................................................................................................................... 8
2.2 Cerință ...................................................................................................................................... 8
2.3 Gestiunea proiectelor ............................................................................................................... 9
2.4 Etapele unui proiect ............................................................................................................... 11
2.4.1 Identificare ............................................................................................................... 11
2.4.2 Planificare................................................................................................................. 11
2.4.3 Implementare .......................................................................................................... 11
2.4.4 Monitorizare și control............................................................................................. 12
2.4.5 Încheiere .................................................................................................................. 12
2.5 Abordări ale dezvoltării produselor software ........................................................................ 14
2.5.1 Modelul Waterfall .................................................................................................... 14
2.5.2 Modelul Agile ........................................................................................................... 14
2.5.2.1 Etapele unei iterații Agile ...................................................................................... 15
2.6 Soluții software de gestiune a proiectelor .............................................................................. 16
2.6.1 Jira ............................................................................................................................ 16
2.6.2 Mantis BT ................................................................................................................. 16
3. Arhitectură și proiectare .............................................................................................................. 17
3.1 Clasa User ................................................................................................................................ 17
3.1.1 Rolurile utilizatorului ................................................................................................ 17
3.2 Clasa Project ............................................................................................................................ 18
3.2.1 Stările unui proiect ................................................................................................... 19
3.3 Clasa Task ................................................................................................................................ 19
3.3.1 Prioritatea unei cerințe ............................................................................................ 19
3.3.2 Tipul unei cerințe ..................................................................................................... 20
3.3.3 Starea unei cerințe ................................................................................................... 20
3.4 Clasa Note ............................................................................................................................... 20
3.5 Clasa Attachemen.................................................................................................................... 21
3.6 Clasa Post ................................................................................................................................ 21
3.7 Clasa Comment ....................................................................................................................... 22
4. Detalii de implementare .............................................................................................................. 24
4.1 Modelul de proiectare MVC .................................................................................................... 24
4.2 Implementarea bazei de date ................................................................................................. 24
4.2.1 Entity Framework ..................................................................................................... 25
4.2.1.1 Code First .............................................................................................................. 25
4.3 Implementarea funcționalităților ............................................................................................ 27
4.3.1 LINQ.......................................................................................................................... 28
4.3.2 Rolul clasei Account ................................................................................................. 28
4.3.3 Rolul clasei FileUpload ............................................................................................. 29
4.3.4 Rolul clasei Home ..................................................................................................... 29
4.3.5 Rolul clasei Note....................................................................................................... 30
4.3.6 Rolul clasei Project ................................................................................................... 30
4.3.7 Rolul clasei Task ....................................................................................................... 30
4.3.8 Implementarea modulului de comunicare ............................................................. 31
4.3.8.1 SignalR ................................................................................................................... 32
4.3.9 Implementarea modulului de statistică ................................................................... 32
5. Testare și evaluare ....................................................................................................................... 34
6.Concluzie și viitoare îmbunătățiri .................................................................................................. 36
6.1 Concluzie ................................................................................................................................ 36
6.2 Viitoare îmbunatățiri . ............................................................................................................. 36
Lista imaginilor
Lista tabelelor
Tab. 1 Ariile gestiunii proiectelor ............................................................................................. 10
Tab. 2 Descrierea rolurilor unui utilizator ................................................................................. 18
Lista listărilor
List. 1 Structura clasei Project .................................................................................................. 25
List. 2 Script SQL de creare a tabelei Project ............................................................................. 25
List. 3 Exemplu de folosire FluentAPI ....................................................................................... 26
List. 4 Structura clasei AppContext........................................................................................... 26
List. 5 Detaliile bazei de date ................................................................................................... 27
List. 6 Structura clasei BaseController ...................................................................................... 27
List. 7 Încărcarea cerințelor folosind LINQ ................................................................................ 28
List. 8 Declararea unui pachet de script-uri JS ........................................................................... 35
5
Abstract
Nevoia de a mări rata de succes a proiectelor a determinat realizarea unui set de tehnici
ce au ca scop planificarea din timp a pașilor necesari pentru atingerea rezultatului dorit și
gestiunea fiecărui pas pentru a putea lua cele mai bune decizii atunci când situații neașteptate
au loc. Această lucrare are ca scop prezentarea unui proiect ce oferă funcții esențiale atunci când
vine vorba de gestiunea proiectelor.
6
CAPITOLUL 1
Introducere
1.1 Prezentarea contextului
Majoritatea proiectelor pot începe ca simple cerințe ce par a fi ușor de îndeplinit însă, pe
măsură ce dezvoltarea avansează, situații neașteptate pot îndruma un proiect spre eșec.
Incapacitatea de a înțelege cerințele unui client, clienți ce nu au un scop exact, depășirea bugetului,
nerespectarea termenelor limită sau modificarea acestora, sunt elemente ce pot determina starea
finală a unui proiect. În funcție de modul de abordare al fiecărei firme, proiectele pot fi încheiate cu
succes chiar daca unul sau mai multe din elementele enumerate își fac apariția în una din etapele
dezvoltării proiectului.
Pentru a ușura munca persoanelor responsabile cu succesul unui proiect, a fost creeat un
set de tehnici și abilități ce sunt recunoscute în general ca practici bune atunci când vine vorba de
realizarea unui proiect reușit. Popularitatea actuala a tehnicilor de gestiune a proiectelor este o
dovadă a eficienței lor atunci când vine vorba de îndeplinirea cerințelor unui proiect, indiferent de
complexitatea acestuia. Gestiunea proiectelor a devenit una din etapele obligatorii atunci când este
necesară realizarea unor proiecte de calitate înaltă, respectând termeni limită impuși de client,
indiferent de domeniu.
Scopul acestei lucrări este realizarea unei aplicații software web ce ofere unei echipe
mijloacele necesare pentru a duce un proiect la bun sfârșit.
7
1.3 Sumar
Capitolul 2 răspunde unor întrebări precum: Ce este un proiect? Ce este o cerință? Care
sunt etapele unui proiect? Ce abordări există în industria software atunci când vine vorba de
gestiunea proiectelo? Ce produse software folosite în scopul gestiunii proiectelor există pe piață?
Capitolul 6 va cuprinde concluzia la care s-a ajuns după încheierea dezvoltării aplicației și
moduri în care aceasta poate fi îmbunătățită pe viitor
8
CAPITOLUL 2
Prezentare generală
2.1 Proiect
Termenul de proiect este folosit pentru a descrie un ansamblu de elemente ce au ca scop
obținerea unui produs sau a unui serviciu. Datorită nevoii de a obține un rezultat, un proiect este
încadrat într-o perioadă finită de timp, având stabilite o data de start și o data de stop. Această
perioadă de timp poate varia, în funcție de complexitatea proiectului, de la perioade scurte de timp
(un număr de zile) până la perioade lungi sau foarte lungi de timp (ani de zile).
Se poate spune că un proiect a fost încheiat cu success atunci când s-a ajuns la rezultatul
dorit în perioada de timp stabilită. Nerespectarea termenelor limită și alți factori precum:
înțelegerea greșită a cerințelor clientului, calitatea scăzută a lucrului realizat, neînțelegeri între
membrii unei echipe ce dezvoltă o parte a proiectului, depășirea bugetului, etc. pot determina
încheierea unui proiect ce nu întoarce rezultatul dorit.
2.2 Cerință
Cerințele sunt atribuite unei echipe iar aceasta trebuie sa le îndeplinească înaintea
termenului limită. Având în vedere faprul că realizarea unui proiect este limitată de timp ,și cerințele
sunt încadrate într-un interval definite de o data de start și o data de stop . Nerespectarea
termenelor limită pot avea consecințe grave asupra întregului proiect.
În figura de mai jos se pot observa patru moduri în care cerința B poate depinde
de cerința A:
9
Un exemplu în care o cerință B nu poate începe fără ca cerința A sa se fi încheiat este cel în
care cerința A reprezintă implementarea iar cerința B reprezintă testarea implementării. O echipă nu
poate începe testarea finală a unei funcționalități până când aceasta nu a fost considerate încheiată.
Datorită dependențelor, nerespectarea termenelor limită pentru una din cerințe poate avea
ca efect întârzierea tuturor celorlalte cerințe, ducând la necesitatea recalcularii intervalelor alocate
sau, în unele cazuri, la încheierea proiectului. Pentru a putea evita sau ameliora efectul unor astfel
de situații, se folosesc tehnici de gestiune a proiectelor.
Datorită diferitelor elemente ce sunt implicate în realizarea unui proiect precum timp, cost,
calitate, activități, oameni, etc., gestiunea acestuia poate părea un lucru dificil. Pentru a-l ușura,
gestiunea proiectelor este împărțită în mai multe arii de expertiză, așa cum se poate observa în Tab.
1. Deși pot părea separate la început, ariile sunt strâns legate între ele, modificări produse în una din
ele putând influența negativ (sau pozitiv) o altă arie sau chiar pe toate. Spre exemplu, decizia de a
10
reduce costul poate avea impact negativ asupra timpului alocat proiectului. Reducând timpul,
calitatea nu poate rămâne aceeași , fiind necesare compromisuri.
Pentru a putea realiza o gestiune cât mai completă a unui proiect, este recomandată
implicarea întregii echipe în procesul de management. Chiar dacă echipa de management este
specializată în tehnici de gestiune a proiectelor, se poate întâmpla ca membrii acesteia să nu fie
destul de familiarizați cu elemente extrem de specifice ale actualului proiect și evaluarea lor să nu fie
apropiată de realitate.Implicând beneficiarii în gestiunea scopului proiectului va micșora posibilitatea
ca cerințele acestora sa fie înțelese greșit și îi va face mai încrezători în reușita proiectului.
Gestiunea timpului alocat proiectului este una din ariile în care prezența echipei de
dezvoltare este necesară. Impunând termene limită fără a cunoaște capacitatea unei echipe de a le
respecta poate creea tensiuni în interiorul ei daca timpul acordat este mult prea mic sau poate
micșora eficiența ei atunci când timpul acordat este mult prea mare. Discutând împreună cu
membrii echipei atunci când se determină intervalul stabilit pentru fiecare din cerințe, poate avea ca
rezultat obținerea unor timpi realiști, atunci când fiecare membru al echipei își cunosc capacitațile și
limitările.
1
https://www.workbreakdownstructure.com/
11
Fiecare proiect este caracterizat de un ciclu de viață ce reprezintă intervalul de timp în care
proiectul trece de la faza de idee la faza finală, în care contractul este încheiat. Abordarea generală
atunci când vine vorba de ciclul de viață al unui proces cuprinde cinci etape(procese).
2.4.1 Identificare
În această etapă se decide începerea unui nou proiect și un manager de proiect este ales.
Sunt identificați clienții și scopul proiectului este definit.
2.4.2 Planificare
Etapa de planificare are ca scop estimarea efortului necesar finalizării proiectului, definirea
și detalierea obiectivelor și acțiunile necesare pentru îndeplinirea lor. Această etapă trebuie să ia în
calcul elemente ce fac parte din toate ariile de gestiune, precum costul, timpul, calitatea, etc.
Pe măsură ce sunt descoperite noi elemente sau cerințe ale unui proiect, partea de
planificare suferă modificări. Sunt necesare evaluări repetate de fiecare dată când intervin
modificări, procesul de planificare fiind unul iterativ.
2.4.3 Implementare
În această etapă pot interveni cele mai multe schimbări. Aceste schimbări pot fi
determinate de întâlnirea unui risc neprevăzut, modificări aduse timpului acordat uneia din cerințe
sau resurse ce devin indisponibile sau limitate. Fiecare din aceste modificări impune realizarea unei
noi analize și găsirea unei noi soluții ce poate schimba planul proiectului.
12
2.4.5 Încheiere
Modelul Waterfall este primul model de dezvoltare software folosit la scară largă. Este un
model liniar ce necesită finalizarea unei etape pentru a putea trece la următoarea.
Acest model de dezvoltare este adoptat în special atunci când proiectul este unul de scurtă
durată, în care nu există variabile când vine vorba de cerințe iar cadrul dezvoltării este unul fix.
Principalele avantaje ale acestui model sunt simplitatea, ușurința de înțelegere, terminarea pe rând
a fiecărei etape fără ca acestea să se suprapună, prezența unei documentații detaliate.
Modelul Waterfall nu este recomandat pentru dezvoltarea unor proiecte de lungă durată.
Fiind liniar, modelul nu oferă un rezultat decât la terminarea ciclului, în cazul proiectelor mai mari
aceasta însemnând dupa luni sau ani de zile. Acest lucru implică asumarea unor riscuri extrem de
mari, identificarea unei probleme neprevăzute ne putând fi tratate în timp util.
Etapele unei iterații sunt: planificarea, analiza cerințelor, proiectare, dezvoltare, testare (unit
testing și test de acceptare).
Deși popularitatea modelului Agile continuă să crească, acest model nu poate fi aplicat pe
toate proiectele. Lipsa unui manager de proiect ce deține cuoștințele necesare dezvoltării după
2
http://agilemanifesto.org/principles.html
16
modelul Agile poate crea haos în cadrul echipei de dezvoltare. Lipsa documentației crează o
dependență individuală puternică și face dificilă introducerea unor noi membri ai echipei ce nu sunt
familiari cu tehnologia dezvoltată. Având în vedere faptul că interacțiunea cu beneficiarii este unul
din principiile de baza Agile, eventuale neclarități legate de cerințele acestora pot îndruma
dezvoltarea unui proiect pe calea greșită.
Se poate observa că atât modelul Agile cât și modelul Waterfall au avantaje și dezavantaje
însă este dovedit faptul că, atunci când modelul ales este cel ce se potrivește cel mai bine unui
proiect, rata de succes a acestuia crește considerabil. Este datoria managerului de proiect să decidă
ce model de dezvoltare software se mulează cel mai bine pe tipul proiectului și pe abilitățile echipei
de dezvoltare.
2.6.1 Jira
Jira este un produs software dezvoltat în Java de Atlasian, încă din 2002. Principalele
funcționalități oferite sunt: notificări email, introducerea și modificarea cerințelor, adăugarea de noi
proiecte, changelog, raportare, adăugarea de atașamente, sistem de workflow, etc.
Unul din cele mai mari avantaje ale Jira este faptul că aplicația poate fi folosită atât local,
folosind baza de date și puterea de procesare a clientului cât și ca SaaS (Software as a Service),
păstrarea datelor și procesarea lor fiind realizate pe serverele Jira.
Produsul este unul web, varianta locală fiind independentă de platforma pe care rulează
datorită dezvoltării în Java.
2.6.2 Matins BT
Mantis Bug Tracker este un produs software specializat pe bug tracking însă poate fi folosit și
ca ajutor pentru gestiunarea proiectelor. Este o aplicație web dezvoltată în PHP, ce poate fi rulată pe
majoritatea sistemelor de operare. Funcționalitățile oferite de Mantis sunt: notificări email,
introducerea și modificarea cerințelor, changelog, audit și raportare, etc.
Principalul avantaj Mantis este disponibilitatea sa, produsul putânt fi descărcat și instalat de
oricine.
17
CAPITOLUL 3
Arhitectură și proiectare
Realizarea unei aplicații software de gestiune a proiectelor necesită introducerea
elementelor esenșiale procesului de gestiune și a unei interfețe simple și ușor de folosit pentru a
permite utilizatorilor accesul către toate funcționalitățile oferite.
Indiferent de numărul de proiecte în care un utilizator este implicat, rolul acestuia este dat la
nivel de aplicație. Folosind această abordare, nu vor exista confuzii în privința gradului de acces pe
care un utilizator îl are atunci când interacționează cu aplicația, fiecare utilizator având atribuit un
singur rol.
Rol Descriere
Administrator Cel mai important rol atribuit unui utilizator. De obicei există un singur utilizator în
interiorul unei aplicații ce deține acest rol.
Principalele drepturi deținute de un administrator: modificare informații utilizatori
(adresă email, nume, prenume), schimbarea stării unui utilizator, schimbarea rolului
unui utilizator, vizualizarea tuturor utilizatorilor.
Deține toate drepturile rolurilor ce au grad de prioritate mai mic.
Manager de proiect În interiorul aplicației pot exista mai mulți utilizatori ce dețin acest rol.
Principalele drepturi deținute de un manager de proiect : introducerea de noi proiecte,
3
editarea stării unui proiect .
Deține toate drepturile rolurilor ce au grad de prioritate mai mic.
Programator Rolul atribuit celor mai mulți utilizatori din interiorul aplicației.
Principalele drepturi deținute: adăugarea de noi cerințe, editarea cerințelor,
schimbarea stării unei cerințe, adăugarea de note, adăugarea de atașamente,
4
atribuirea ce cerințe unui utilizator .
Deține toate drepturile rolurilor ce au grad de prioritate mai mic.
Reporter Rolul de reporter este atribuit utilizatorilor ce au ca scop identificarea unor noi cerințe
și informarea echipei de dezvoltare .
Principalele drepturi deținute de un reporter: adăugarea de noi cerințe și atribuirea
acestora;
Împreună cu toate celelalte roluri, reporterii dețin dreptul de a folosi interfața de
comunicare.
Tab.2 Descrierea rolurilor unui utilizator
De cele mai multe ori o aplicație are de gestionat mai multe proiecte în același timp,
numărul acestora depinzând de tipul și dimensiunea firmei în care este folosită. O firmă de produse
software poate avea în lucru zeci de proiecte, pe când una de construcții poate avea un singur
proiect activ. Pentru a putea permite gestiunea unor proiecte multiple, este necesară izolarea
acestora.
3
Un manager de proiect poate schimba doar starea unui proiect ce a fost creat de el
4
Cerințele nu pot fi atribuite utilizatorilor ce dețin rolul administrator sau reporter
19
Orice proiect poate trece printr-un total de 3 stări: deschis, suspendat și închis. Pentru a
permite adăugarea de noi cerințe și modificarea acestora, un proiect trebuie să fie deschis.
Suspendarea acestuia va bloca posibilitatea modificării componentelor până când va fi redeschis.
Închiderea unui proiect este permanentă și blochează posibilitatea modificării oricărui aspect al
proiectului.
Unul din primii pași recomandați de tehnicile de gestiune a proiectelor este împărțirea unui
proiect în cerințe. Rezolvarea tuturor cerințelor unui proiect reprezintă încheierea acestuia cu
succes.
Împărțirea în cerințe oferă posibilitatea dezvoltării în paralel a funcționalităților unui proiect.
Pentru a putea aborda cerințele în funcție de importanța lor, a fost introdus un sistem de
priorități ce cuprinde 5 stări. Aceste stări sunt: prioritate foarte mică, mică, normală, mare, foarte
mare.
20
Având două cerințe ce se suprapun ca și interval de dezvoltare, cea cu prioritatea mai mare
va fi aleasă ca cerință principală, cât timp ea nu depinde de finalizarea cerinței cu prioritate mai
mică. În caz contrar, prioritatea cerinței mai mici ar trebui ridicată la cel puțin aceeași prioritate ca
cerința ce depinde de ea.
Datorită complexității unui proiect, cerințele acestuia nu pot fi considerate ca fiind identice
ca și tip. Unele cerințe presupun rezolvarea unei probleme întâlnite în timpul procesului de
dezvoltare, altele necesită implementarea unei noi funcționalități sau îmbunătățirea unui anumit
aspect al proiectului. Cele 3 tipuri ce pot caracteriza o cerință sunt: bugfix, îmbunătățire,
funcționalitate nouă.
Tipul unei cerințe este pur informativ însă, în funcție de componența echipei de dezvoltare,
poate căpăta un rol mai important. În cadrul unei echipe de dezvoltare pot exista grupuri de
persoane specializate pe rezolvarea bug-urilor întâlnite în aplicație sau pe optimizarea și
introducerea de noi funcționalități. Atribuind tipul corect de cerință echipei ce este specializată pe
acel tip, crește probabilitatea ca cerința sa fie rezolvată în timp util.
Stările ce îi pot fi atribuite unei cerințe sunt: succes, eșec, deschis, închis. Decizia proiectării
unui sistem cu 4 stări a fost luată pentru a oferi un modul de raportare mult mai detaliat atunci când
vine vorba de cerințe.
Cerințele aflate în lucru sunt marcate cu starea deschis pentru a permite editarea. Starea
închis este folosită pentru a semnala oprirea dezvoltării cerinței. În orice moment această stare
poate fi schimbată pentru a permite reluarea activităților de editare.
Așa cum se poate vedea din Fig. 4, stările succes și eșec sunt finale. Marcarea unei cerințe cu
una din ele va bloca posibilitatea modificării acesteia. În acest fel, cerințe raportate ca fiind încheiate
cu succes vor fi identificate ca atare în toate celelalte rapoarte.
Notițele reprezintă marcarea muncii depuse de către un programator pentru rezolvarea unei
cerințe. Atunci când s-au făcut progrese sau o anumită perioadă de timp a trecut, utilizatorul
21
marchează aceste evenimente adăugând o notiță cerinței la care a lucrat. Adăugarea notițelor nu
este limitată doar utilizatorului căruia i-a fost atribuită cerința ci tuturor utilizatorilor ce dețin acest
drept.
Suma timpului înregistrat în notițelor unei cerințe va determina timpul real petrecut pentru
a finaliza cerința.
Unul din cele mai importante roluri ale unui software de gestiune a proiectelor îl reprezintă
partajarea fișierelor. Datorită importanței planificării, documentele rezultate din această etapă
reprezintă baza pentru dezvoltarea oricărui produs software. Rolul de a face disponibile aceste
documente tuturor persoanelor implicate în dezvoltarea unei cerințe este îndeplinit de atașamente.
Un atașament cuprinde:
Identificator unic: folosit pentru identificarea în cod a unuei notițe
Identificator cerință: legătura cu cerința ce va conține noul atașament
Cale fișier: calea la care atașamentul va fi salvat pe server
Nume fișier: folosit pentru afișarea în interfață
Comunicarea între membrii unei echipei permite răspândirea mult mai ușoară a informațiilor
vitale bunului mers a proiectului. Calitatea muncii realizate de o echipă crește atunci când informații
și experiențe folositoare sunt împărțite între membrii ei. Comunicarea între membrii unei echipe va
fi realizată prin intermediul postărilor și a comentariilor.
O postare cuprinde:
Identificator unic: folosit pentru identificarea în cod a unuei notițe
Mesaj: informația
Nume utilizator: numele utilizatorului ce a adăugat postarea
22
Un comentariu cuprinde:
Identificator unic: folosit pentru identificarea în cod a unuei notițe
Mesaj: informația
Nume utilizator: numele utilizatorului ce a adăugat comentariul
Identificator postare: postarea căreia îi va fi adăugat comentariul
23
CAPITOLUL 4
Detalii de implementare
În acest capitol vor fi prezentate detaliile legate de implementarea tuturor componentelor
aplicației (bază de dată, acțiuni, interfață) și modului în care acestea interacționează.
Este un model foarte popular datorită ușurinței cu care permite testarea fiecărei
componente în parte și potențialului ce îl oferă dezvoltării în paralel, de către echipe diferite, a unei
singure aplicații.
Aplicația a fost proiectată folosind modelul MVC datorită clarității ce îl oferă structurii unui
proiect software și ușurinței cu care fiecare componentă poate fi testată individual. Implementarea
bazei de date este realizată prin intermediul modelelor și a clasei ce creează contextul bazei de date.
Interacțiunea cu utilizatorul se face prin intermediul controllerelor iar interfața este servită de către
view-uri.
5
http://msdn.microsoft.com/en-us/library/dd381412%28v=vs.108%29.aspx
25
Folosind abordarea code first, întreaga structură a bazei a fost definită în cod, folosind
modelele de bază ale claselor User, Project, Task, Note, Attachment, Post și Comment. Fiecare din
aceste clase păstrează structura gândită în partea de proiectare.
În List. 1 este prezentată clasa Project scrisă în limbajul C#. Se poate observa că proprietățile
clasei sunt tipuri specifice C# (int, string, DateTime) sau alte obiecte (Users, Task). Există un set de
convenții ce permit platformei EF să introducă anumite modificări fără a fi necesară intervenția
directă a dezvoltatorului. Declararea proprietății id va notifica EF că aceasta este cheia primară a
tabelei ce va rezulta din clasa Project.
Tasks și Users sunt proprietăți de navigare ce conțin entități ce se găsesc în relație directă cu
entitatea Project. Lista Tasks conține toate task-urile ce au ca cheie externă id-ul proiectului iar User
conține utilizatorul al cărui cheie primară este egală cu valoarea cheii externe CreatedByUser a
proiectului.
Structura tabelei rezultate din clasa Project este prezentată în List. 2. Toate proprietățile au
fost introduse ca și coloane iar tipurile lor au fost convertite în tipuri specifice bazelor de date SQL.
Se poate observa partea în care coloana Id este marcată ca fiind cheia primară a acestei tabele.
Toate aceste acțiuni au fost realizate de platforma EF.
modelBuilder.Entity<User>()
.HasMany(u => u.Projects)
.WithRequired(p => p.CreatedBy)
.HasForeignKey(p => CreatedByUser)
.WillCascadeOnDelete(false);
List. 3 Exemplu de folosire Fluent API
Bucata de cod prezentată în List. 3, conține o mapare realizată prin intermediul FluentAPI.
Pentru entitatea Users este marcată proprietatea de navigare Projects ce reprezintă o listă a
proiectelor asociate unui utilizator. Legătura este făcută prin intermediul proprietății de navigare
CreatedBy ce conține entitatea User ce a creat proiectul și proprietatea CreatedByUser ce reprezintă
cheia externă ce face legătura între proiect și utilizator.
Pentru a putea putea interacționa cu informațiile din baza de date, este necesară folosirea
clasei System.Data.Entity.DbContext6. Aceasta se ocupă de gestionarea entităților, persistarea lor
pe durata rulării unei aplicații, încărcarea datelor din bază și salvarea modificărilor.
6
http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext%28v=vs.103%29
27
<connectionStrings>
<add
name="AppContext"
connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=AppDb;Integrated
Security=SSPI;"
providerName="System.Data.SqlClient" />
</connectionStrings>
List. 5 Detaliile bazei de date
Așa cum am văzut în secțiunea anterioară, pentru a avea acces la baza de date trebuie să
folosim clasa AppContext. Pentru a împărți obiectul de tip AppContext între toate controllerele, a
fost implementată clasa BaseController.
public BaseController()
{
;
}
~BaseController()
{
db.Dispose();
base.Dispose();
}
}
List. 6 Clasa BaseController
28
Această clasă are ca scop oferirea unui context static tutoror controllerelor prin intermediul
moștenirii. Toate controllerele moștenesc BaseController!
~BaseController() este destructorul clasei și este apelat pentru a asigura eliberarea memoriei
și închiderea conexiunilor cu baza de date.
4.3.1 LINQ
Aplicația folosește LINQ pentru realizarea tuturor interogărilor din cod. În List. 7 este
ilustrată o interogare a bazei de date pentru a obține ultimele 10 cerințe ordonate după data
modificării.
db.Tasks
.Select(u => u)
.Where(t => !t.Private || t.CreatedBy.Username ==
User.Identity.Name || t.AsignedTo.Username ==
User.Identity.Name)
.OrderByDescending(t => t.LastModified)
.Take(10)
.ToList();
List. 7 Încărcarea cerințelor folosind LINQ
Afișare (Index)
Afișarea tuturor utilizatorilor înregistrați în aplicație. Această acțiune este disponibilă doar
utilizatorilor ce dețin rolurile Administrator sau ProjManager.
Autentificare (Login)
Pentru a putea folosi aplicația, fiecare utilizator trebuie să își confirme identitatea. Acest
lucru se face prin intermediul unui nume de utilizator și a unei parole. Metoda de autentificare va
căuta în baza de date perechea (nume,parolă) și , dacă aceasta este validă și utilizatorul este activ,
va confirma identitatea utilizatorului.
Dezautentificare (Logoff)
Dezautentifică utilizatorul înregistrat în sesiunea curentă.
29
Înregistrare (Register)
Metoda permite introducerea unor noi utilizatori în baza de date. Ea poate fi apelată de
oricine însă un utilizator înregistrat nu poate folosi contul până când administratorul nu confirmă
autenticitatea lui. Tot administratorul poate modifica rolul unui cont nou creat, rolul atribuit unui
nou cont fiind cel de reporter.
Clasa Home are ca rol colectarea și afișarea informațiilor de pe pagina principală a aplicației.
Aceste informații sunt disponibile doar utilizatorilor autentificați.
Afișare (Index)
Întoarce o listă de 10 cerințe și una de 10 proiecte, ambele ordonate dupa data ultimei
modificări. Principalul rol al acestor liste este acela de a informa utilizatorul care sunt cele mai noi
activități realizate de membrii echipei.
30
Crează (Create)
Adaugă o notiță pentru cerința selectată. Timpul introdus de utilizator estre transformat în
minute înainte ca notița să fie salvată.
4.3.8.1 SignalR
SignalR este un API ce permite adăugarea funcționalităților ce oferiră conținut în timp real
utilizatorilor. Aceasta presupunere trimiterea de conținut dinspre server către client imediat ce noi
informații au fost adăugate, fără a aștepta un request de la client. Principala tehnologie pe care se
bazează este protocolul WebSocket, introdus în versiunea a 5-a a limbajului HTML.
WebSocket permite crearea unei conexiuni bidirecționale persistente între client și server,
oricare dintre aceștia putând iniția trimiterea de date în orice moment. Deoarece este o tehnologie
nouă, nu toate browserele au implementat-o încă. Cu toate acestea, atunci când detectează că
serverul sau clientul nu suportă WebSocket, SignalR folosește alte tehnologii pentru a oferi aceleași
funcționalități, fără a fi nevoie de efort în plus din partea dezvoltatorului.
Pentru a oferi utilizatorilor opțiunea de a inspecta starea tuturor elementelor din aplicație, le
este pusă da dispoziție componenta de statistică și raportare. În această interfață utilizatorului îi
sunt prezentate statistici formate pe baza informațiilor din interiorul aplicației. Fig. 7 prezintă
diagramele ce corespund procentului de proiecte ce se află în una din posibilele stările și numărul de
task-uri ce au fost adăugate pentru fiecare proiect.
7
https://dotnethighcharts.codeplex.com/
8
http://www.highcharts.com/
33
CAPITOLUL 5
Testare și evaluare
Pentru testarea aplicației am folosit YSlow, extensie pentru Firebug realizată de dezvoltatorii
de la Yahoo!. Aceasta oferă unei pagini web o notă și un scor, în funcție de performanțele oferite.
Folosind ultima versiuena a browserului Firefox (30.0) și Firebug, scorul întors de YSlow a
fost de 83 puncte.
În Fig. 8 se poate observa că, pentru a încărca elementele paginii, sunt necesare 14 cereri
HTTP iar dimensiunea componentelor descărcate este de aproape 1MB atunci când acestea nu sunt
introduse în cache.
bundles.Add(new ScriptBundle("~/bundles/bootstrap").Include(
"~/Scripts/bootstrap.js",
"~/Scripts/respond.js",
"~/Scripts/bootstrap-datepicker.js",
"~/Scripts/jquery.dataTables.js"
));
List. 8 Declararea unui pachet de script-uri JS
List. 8 prezintă gruparea unor script-urilor folosite în aplicație într-un pachet numit
bootstrap. Pentru a încărca acest pachet este suficientă apelarea lui în interfață prin intermediul
metodei Render, ca în exemplul @Scripts.Render("~/bundles/jquery"). Folosind
pachetul bootstrap, numărul de cereri HTTP trimise serverului pentru a încărca cele 4 fișiere JS a fost
redus de la 4 la o singură cerere.
CAPITOLUL 6
Așa cum a fost prezentat și în acest document, gestiunea proiectelor este un domeniu
complex ce necesită cunoștințe avansate de management a timpului, calității și a resurselor umane.
Rezultatul unei gestiuni reușite este micșorarea efortului depus de echipa de dezvoltare și mărirea
ratei de succes a proiectelor. Soluțiile software oferă o gamă largă de funcționalități ce permit
automatizarea unora din acțiunile necesare în procesul de gestiune.
Fiind dezvoltat ca aplicație web, proiectul permite accesul tuturor utilizatorilor, indiferent
de sistemul de operare folosit, prin intermediul oricărui browser modern. Aplicația poate fi folosită
ca SaaS, permițând companiilor să folosească spațiul de stocare și puterea de procesare a unui
server comun sau ca aplicație locală, fiecare companie folosindu-și propriile resurse.
Workflow. Permite construirea unui arbore ce ilustrează modul în care cerințele unui
proiect depind unele de altele. În acest mod se poate identifica grafic drumul ce trebuie
parcurs pentru a implementa cerințele în ordinea corectă. Necesită introducerea
conceptului de resursă.
Anexa A
Bibliografie
[1] Andrew Stellman, Jennifer Green, “Applied Software Project Manager” (Gestiunea aplicată a proiectelor
software), O’Reily, 2005
[2] Project Management Institute Inc. , “A Guide To The Project Management Body Of Knowledge – Fourth
Edition” (Un ghid al cunoștințelor gestiunii proiectelor), Project Management Institute Inc.,
Pennsylvania, 2009