Dizajni i Sistemit të Softuerit

1. Koncepte bazë

Softueri dhe produkti

Softueri është çdo entitet ekzekutiv, si një program ose pjesët e tij (nënprogramet).

Produkti softuerik është një entitet i përbërë nga një ose më shumë programe, të dhëna, materiale dhe shërbime mbështetëse që plotësojnë nevojat e klientëve.

Produkti me softuer në të (p.sh. bankomati, makina) nuk është i njëjtë me produktin softuerik (Word, Excel).

Çfarë është dizajni i softuerit?

Aktiviteti i specifikimit të natyrës dhe përbërjes së produkteve që plotësojnë nevojat e klientëve, nën kushte të caktuara.

  • Dizajni i produktit — features, aftësi, ndërfaqe → rezultati është SRS.
  • Dizajni inxhinierik — programe, nënsisteme, pjesë punuese → rezultati është design document.

Design = Analizë (zbërthimi i problemit) + Rezolucion (zgjidhja e problemit).

Abstraksioni

Shtypja ose injorimi i disa karakteristikave në favor të të tjerave, për ta thjeshtuar problemin.

Procedural

Fokusohet në mënyrën se si kryhet një veprim ose proces (hapat, algoritmi).

I të dhënave

Fokusohet në paraqitjen dhe organizimin e të dhënave: fsheh implementimin, shfaq vetëm informacionin e nevojshëm.

Top-down: version abstrakt, pastaj detaje. Bottom-up: zgjidh pjesë, pastaj i lidh.

Modele statike vs dinamike

Statik — aspekte që nuk ndryshojnë gjatë ekzekutimit (class/object diagram).

Dinamik — çfarë ndodh gjatë ekzekutimit (state, sequence).

Kërkesat jofunksionale

Është mirë t’i paraqesim sepse përcaktojnë cilësinë e sistemit: performancë, siguri, besueshmëri, disponueshmëri, etj. (cilësi, jo “çfarë bën” sistemi).

2. Fazat e dizajnit

  1. Dizajni arkitekturor — struktura e përgjithshme; pjesët kryesore, përgjegjësitë, ndërfaqet, ndërveprimet (DeSCRIPTR).
  2. Dizajni i detajuar — klasat, funksionet, algoritmet, struktura e të dhënave (DeSCRIPTR-PAID).
  3. Dizajni i të dhënave — organizimi i databazës, tabelat dhe relacionet.
  4. Dizajni i ndërfaqes — si ndërvepron përdoruesi me sistemin (sintaksë, semantikë, pragmatikë; pre/post).
  5. Dizajni i komponenteve — pjesë të vogla që mirëmbahen dhe testohen në mënyrë të pavarur.

Niveli i mesëm specifikon klasa/komponente; niveli i ulët plotëson detajet më të vogla.

3. Parime, modularitet, OOP

Parime themelore

  • Fizibiliteti — i pranueshëm vetëm nëse mund të realizohet.
  • Përshtatshmëria — sa më shumë nevoja të palëve, aq më mirë.
  • Ekonomia — më pak kohë, kosto, rrezik.
  • Ndryshueshmëria — lehtë për t’u ndryshuar (kursen kohë/para kur klienti ndryshon kërkesat).

Modularitet

  • Module të vogla, fshehje informacioni, privilegji më i vogël.
  • Low coupling — pak varësi mes moduleve.
  • High cohesion — pjesët e modulit janë të lidhura fort me njëra-tjetrën.

Kohezioni rritet kur moduli implementon një data type (vlera + operacione mbi to).

OOP shkurt

  • Enkapsulimi — kufizon qasjen; grumbullon të dhëna + metoda.
  • Polimorfizmi — i njëjti simbol, kuptim sipas kontekstit; RIP = Replace IFs with Polymorphism.
  • Overloading — i njëjti emër metode, nënshkrime të ndryshme.
  • Defensive copy — kthe/jap kopje, jo referencën origjinale.
  • Delegimi — moduli ia beson një përgjegjësi tjetrit (ripërdorim pa thyer trashëgiminë).
  • Invariant i klasës — pohim i vërtetë mes thirrjeve të operacioneve të eksportuara (p.sh. 0 ≤ numFree ≤ roomSize).

