Professional Documents
Culture Documents
Skripta_RVA
Skripta_RVA
Skripta_RVA
Klasni dijagram je najčešće korišćen dijagram. Opisuje tipove objekata u sistemu i veze izeđu njih.
Objekti imaju svojstva (properties) i operacije. Svaka klasa ima javne, privatne, zaštićene i paketne
elemente. Atributi opisuju svojstvo klase (npr. - cena : double). Kardinalitet može biti 1, 0..1, *.
Operacije su aktivnosti koje klasa može da obavlja (npr. + Pozovi (string brojTelefona) : bool).
Napomene i komentari se mogu pojaviti na svakoj vrsti dijagrama. Nezavisni su od drugih
elemenata ili su spojeni isprekidanom linijom sa elementima koje objašnjavaju. Statičke operacije i
atributi se odnose na celu klasu, ne na njenu instancu. Relacija agregacije predstavlja odnos celina-
deo (npr. automobil-guma). Kompozicija je specijalan slučaj kada svaka instanca mora pripadati
samo jednom vlasniku. Izvedena svojstva se mogu izračunati na osnovu drugih svojstava i
označavaju se kosom crtom (npr. - /duzina: int; - pocetak: int; kraj: int; duzina = kraj - pocetak).
Objekti apstraktne klase se ne mogu napraviti, već samo njene podklase. Ona sadrži apstraktne
operacije. Nije realizovana, već deklarisana. U UML-u su napisane iskošeno.
Interfejs je klasa koja nije realizovana i označava se sa <<interface>>. Klasa može da realizuje
interfejs ili da zahteva interfejs. Jedna od razlika je to što apstraktna klasa može da ima apstraktne i
neapstraktne metode, a interfejs samo apstraktne.
Klasa asocijacija omogućuje da se asocijacijama dodaju atributi i operacije koje se čuvaju samo u
jednoj klasi. Može postojati samo jedan primerak ove klase.
5. Dijagrami sekvence
Najčešći dijagram interakcije je dijagram sekvence. Koriste se kada se želi posmatrati ponašanje
objekta u okviru jednog slučaja upotrebe. Prikazuje jedan scenario koji obuhvata više objekata i
poruka koje oni razmenjuju za dati slučaj korišćenja. Opisuje interakciju između objekata prikazanih
vertikalnom linijom života i poruka koje se čitaju odozgo nadole. Elementi dijagrama su učesnici-
objekti, poruke, linija života, traka aktivnosti, primljena poruka. Nisu zgodni za prikazivanje petlji i
uslova, ali to se može odraditi okvirima interakcije. U okvire se dodaju operatori, npr. loop za petlju
sa jednim fragmentom, opt za uslov sa jednim fragmentom itd. Ako su poruke sinhrone (pošiljalac
čeka na odgovor), vrh strelice je popunjen, ako su asinhrone (pošiljalac nastavlja sa radom bez
čekanja odgovora) onda je prazan.
6. Dijagrami aktivnosti
Dijagram aktivnosti je jedan od dijagrama ponašanja. Opisuje tok poslovne logike. Za razliku od
dijagrama toka, može da prikaže paralelno ponašanje. Polazi se od početnog čvora, može doći do
grananja (paralelne radnje), sinhronizacije paralelnog izvršavanja (oznaka join), odluke (jedan
ulazni tok i nekoliko uslovnih izlaznih) i stapanja (više ulaznih tokova i jedan izlazni). Particije
pokazuju koja klasa ili celina izvršava date akcije. Signali se mogu primati i slati. Vremenski signal
nastaje zbog protoka vremena. Signal ukazuje da aktivnost prima spoljašnji događaj.
8. Dijagrami stanja
Dijagrami raspoređivanja - Otkrivaju fizičku organizaciju sistema i delove aplikacije koji se izvršavaju
na određenim delovima računarskog sistema. Osnovni elementi su čvorovi:
• Uređaj - fizički element
• Izvršno okruženje - program koji sadrži neki drugi program, npr. operativni sistem
• Sadrži artefakte - fizička manifestacija softvera (najčešće datoteke: izvršne, konfiguracione,
podaci, HTML dokumenti)
Komunikacione putanje između čvorova označavaju da se između delova sistema obavlja
komunikacija.
Dijagrami objekata - Presek objekata sistema u nekom trenutku (uglavnom instance, ne klase).
Naziva se i dijagram instanci. Može se posmatrati i kao dijagram komunikacije bez poruka.
Dijagrami paketa - Paketi se dobijaju grupisanjem elemenata (bilo koje strukture UML-a, ne samo
klasa) u celine višeg nivoa (veliki broj klasa, dijagrama, use case). Oni su u hijerarhijskoj strukturi -
klasa pripada paketu, paket drugom paketu itd. Svaki paket pripada jednom namespace-u. U isti
paket treba stavljati klase koje treba menjati iz istih ili sličnih razloga ili one koje će se zajedno
koristiti. Na dijagramima je moguće prikazati sadržaj paketa.
Stilovi softverske arhitekture su familije sistema - obrasci (paterni) strukture. Korisno je poznavati
softverske obrasce jer nam to omogućuje da prepoznamo koji obrazac nam je najpogodniji za
korišćenje kada krećemo sa nekim projektom. Podela stilova po kategorijama:
• Komunikacija
◦ Servisno-orijentisana arhitektura (SOA)
◦ Arhitektura zasnovana na porukama (Message Bus)
• Raspoređivanje
◦ Klijent-server
◦ N-slojna
◦ 3-slojna
• Domen
◦ Dizajn vođen domenom
• Struktura
◦ Arhitektura zasnovana na komponentama
◦ Objektno-orijentisana arhitektura
◦ Slojevita arhitektura
◦ Mikroservisna arhitektura
Stilovi nisu isključivi.
Klijent-server arhitektura je dvoslojna arhitektura. Inicijalno je to UI-baza podataka, a opštije
gledano klijent-jedan ili više servera. Druge varijante ovog stila su: klijent - queue - klijent sistemi,
P2P, aplikativni serveri.
Arhitektura zasnovana na komponentama dekomponuje dizajn na funkcionalne ili logičke
komponente sa jasno definisanim interfejsima, metodama, atributima. Obezbeđuje viši nivo
apstrakcije od objektno-orijentisanog stila. Komponente mogu višestruko da se koriste, da se
menjaju, koriste u različitim okruženjima, proširive su, nezavisne.
Dizajn vođen domenom je objektno-orijentisan stil fokusiran na modelovanje poslovnog domena.
Potrebno je dobro poznavanje poslovnog domena.
Slojevita arhitektura je logička arhitektura, tj. razdvaja tipove po funkcionalnosti. Slojevi se mogu
nalaziti na istom ali i na različitim fizičkim računarima. Komponente komuniciraju u istom sloju i sa
susednima, a nekad i sa svim slojevima ispod sebe. Minimizira zavisnost između slojeva u cilju što
manjih promena.
Arhitektura zasnovana na porukama koristi kanale komunikacije kojima softverski sistem šalje i
prima poruke. Obično koristi ruter poruka ili Message Queueing. Strane koje komuniciraju su slabo
povezane.
Višeslojna fizička arhitektura (N-tier, 3-tier) predstavlja višeslojnu arhitekturu kod koje se delovi
aplikacije izvršavaju na različitim računarima. Uglavnom ima 3 sloja: prezentacioni, poslovni i sloj za
pristup bazi podataka. Svaki sloj je nezavisan od ostalih, osim što komunicira (obično asinhrono) sa
ostalim slojevima.
Objektno-orijentisani stil omogućuje programiranje na nivou objekata. Objekti predstavljaju
komponente sa određenim funkcionalnostima.
Servisno-orijentisana arhitektura obezbeđuje funkcionalnosti putem servisa. Servisi koriste
standardne interfejse. Servisi su organizovani tako da budu autonomni.
Mikroservisna arhitektura se poistovećuje sa korišćenjem cloud-a. Mikroservisi su organizovani
tako da aplikacija može da se razvija nezavisno od cloud-a, pa se posle postavi na cloud. Microsoft-
ov Service Fabric je razvojno okruženje koje omogućuje razvoj mikroservisa i testiranje aplikacije u
lokalu. Postoji simulator koji simulira izvršavanje aplikacije na cloud-u. On nudi dve vrste servisa:
statefull i stateless. Servisi su raspoređeni na više fizičkih računara (nodova) i ukoliko primarni
servis na jednom otkaže, sekundarni preuzima njegovu ulogu (failover). U cloud-u je to vreme
minimalno. Podaci su replicirani na sve nodove na kojima se nalaze sekundarni servisi. Replikacija
se obavlja tako što se piše i čita iz primarnih, a promene se prosleđuju u sekundarne i oni vraćaju
potvrdu. Do rekonfiguracije dolazi kada primarni server otkaže (sekundarni postaje primarni), kada
sekundarni otkaže (uklanjanje njega), pri obnavljanju replike i izgradnji novog sekundarnog
servisa/noda.
Potrebno je jasno definisanje ulaza (slučajevi korišćenja, funkcionalni zahtevi, tehnološki uslovi
itd.). Sam proces dizajniranja je iterativni proces koji se koristi za formiranje arhitekture, jako je
bitno jasno definisati ciljeve, važne slučajeve upotrebe kao i ključna pitanja. Osnovne faze su
identifikovanje ciljeva, definisanje ključnih scenarija, kreiranje izgleda aplikacije, identifikacija
ključnih pitanja i definisanje kandidata (prototipa). Horizontalne analize su po slojevima, a
vertikalne su interakcija između slojeva.
Koraci su sledeći:
1. Izabrati strategiju slojevitosti (definišu se načini grupisanja funkcionalnosti po slojevima)
2. Odrediti potrebne slojeve (kako i na koji način ćemo odrediti slojeve)
3. Odlučiti kako distribuirati slojeve i komponente (distribuiranje slojeva se radi saom kada je
neophodno, npr. kada želimo da ispunimo neke zahteve bezbednosti)
4. Utvrditi da li treba spojiti slojeve (kada je logika prosta pa neki sloj nije potreban)
5. Odrediti pravila za interakciju između slojeva (jednosmerna, dvosmerna itd.)
6. Identifikovati poprečne nadležnosti (da li se neki delovi mogu ponovo koristiti)
7. Definisati interfejse između slojeva (svaka izmena interfejsa je jako osetljiva)
8. Izabrati strategiju raspoređivanja (na koliko mesta i gde staviti određene komponente)
9. Izabrati komunikacione protokole
16. Prezentacioni sloj. Komponente, karakteristike
Prezentacioni sloj se deli na komponente korisničkog interfejsa (UI) i prezentacione logike (obrasci
poput MVC-a). MVC obrazac deli UI interakcije na tri izdvojene uloge: View, Controller, Model.
Zahteva analizu i definiciju tipa aplikacije, UI tehnologije, projektantskih obrazaca (npr. MVC),
dizajniranja entiteta i korisničkih zahteva.
Predstavlja sloj kod koga imamo mogućnost pristupa nekim izvoruma podataka na osnovu
poznavanja njihove destinacije i opisa samih podataka. Najčešće komponente koje se ovde
pojavljuju omogućuju i sam pristup tim podacima. Pristup je centralizovan, omogućena je
sinhronizacija i konzistentnost podataka. U okviru ovih komponenti je omogućena i logika pristupa
podacima u cilju efikasnijeg pristupa podacima. Najčešće komponente su pristup podacima (tu
spada centralizacija pristupa podacima i logika pristupa podacima) i servisni agenti (upravljaju
komunikacijom sa određenim servisima iz susednih slojeva i izoluju različite zahteve, obezbeđuju
npr. keširanje, mapiranje podataka).
19. Servisni sloj. Komponente, karakteristike
Servisni sloj obično ima zadatak da bude posrednik između prezentacionog sloja i poslovnog sloja i
da po potrebi omogući nekim spoljašnjim sistemima/servisima pristup našoj aplikaciji. Obično
sadrži interfejse servisa i tipove poruka (strukture sa podacima iz poruka da bi se komunikacija
mogla izvršiti)
Bavi se kohezijom na nivou komponenti. Njegovo pravilo je da jedna klasa treba da ima samo jedan
razlog za promenu (samo jednu odgovornost). Promena jedne odgovornosti može narušiti ili
onemogućiti sposobnost klase da ispuni drugu odgovornost.
23. Open/Closed Principle (OCP)
Softverski entiteti (klase, moduli, entitet) treba da budu otvoreni za proširenja, ali zatvoreni za
modifikacije. Da bi se ovo implementiralo potrebno je da se koristi apstrakcija (npr. klijent-server).
Proširenje predstavlja dodavanje novih funkcionalnosti, a modifikacija promenu postojećih.
Modifikacija uzrokuje izmenu postojećih metoda i funkcionalnosti i direktno utiče na uspešnost
izvršavanja testova čime je u mnogome ugrožena funkcionalnost softvera.
Njegovo pravilo je da bazni tipovi treba da budu zamenjivi njihovim podtipovima. Narušavanje LPS-
a često uzrokuje narušavanje OCP-a (primer kvadrat i pravougaonik).
Klijenti ne treba da zavise od metoda koje ne koriste (primer sigurnosna vrata, klasa ne treba da
nasleđuje interfejs koji ima metode koje ta klasa ne koristi)
• Moduli višeg nivoa ne treba da zavise od modula nižeg nivoa. I jedni i drugi bi trebalo da
zavise od apstrakcije
• Apstrakcije ne bi trebalo da zavise od detalja, već obrnuto
Kada imamo distribuirane aplikacije koje poseduju objekte koji treba međusobno da komuniciraju,
one ne bi trebalo direktno da referenciraju jedan drugog, nego da zavise od inerfejsa koji jedan
implementira, a drugi koristi.
Aleksandrova definicija obrasca: Svaki obrazac opisuje problem koij se stalno pojavljuje u našem
okruženju i zatim opisuje srž rešenja tog problema tako da se to rešenje može koristiti milion puta
na različite načine. On je smatrao da sve dobre građevine imaju zajedničke osobine, da procena da
je lepa građevina nije samo stvar ukusa i da treba tražiti zajedničke osobine u okviru problema koji
se rešavaju. Karakteristike softverskih obrazaca su: ime, namena, problem, rešenje, učesnici i
saradnici, posledice, realizacija. Klasifikacija obrazaca na osnovu domena (nivo apstrakcije): klase ili
objekti, a na osnovu namene: kreacioni, strukturalni/arhitektonski i obrasci ponašanja.
Unikat(Singleton) je kreatorski obrazac koji govori na koji način i šta je potrebno implementirati
kako bi se obezbedila funkcionalnost jedne instance klase sa globalnim pristupom. Npr. imamo
jedan serverski objekat i više klijentskih objekata koji mu pristupaju. Imajući u vidu da klijenti dele
informacije međusobno (neko šalje a neko ćita sa servera) i svi oni imaju pristup samo jednom
serveru, pitanje je kako sinhronizovati komunikaciju između servera i klijenta prilikom startovanja
servera. Singleton nam govori baš to, na koji način i šta je potrebno implementirati na serveru kako
bi se obezbedila funkcionalnost jedne instance klase sa globalnim pristupom. Klijent dobja pravu
instancu tipa Singleton preko metode getInstance() bez da vodi računa da li ona postoji ili ne. Ta
metoda proverava da li je instanca formirana ili je NULL. Ukoliko je NULL, kreiramo instancu, u
suprotnom vraćamo mu već napravljenu. Problem nastaje ukoliko više klijenata istovremeno
pozove tu metodu i tada se svakom od njih vraća nova instanca servera, a to ne želimo. To se rešava
pomoću atomskih regiona i mogućnošću njihovog zaključavanja. Primenjuje se duplo zaključavanje,
ukoliko oba klijenta prođu prvi uslov i dođu do drugog dela provere samo jedan klijent može da
kreira instancu do se drugom samo prosledi ta napravljena.
Komanda pripada klasi obrazaca ponašanja. Može se koristiti za vraćanje stanja pre izvršavanja
zahteva - undo, izvršavanje zahteva preko redova čekanja, pravljenje dnevnika zahteva (logging) i sl.
Zahtevi se pretaraju u objekte koji su podklasa apstraktne klase Komanda, sa operacijom Execute()
i Undo().
Adapter je strukturni obrazac. Pretvara interfejs klase u drugi interfejs koji klijent očekuje.
Predstavlja nešto što se koristi za prilagođavanje u svakodnevnom životu (npr. punjač telefona,
slušalice). Nije potrebno menjati klasu našeg sistema, kao ni klasu sistema sa kojim želimo da
izvršimo spajanje, dodatni kod i sve promene se vrše u adapteru.
Fasada je strukturni obrazac. Fasada je ono što posmatrač vidi spolja, što skriva unutrašnjost.
Fasada pojednostavljuje interfejs, dok Adapter menja interfejs u neki drugi. Ona skriva realizaciju
funkcionalnosti klasa ili interfejsa. Pruža jednostavan interfejs ka podsistemu. Služi da bi se izbegao
veliki broj zavisnosti između klijenata i klasa, već se sve obavlja preko njenih metoda.
Šablonski metod (Template) je obrazac ponašanja. Ukoliko postoje klase koje koriste slične metode,
potrebno je kreirati apstraktnu Template klasu koju će implementirati konkretne klase u kojima će
biti definisane metode iz Template klase. Primer recept za kafu i čaj. Template klasa ima jednu
metodu koja određenim redom poziva sve ostale, a te ostale metode su implementirane u
konkretnim klasama koje je nasleđuju.
Prototip je kreatorski obrazac. Omogućava da se kada imamo dosta objekata koji liče jedan na
drugi (isti su) novi objekti prave kopiranjem postojećeg objekta prototipa. Primer note i notne
linije. Postoje dve vrste kopiranja u C#: MemberwiseClone() - plitko kopiranje (shallow copy) gde se
ne kopiraju referencirani objekti i IClonable interfejs sa Clone() metodom koja pravi novu instancu
sa svim istim poljima kao i postojeća - deep copy. Korisnik bira na koji način će implementirati
metodu za kopiranje.
Muva je strukturni obrazac. Koristi se kada imamo potrebu da rukujemo velikim brojem objekata.
Ne pravi pojedinačne instance za svaki od potrebnih objekata (primer navijača na utakmici), već
koristi deljeni objekat - muvu. Glavna prednost je smanjenje memorije. Mana je nemogućnost
nezavisnog upravljanja instancom u okviru muve.
Dekorater je strukturni obrazac. Koristi se kada želimo dinamički da pridružimo neke dodatne
funkcionalnosti objektu. Koristi se kod multi-layer struktura (npr. korisnički interfejs, kafa sa raznim
dodacima itd.). Svaku od dodatnih odgovornosti pakujemo u jedan objekat. Objekti se hijerarhijski
referenciraju. Koristi open-closed princip, da klasa treba da bude otvorena za proširenja, a
zatvorena za modifikacije.
Factory metod je kreatorski obrazac. Radi se o metodi za pravljenje objekata, odnosno definisanje
interfejsa u okviru kojeg se nalazi metoda za pravljenje objekta. Cilj ovog obrasca je da se odvoji
objekat koji se pravi od klijenta, tj. implementacija koju klijent poziva od njega samog. Na taj način
se vrši enkapsulacija implementacije podataka.
Apstraktna fabrika je kreatorski obrazac i predstavlja proširenje Factory method obrasca. Koristi
interfejs za pravljenje familija povezanih objekata kojih klijenti nisu svesni. Klijent metodama
apstraktne fabrike prozvodi konkretne proizvode. Učesnici su apstraktna fabrika, konkretna fabrika
(nasleđuje apstraktnu), apstraktni objekat, konkretni objekat (nasleđuje apstraktni i kreira ga
konkretna fabrika).
41. Softverski obrazac - Proksi
Refaktorisanje predstavlja izmenu koda u cilju lakšeg razumevanja i jednostavnije modifikacije, ali
bez promene njegovog ponašanja. Osnovno pravilo je ostaviti kod u boljem stanju nego što si ga
zatekao. Proces refaktorisanja omogućava olakšano održavanje, dobro testiranje, TDD (Test Driven
Development). Preporučuje se konstantno testiranje refaktorisanog koda.