4. Arkitektura dhe stile

Stili arkitektonik = model i nivelit të lartë për programe/nënsisteme.

Layered

Shtresat përdorin shërbimet poshtë dhe ofrojnë shërbime lart. Strict = vetëm shtresa menjëherë poshtë; relaxed = të gjitha poshtë. Shtresat e poshtme janë më të ripërdorshme sepse nuk varen nga ato sipër.

MVC

  • Model — domeni i problemit, të dhëna + operacione.
  • View — shfaqja e të dhënave.
  • Controller — merr inputin e përdoruesit.

Browser → Controller → Model → View. Views/controllers mund të ndryshohen pa prekur modelin; por UI varet shumë nga modeli dhe përditësimet e shpeshta mund ta ngadalësojnë UI.

Të tjera

  • Pipe-and-Filter — filtra të lidhur me “pipes”.
  • Shared-Data — Repository (depo pasive) ose Blackboard (depo që njofton).
  • Event-driven — shpërndarës ngjarjesh; komponentët njoftohen, nuk mbajnë gjendje të përbashkët të fortë.

SAD (Software Architecture Document)

  1. Përmbledhje produkti
  2. Modele arkitekturore
  3. DeSCRIPTR
  4. Hartimi ndërmjet modeleve
  5. Arsyetimi i dizajnit (vendime të vështira/të palëvizshme)

Review kur është pothuajse i plotë: fizibilitet, modele të formuara mirë, plotësi, qartësi, konsistencë. Review aktiv = ekspertët përgjigjen pyetjeve specifike.

Dokumenti i dizajnit = SAD + DDD (modele mid/low-level, mapping, rationale, glossary).

Arkitektura ndërtohet iterativisht: Analizo → Gjenero → Evaluo → Zgjidh → Finalizo.

5. UML, ndërfaqe, kolaborim

Pajisja virtuale ideale: simplicity, cohesion, loose coupling, information hiding, stability.

Pass by value = vlera; pass by reference = adresa. Një vlerë kthimi → by value; dy+ vlera → by reference.

6. Pyetje nga afatet (përmbledhje)

Specifikim kërkesash vs aktivitetet e dizajnit

Kërkesat = product design (features/interfaces) → SRS. Dizajni = engineering design (programe/nënsisteme) → design document. Të gjitha aktivitetet e dizajnit bazohen në kërkesat e specifikuara.

Çfarë nuk shfaqet në model konceptual, por po në design class

Konceptual: entitete, atribute, relacione të problemit. Design class: klasa softuerike, operacione, asociacione — ende jo detaje implementimi.

Refactoring dhe design patterns

Refactoring përmirëson kodin pa features të reja. Patterns janë blueprints për probleme të shpeshta. Mund t’i përdorësh gjatë refactoring (p.sh. Factory Method). Streamlining docs: forma e pattern-it nuk ka nevojë të detajohet për çdo rast specifik.

Deklarativ vs procedural

Deklarativ: input/output/kufizime/rezultat pa algoritëm. Procedural: hapat si transformohen inputet.

Kur thyhet information hiding

Kur modulet duhet të ndajnë një entitet (p.sh. shared queue) ose kur një qëllim tjetër (performanca) ka prioritet më të lartë.

Design themes → mid-level

Design story → tema → klasa kandidate + përgjegjësi → hiq të ngjashmet/jashtë scope → class diagram.

Nga conceptual në mid-level

Actors → interface classes; shto domain/startup/controller/coordinator; data types; containers; asociacione inxhinierike.

Parime vs patterns

Parimet janë më abstrakte (SOLID, fizibilitet…). Patterns janë zgjidhje konkrete (Singleton, Factory…).

Mikroserviset: vetëm API Gateway?

Jo. Zakonisht duhen edhe service discovery, auth, messaging/events, observabilitet, etj. — jo vetëm një portë e vetme.

7. Ushtrim dekompozim — Qendra e servisimit

Teksti

Një kompani dëshiron të zhvillojë një Sistem për Menaxhimin e një Qendre të Servisimit të Pajisjeve Elektronike.

Sistemi duhet të mundësojë regjistrimin e klientëve që sjellin pajisje për servis. Për secilin klient ruhen të dhënat bazë si emri, mbiemri, numri i telefonit dhe email-i.

Kur një klient sjell një pajisje, punëtori regjistron pajisjen në sistem. Për pajisjen ruhen të dhëna si lloji i pajisjes, marka, modeli, numri serik dhe përshkrimi i problemit të raportuar nga klienti.

Pas regjistrimit të pajisjes, krijohet një kërkesë për servis. Kërkesa lidhet me pajisjen përkatëse dhe përmban datën e pranimit, përshkrimin fillestar të problemit dhe statusin e kërkesës.

Kërkesa mund t’i caktohet një tekniku. Sistemi ruan të dhënat e teknikëve, specializimin dhe nëse janë aktivë ose jo. Një kërkesë mund t’i caktohet vetëm një tekniku aktiv.

Tekniku kontrollon pajisjen dhe regjistron një diagnozë (përshkrimi i defektit dhe veprimi për riparim). Pastaj mund të regjistrojë një ose më shumë ndërhyrje servisimi: përshkrimi i punës, data dhe kostoja.

Gjatë riparimit mund të përdoren pjesë rezervë. Sistemi ruan pjesët, sasinë në depo dhe çmimin. Para përdorimit kontrollon nëse ka sasi të mjaftueshme.

Kur riparimi përfundon, sistemi krijon një faturë të lidhur me kërkesën (kosto totale e ndërhyrjeve + pjesëve). Klienti e merr pajisjen vetëm pasi kërkesa të jetë përfunduar.

Kërkesat e ushtrimit

  1. Identifiko modulet kryesore të sistemit dhe bëj lidhjet/varësitë.
  2. Zgjidh një modul dhe bëj dekompozimin e tij.
  3. Zgjidh një interface dhe bëj dekompozimin e tij.
  4. Trego përgjegjësitë e moduleve.
  5. Për një modul krijo përgjegjësitë e detajuara.
  6. Për një interface cakto Pre dhe Post conditions.

1. Modulet kryesore të sistemit

Modulet kryesore të qendrës së servisimit dhe varësitë
Lidhjet mes moduleve: klientë, pajisje, kërkesa, teknikë, diagnoza, ndërhyrje, pjesë rezervë, fatura

2. Dekompozimi i modulit Menaxhimi i Kërkesave

Dekompozimi i modulit Menaxhimi i Kërkesave

3. Dekompozimi i interface IRequestHandlerService

Dekompozimi i ndërfaqes IRequestHandlerService

4. Përgjegjësitë e moduleve

ModuliPërgjegjësia
Menaxhimi i KlientëveRegjistron dhe menaxhon të dhënat bazë të klientëve
Menaxhimi i PajisjeveRegjistron pajisjet dhe i lidh ato me klientët përkatës
Menaxhimi i KërkesaveKrijon dhe menaxhon kërkesat për servis, cakton teknikun dhe përditëson statusin e kërkesës
Menaxhimi i TeknikëveMenaxhon të dhënat e teknikëve, specializimin dhe statusin aktiv/joaktiv
Menaxhimi i DiagnozaveRegjistron diagnozën e pajisjes dhe përshkrimin e defektit të gjetur
Menaxhimi i NdërhyrjeveRegjistron punët e kryera gjatë servisimit dhe kostot e tyre
Menaxhimi i Pjesëve RezervëMenaxhon pjesët rezervë, sasinë në depo dhe çmimet e tyre
Menaxhimi i FaturaveKrijon faturën dhe llogarit koston totale të ndërhyrjeve dhe pjesëve të përdorura

5. Përgjegjësitë e detajuara — Menaxhimi i Kërkesave

PërgjegjësiaPërshkrimiBashkëpunuesit
Krijimi i kërkesësKrijon një kërkesë të re për servis për pajisjen përkatëseMenaxhimi i Pajisjeve
Ruajtja e të dhënave të kërkesësRuan datën e pranimit, përshkrimin fillestar të problemit dhe statusin e kërkesës
Caktimi i teknikutCakton një teknik për kërkesën dhe siguron që tekniku i zgjedhur është aktivMenaxhimi i Teknikëve
Përditësimi i statusitNdryshon statusin e kërkesës gjatë procesit të servisimit

6. Pre dhe Post — IRequestHandlerService

MetodaPREPOST
createRequest() Pajisja ekziston, të dhënat bazë të kërkesës janë dhënë Është krijuar një kërkesë e re për servis, e lidhur me pajisjen përkatëse, me status fillestar
saveRequestData() Kërkesa ekziston, të dhënat e kërkesës janë valide Data e pranimit, përshkrimi fillestar i problemit dhe statusi i kërkesës janë ruajtur
assignTechnician() Kërkesa ekziston, tekniku ekziston, tekniku është aktiv Tekniku është caktuar te kërkesa; kërkesa ruan teknikun e caktuar
updateRequestStatus() Kërkesa ekziston, statusi i ri është i vlefshëm Statusi i kërkesës është përditësuar me statusin e ri

8. Shembull: sistemi universitar

Komponentët: BillingManager, ScheduleAndSubjectManager, StudentManager, ProfessorManager, LabManager, StudentHistory, DepartmentManager, SecurityManager.

Diagrami i moduleve dhe përgjegjësitë për sistemin universitar
Module, dekompozim komponenti, pre/post dhe CRC për ScheduleAndSubjectManager

9. Rast: menaxhimi i aeroportit

Pasagjeri

Emri, mbiemri, pasaporta, kombësia, telefoni, email. Historik udhëtimesh, check-in (i pa-regjistruar / i regjistruar / i hipur në bord), bagazhi.

Stafi

Pilotë, stjuardesa, teknikë, staf toke, menaxherë. Emri, roli, ID, orari, çertifikata, turnet. Departamente: Operacionet e Fluturimit, Mirëmbajtja, Siguria, Shërbimet për Klientët.

Fluturimet

Numri, kompania, origjina/destinacioni, orët, porta, avioni, statusi (planifikuar, vonuar, anuluar, nisur, mbërritur). Lidhet me pasagjerët, ekuipazhin dhe portën.

Portat / terminalet

Caktim portash, disponueshmëri, mirëmbajtje, koordinim me kompanitë. Status: e lirë, e zënë, në mirëmbajtje.

Biletat dhe pagesat

Klasa (ekonomike, biznes, e parë), check-in online/fizik, ndryshim/anulim, rimbursime, raporte. Bileta ↔ pasagjer + fluturim + klasë.

Siguria

Kontroll pasagjerësh/bagazhesh, hyrje në zona të kufizuara, audit log, RBAC: administrator, pilot, staf toke, pasagjer.

Arkitektura e moduleve të aeroportit: pasagjer, portë, staf, pagesa, siguri
Menaxherët, IPagesa (generate/issue/journal) dhe Pre/Post për TicketGenerator, UpdateTicket, CheckIn

10. Rast: menaxhimi i hotelit

Mysafiri

Të dhëna personale + metodë pagese. Historik qëndrimesh, preferenca (pamje, kat, shtrat), besnikëri: standard / argjend / ar / platin.

Stafi

Recepsionistë, pastrues, menaxherë, teknikë, kuzhinierë. Turni: mëngjes, mbasdite, natë. Departamente: Recepsioni, Mirëmbajtja, Pastrimi, Restoranti, Menaxhimi.

Dhomat

Numri, kati, tipi (standard, deluxe, suite, presidenciale), çmimi/natë, kapaciteti, pajisjet. Status: e lirë, e zënë, në pastrim, në mirëmbajtje, jashtë përdorimit.

Rezervimet

Krijim/modifikim/anulim. Lidhet me mysafirin, dhomën, datat, numrin e mysafirëve, kërkesa speciale. Status: konfirmuar, anuluar, në pritje, përfunduar.

Faturimi

Fatura nga netët + room service + restorant + mini-bar + spa. Kartë/cash/transfertë, depozita, raporte, rimbursime.

Siguria

Hyrje, aktivitete, karta aksesi për dhoma, role: administrator, recepsionist, pastrues, teknik, menaxher.

Module të hotelit: mysafir, rezervim, dhomë, pagesa, staf
IReservation me create/cancel/update dhe Pre/Post
Menaxheri i stafit dhe ndërfaqet e raportimit
Menaxheri i stafit, IStaff, raporte
Tabela CRC PatientManager me përgjegjësitë
PatientManager: regjistro, përditëso, histori mjekësore, kërko, arkivo