Professional Documents
Culture Documents
Manger
Manger
Robert Manger
SOFTVERSKO INŽENJERSTVO
Skripta
Sadržaj
Predgovor ....................................................................................................................................... 7
1. Uvod u softversko inženjerstvo ............................................................................................ 9
1.1. Osnovni pojmovi vezani uz softversko inženjerstvo ................................................... 9
1.1.1. Softverski produkt i softversko inženjerstvo ........................................................ 9
1.1.2. Softverski proces, metode i alati ........................................................................ 10
1.1.3. Dokumentacija softvera...................................................................................... 11
1.2. Modeli za softverski proces ....................................................................................... 12
1.2.1. Model vodopada ................................................................................................. 13
1.2.2. Modeli evolucijskog i inkrementalnog razvoja .................................................. 14
1.2.3. Modeli formalnog i grafičkog razvoja ............................................................... 15
1.2.4. Model usmjeren na ponovnu upotrebu ............................................................... 17
1.3. Klasične i agilne metode razvoja softvera ................................................................. 18
1.3.1. Vrste metoda i njihova svojstva ......................................................................... 18
1.3.2. Primjer klasične metode ..................................................................................... 19
1.3.3. Primjer agilne metode ........................................................................................ 21
1.4. Upravljanje softverskim projektom ........................................................................... 22
1.4.1. Poslovi softverskog menadžera .......................................................................... 23
1.4.2. Planiranje i praćenje projekta ............................................................................. 24
1.4.3. Upravljanje rizicima ........................................................................................... 27
2. Utvrđivanje zahtjeva ........................................................................................................... 29
2.1. Općenito o utvrđivanju zahtjeva ................................................................................ 29
2.1.1. Funkcionalni i nefunkcionalni zahtjevi .............................................................. 29
2.1.2. Postupak utvrđivanja zahtjeva ............................................................................ 31
2.1.3. Načini zapisivanja i organiziranja zahtjeva ........................................................ 32
2.2. Otkrivanje zahtjeva .................................................................................................... 35
2.2.1. Intervjui i ostali tradicionalni postupci............................................................... 35
2.2.2. Scenariji i slučajevi uporabe .............................................................................. 36
2.2.3. Upotreba prototipova.......................................................................................... 39
2.2.4. Etnografski pristup ............................................................................................. 40
2.3. Modeliranje sustava ................................................................................................... 41
2.3.1. Vrste modela i načini njihove uporabe ............................................................... 41
2.3.2. Modeliranje konteksta i interakcije .................................................................... 42
2.3.3. Modeliranje strukture ......................................................................................... 45
2.3.4. Modeliranje ponašanja ....................................................................................... 49
Predgovor
Ova skripta sadrže predavanja iz kolegija „Softversko inženjerstvo“ koji se predaje
studentima sveučilišnog diplomskog studija Računarstvo i matematika na PMF-
Matematičkom odsjeku Sveučilišta u Zagrebu. Osnovni cilj kolegija „Softversko
inženjerstvo“ je stjecanje temeljnih znanja o softverskom inženjerstvu. Dodatni ciljevi su da
se studenti kroz vježbe upoznaju s barem jednom konkretnom metodom razvoja softvera te da
se susretnu s barem jednim alatom za modeliranje softvera. Kolegij ima važnu svrhu: on
potreban zato da bi studentima na kraju studija omogućio sintezu i sistematizaciju znanja koja
su oni već stekli u prethodnim računarskim kolegijima. Drugim riječima, kolegij je koristan
zato što on prethodna znanja o programiranju, algoritmima, bazama podataka, mrežama
računala i drugim računarskim disciplinama povezuje u cjelinu, stvarajući pritom globalnu
sliku o cjelokupnom procesu razvoja softvera i o pozivu softverskog inženjera.
Tekst ovih skripta uglavnom se oslanja na udžbenik [1], tako da se taj udžbenik može smatrati
glavnom literaturom. Knjige [2, 3, 4, 5, 6, 7, 8] nisu neposredno uporabljene u oblikovanju
teksta, no one imaju sličan sadržaj pa mogu poslužiti kao dodatna literatura. Skripta ne
uključuju materijale za vježbe iz istog kolegija. Posljednjih godina, vježbe su se izvodile po
ugledu na knjigu [9].
Osnovni pojmovi u ovom kolegiju odnose se na razvoj softvera i već smo ih susretali u
prethodnim kolegijima kao što su programski jezici, računarski praktikumi, strukture
podataka i algoritmi, baze podataka, mreže računala i slično. Ipak, sad tim istim pojmovima
nastojimo dati preciznije značenje.
Softversko inženjerstvo je disciplina koja se bavi svim aspektima proizvodnje softvera. Dakle,
softversko inženjerstvo bavi se modelima, metodama i alatima koji su nam potrebni da bi na
što jeftiniji način mogli proizvoditi što kvalitetnije softverske produkte.
Softversko inženjerstvo počelo se razvijati krajem 60-ih godina 20. stoljeća. Sam naziv
izgleda da je bio skovan na jednoj NATO konferenciji u Njemačkoj 1968. godine. Disciplina
je nastala kao odgovor na takozvanu „softversku krizu“. Naime, pojavom računala treće
generacije (na primjer IBM serija 360) stvorila se potreba za složenijim softverom (na primjer
multi-tasking operacijski sustav). Pokrenuti razvojni projekti višestruko su premašili planirane
troškove i rokove. Vidjelo se da se dotadašnje neformalne tehnike individualnog
programiranja ne mogu uspješno „skalirati“ na velike programe gdje sudjeluje velik broj
programera. Osjećala se potreba za metodama razvoja softvera koje bi bile u stanju
kontrolirati kompleksnost velikog softverskog projekta. Stanje svijesti iz tih vremena
plastično je opisano u čuvenoj knjizi [26].
Od 60-ih godina 20. stoljeća do danas softversko inženjerstvo prešlo je dug put. Ispočetka su
se predlagale metode razvoja softvera oblikovane po analogiji s metodama iz tradicionalnih
tehničkih struka (na primjer mostogradnja). Kasnije se uvidjelo da je softver po mnogočemu
specifičan te da zahtijeva drukčije pristupe. Razvijali su se novi programski jezici, bolji načini
utvrđivanja zahtjeva, grafički jezici za modeliranje, formalne metode za specifikaciju i
verifikaciju, pouzdaniji načini vođenja projekata i procjene troškova, alati koji nastoje
automatizirati proces razvoja softvera. Zahvaljujući takvom razvoju, softversko inženjerstvo
uspjelo se etablirati kao važan dio tehnike i računarstva. Softver se u današnje vrijeme
proizvodi daleko predvidljivije i efikasnije nego prije. Ipak, još uvijek postoji širok prostor za
poboljšanje.
Softverski proces je skup aktivnosti i pripadnih rezultata čiji cilj je razvoj ili evolucija
softvera. Osnovne aktivnosti unutar softverskog procesa su: utvrđivanje zahtjeva, oblikovanje,
implementacija, verifikacija i validacija te održavanje odnosno evolucija.
može zahtijevati sekvencijalno odnosno simultano odvijanje aktivnosti. Najvažniji modeli bit
će opisani u potpoglavlju 1.2.
CASE alati (Computer Aided Software Engineering) su softverski paketi koji daju
automatiziranu podršku za pojedine aktivnosti unutar softverskog procesa. Obično su
napravljeni u skladu s određenom metodom razvoja softvera, implementiraju pravila iz te
metode, sadrže editore za odgovarajuće dijagrame i služe za izradu odgovarajuće
dokumentacije. Dijele se u dvije vrste.
Upper-CASE alati daju podršku za početne aktivnosti unutar softverskog procesa, kao što
su utvrđivanje zahtjeva i oblikovanje.
Lower-CASE alati podržavaju samu realizaciju softvera, dakle programiranje, verifikaciju
i validaciju te eventualno održavanje.
Na vježbama iz ovog kolegija obradit ćemo jednu konkretnu metodu razvoja softvera, koja se
zove UP i koja je potpomognuta grafičkim jezikom UML. Služit ćemo se upper-CASE alatom
Visual Paradigm [11] za modeliranje sustava i crtanje UML dijagrama. Na vježbama iz drugih
kolegija studenti su imali prilike raditi s lower-CASE alatom Microsoft Visual Studio [12]
koji daje podršku za implementaciju i verifikaciju softvera pisanog u jezicima poput C++ ili
C#.
Kad smo govorili o softverskom produktu rekli smo da se on sastoji od računalnih programa i
pripadne dokumentacije. Dakle, razvoj softvera ne svodi se samo na razvoj programa nego
također i na sastavljanje dokumenata koji prate te programe. Dokumentacija je sastavni i
nezaobilazni dio onoga što softverski inženjeri proizvode.
U daljnjim poglavljima opisat ćemo nekoliko primjera dokumenata koji spadaju u sistemsku
dokumentaciju. Na primjer to su sljedeći dokumenti.
Dokument o zahtjevima. Opisuje zahtjeve na sustav, dakle što sustav treba raditi i uz koja
ograničenja.
Dizajn sustava (projektna dokumentacija). Nastaje kao rezultat oblikovanja sustava.
Opisuje kako sustav treba biti građen te kako treba raditi da bi obavio svoje funkcije.
Plan testiranja. Sadrži primjere test podataka i odgovarajućih očekivanih rezultata. Služi
nakon bilo kakve promjene programa za provjeru da li je sačuvana dotadašnja
funkcionalnost programa.
Izvorni tekst programa, pisan u programskom jeziku i nadopunjen odgovarajućim
komentarima. Nastaje kao rezultat implementacije sustava i na najizravniji način
dokumentira sustav.
Kad god koristimo neki generički softverski produkt, na primjer operacijski sustav ili paket za
uredsko poslovanje ili sustav za upravljanje bazom podataka, susrećemo se s raznim
dokumentima koji spadaju u korisničku dokumentaciju. Evo nekoliko primjera takvih
dokumenata.
Funkcionalni opis. Namijenjen je evaluatorima sustava, dakle osobama koje će odlučiti da
li da se koristi taj sustav ili neki drugi. Daje se grubi opis što sustav može a što ne može
raditi. Priloženi su primjeri, tabele i dijagrami. Ne objašnjavaju se operativni detalji.
Vodič za instalaciju. Namijenjen je sistem-administratoru ili korisniku. Opisuje instalaciju
sustava na zadanoj vrsti računala. Sadrži opis distribucijskog medija, definiciju minimalne
hardverske i softverske konfiguracije potrebne za pokretanje sustava, proceduru
instaliranja i podešavanja.
Uvodni priručnik. Namijenjen je novim korisnicima. Daje neformalni uvod u sustav te
opisuje njegovu „normalnu“ uporabu. Pisan je u formi „tečaja“, sadrži mnogo primjera,
te uputa kako izbjeći uobičajene greške.
Referentni priručnik. Namijenjen je iskusnim korisnicima. U potpunosti i na vrlo precizan
način dokumentira sve funkcije sustava, sve oblike njegove uporabe te sve greške koje
mogu nastupiti. Nije u formi tečaja. Stil je formalan, struktura je stroga. Snalaženje u
tekstu osigurano je preko indeksa pojmova.
Priručnik za administriranje. Namijenjen je sistem-administratorima ili operatorima.
Opisuje aktivnosti poput backup-a, upravljanja resursima, praćenja performansi,
podešavanja rada, evidentiranja korisnika, postavljanja zaštite.
Izradu dokumentacije jednim dijelom je moguće automatizirati ili barem olakšati korištenjem
CASE-alata. No za konačno oblikovanje dokumenata potrebni su nam standardni uredski alati
poput tekst procesora ili alata za crtanje dijagrama. Osim u obliku dokumenata (bilo
papirnatih bilo elektroničkih) dokumentacija može postojati i u on-line obliku, dakle ona
može biti izravno dostupna iz samog softvera koji opisuje.
Zajednička osobina svih modela za softverski proces je da se oni u većoj ili manjoj mjeri
zasnivaju na otprilike istim osnovnim aktivnostima. Zaista, to su sljedeće aktivnosti.
Utvrđivanje zahtjeva (specifikacija). Analiziraju se zahtjevi korisnika. Utvrđuje se što
softver treba raditi.
Oblikovanje (design). Oblikuje se građa sustava, način rada njegovih dijelova te sučelje
između dijelova. Dakle projektira se rješenje koje određuje kako će softver raditi.
Implementacija (programiranje). Oblikovano rješenje realizira se uz pomoć raspoloživih
programskih jezika i alata.
Verifikacija i validacija. Provjerava se da li softver radi prema specifikaciji, odnosno da li
radi ono što korisnik želi. Obično se svodi na testiranje, mada postoje i druge tehnike.
Održavanje odnosno evolucija. Nakon uvođenja u uporabu, softver se dalje popravlja,
mijenja i nadograđuje, u skladu s promijenjenim potrebama korisnika.
12 PMF – Matematički odsjek
Softversko inženjerstvo - skripta
Model vodopada (waterfall model) nastao je u ranim 70-im godinama 20. stoljeća, kao
neposredna analogija s procesima iz drugih inženjerskih struka (na primjer mostogradnja).
Softverski proces građen je kao niz vremenski odvojenih aktivnosti, u skladu sa slikom 1.1.
Model je dobio ime zbog oblika dijagrama. Vidimo da se aktivnosti odvijaju kao faze
sekvencijalno jedna iza druge. Svaka faza daje neki rezultat koji „teče“ po vodopadu i
predstavlja polazište za iduću fazu. Makar je na slici naznačena mogućnost povratka u raniju
fazu (u slučaju naknadnog otkrivanja greške), ta mogućnost samo se iznimno koristi. Povratak
je nepoželjan jer remeti normalni tijek procesa te izaziva kašnjenje.
Zbog navedenih prednosti te unatoč navedenim manama, model se često koristi u praksi.
Model je pogodan onda kad treba razviti veliki sustav s relativno jednostavnim i jasnim
zahtjevima uz pomoć velikog broja programera.
Polazna
simultane aktivnosti verzija
Utvrđivanje zahtjeva
(specifikacija) Oblikovanje (design)
Približni Privremene
opis verzije
Implementacija Verifikacija, validacija
Konačna
verzija
Evolucijski razvoj čiji cilj je da se s korisnikom istraže zahtjevi te zaista proizvede konačni
sustav zove se istraživačko programiranje. Ukoliko je jedini cilj istraživanje zahtjeva (nakon
čega slijedi oblikovanje i implementacija modelom vodopada), tada je riječ o prototipiranju -
vidi potpoglavlje 2.2.
Model se uspješno koristi za razvoj web sjedišta te za male sustave s kratkim životnim
vijekom, pogotovo za sustave s nejasnim zahtjevima.
Rasporedi Oblikuj
Definiraj
zahtjeve na arhitekturu
okvirne zahtjeve
inkremente sustava
Specificiraj,
Verificiraj i
oblikuj i imple- Integriraj novi
mentiraj novi
validiraj novi Konačni sustav
inkrement
inkrement
inkrement
sustav je nedovršen
Ipak, ovo je vrlo uporabljiv model koji se intenzivno koristi u praksi. Svi generički softverski
paketi poput Microsoft Office-a i slični zapravo su se razvijali u inkrementima. Svaka njihova
nova verzija donosila je nove mogućnosti.
Formalne
transformacije:
Model formalnog razvoja za sada se relativno malo koristi u praksi te se preporučuje jedino za
sustave gdje se zahtijeva izuzetno velika pouzdanost i sigurnost. Moguće je da će se model
znatno više koristiti u budućnosti ukoliko se razviju bolji specifikacijski jezici te bolji alati za
automatske transformacije.
Model grafičkog razvoja (Model Driven Engineering – MDE) u osnovi je sličan modelu
formalnog razvoja. Umjesto formalne specifikacije razvija se grafički model (skup dijagrama)
koji prikazuje građu i ponašanje sustava. Koristi se grafički jezik za modeliranje poput UML
– vidi potpoglavlje 2.3. Primijetimo da se ovdje riječ „model“ pojavljuje u dva značenja:
model sustava nije isto što i model softverskog procesa. Pretpostavlja se da postoji alat koji
dijagrame automatski pretvara u program. Cijeli proces prikazan je slikom 1.6.
Model grafičkog razvoja ima svoje pobornike i trenutno je predmet intenzivnog istraživanja.
Prednosti su mu slične kao kod formalnog razvoja, s time da bi trebao biti jednostavniji za
korištenje. Glavna mana mu je da za sada nije uporabljiv osim u vrlo jednostavnim
primjerima. Današnji CASE alati u stanju su generirati dio programskog koda iz UML
dijagrama, no daleko su od toga da bi mogli generirati cijeli program.
Kod složenijih sustava UML dijagrami zapravo i ne mogu jednoznačno opisati sve detalje. To
se u UML verziji 2.0 nastoji nadoknaditi uvođenjem posebnog jezika zvanog Object
Constraint Language – OCL; on služi za specificiranje ograničenja koja nisu vidljiva iz
dijagrama. Očekuje se da će OCL i slični jezici pomoći da se ostvari automatsko generiranje
programa iz modela ustava. No uvođenjem takvih jezika grafički pristup postaje još sličniji
formalnom pristupu.
Analiza Oblikovanje
Utvrđivanje raspoloživih Modifikacija sustava uz
zahtjeva dijelova zahtjeva ponovnu upotrebu
dijelova
Implementacija Verifikacija i
i integracija validacija sustava
Očekuje se da će ovaj model ipak postati prevladavajući u 21. stoljeću, budući da je broj
gotovih rješenja sve veći, a korisnici imaju sve manje vremena za čekanje rješenja. Ideja
ponovne upotrebe te razni načini njene realizacije detaljno će biti obrađena u poglavlju 6.
Rekli smo da se rad softverskog tima obično organizira u skladu s nekom metodom razvoja
softvera. Svaka od metoda slijedi jedan od modela za softverski proces ili kombinira više
modela. Osnovne aktivnosti iz modela podijeljene su u manje aktivnosti. Propisuje se način
odvijanja svake aktivnosti te način njenog dokumentiranja. U sljedećim odjeljcima navodimo
osnovna svojstva pojedinih vrsta metoda te detaljnije opisujemo dvije danas aktualne metode:
UP odnosno XP.
Klasične metode pojavile su se još u 70-im godinama 20. stoljeća, a razvijaju se i danas. One
se odlikuju sljedećim svojstvima.
Razvoj softvera promatra se kao pažljivo planirani proces koji ima svoj početak i kraj. U
tom procesu u potpunosti se utvrđuju zahtjevi te se softver realizira u skladu s njima.
Provodi se upravljanje projektom. Određuje se precizni plan aktivnosti, po potrebi i za
dulji vremenski period unaprijed. Određuje se raspored ljudi i resursa po aktivnostima.
Inzistira se na urednom dokumentiranju svih aktivnosti i svih proizvedenih dijelova
softvera.
Kao protuteža klasičnim metodama, početkom 21. stoljeća pojavile su se agilne metode.
Njihova glavna namjera bila je ubrzati razvoj softvera i izbjeći nepotrebnu administraciju.
Agilne metode imaju sljedeća svojstva.
Razvoj softvera promatra se kao kontinuirani niz iteracija čiji broj nije moguće
predvidjeti. Svaka iteracija usklađuje sustav s trenutnim zahtjevima. Zahtjevi se stalno
mijenjaju, ne postoji cjelovita ili konačna specifikacija.
Ne postoji upravljanje projektom u pravom smislu riječi. Aktivnosti se dogovaraju s
korisnicima te se odvijaju uz njihovo aktivno sudjelovanje. Planiranje je kratkoročno –
jedan ili dva tjedna unaprijed.
Izbjegavaju se svi oblici dokumentacije osim onih koji se mogu automatski generirati iz
programa. Smatra se da sam program u izvornom obliku predstavlja svoju najpouzdaniju
dokumentaciju.
Kao primjer klasične metode razvoja softvera opisat ćemo Unified Process – UP. Riječ je o
„public domain“ verziji komercijalne metode Rational Unified Process – RUP. I UP i RUP
koriste se za razvoj objektno-orijentiranih sustava.
UP je nastala na samom kraju 20. Stoljeća u tvrtci Rational Corporation koja je danas dio
IBM-a. Stvorio ju je Ivar Jacobson u suradnji s Grady Boochom i Jamesom Rumbaughom.
Ime je odabrano zato što je UP objedinio nekoliko prijašnjih metoda istih autora. UP je u
bliskoj vezi s grafičkim jezikom UML – vidi potpoglavlje 2.3 – obje tvorevine razvijene su u
okviru istog projekta s namjerom da budu komplementi jedna drugoj. Zaista, UP određuje
kako će se odvijati proces razvoja softvera, a UML omogućuje da se rezultati tog razvoja
dokumentiraju.
Zbog postojanja vremenski odvojenih faza mogli bismo reći da UP uspostavlja softverski
proces nalik na model vodopada. S druge strane, iteracija temeljnih aktivnosti liči na model
evolucijskog razvoja. Dakle UP ustvari kombinira ta dva modela nastojeći iskoristiti prednosti
jednog i drugog.
Slika 1.8 također pokazuje da u svakoj fazi postoji jedna ili dvije osnovne aktivnosti na koje
je stavljen poseban naglasak i koje se obavljaju s povećanim intenzitetom. Kod manjih
projekata faze možemo poistovjetiti s odgovarajućim dominantnim aktivnostima, pa
dobivamo proces sličan vodopadu.
Makar je nastala relativno nedavno, UP je po svojim osobinama ipak klasična metoda. Naime,
ona razvoj softvera promatra kao kompleksan projekt koji ima svoj početak i kraj i kojim
treba upravljati. Također, ona predviđa da će se svi rezultati dokumentirati, na primjer
pomoću odgovarajućih UML dijagrama. Više detalja o UP-u može se naći u knjizi [9].
Kao primjer agilne metode razvoja softvera opisat ćemo Extreme Programming – XP. Metoda
je nastala oko 2000-te godine i pripisuje se autoru Kentu Becku. Detaljnije je opisana u knjizi
[10]. Naziv je odabran zato što XP ideju iterativnog razvoja softvera s naglaskom na
programiranje tjera do ekstremnih razmjera.
Razvojni proces u skladu s XP prikazan je na slici 1.9. Proces se sastoji od kontinuiranog niza
vrlo brzih iteracija. Svaka iteracija stvara novo izdanje sustava koje se isporučuje korisniku.
Vremenski razmak između dvije isporuke nije veći od dva tjedna.
Izaberi Razbij
Planiraj novo
korisničke priče korisničke priče
izdanje
za novo izdanje u zadatke
Razvij,
Isporuči novo
Evaluiraj sustav integriraj i
izdanje
testiraj softver
Novo izdanje sustava može sadržavati novu funkcionalnost – tada XP podsjeća na model
inkrementalnog razvoja za softverski proces. No moguće je da novo izdanje samo popravlja
ili mijenja već postojeću funkcionalnost – tada XP liči na model evolucijskog razvoja. Dakle,
XP kombinira inkrementalni i evolucijski model. No naglasak je na izuzetno kratkim i brzim
iteracijama.
Zahtjevi u XP prikazuju se kao skup kratkih kartica teksta, takozvanih korisničkih priča (user
stories). Na početku iteracije biraju se one priče koje će se implementirati u dotičnom izdanju
– uzima se onoliko priča koliko se može implementirati u dva tjedna i to one s najvišim
prioritetom. Ostale priče se ostavljaju za buduća izdanja. Odabrane priče razgrađuju se u
manje zadatke koji se raspoređuju programerima u skladu s procijenjenom složenošću.
Opisani neformalni postupak planiranja novog izdanja naziva se planning game.
U XP-u ne može doći do kašnjenja isporuke – ono što se do predviđenog roka isporuke
uspjelo implementirati to se isporučuje, ostalo se ostavlja za buduća izdanja. Naručitelj
programerima plaća utrošeno radno vrijeme. Nema ugovora koji bi vezao plaćanje uz traženu
funkcionalnost.
U metodi XP iznimno važnu ulogu igraju korisnici. Postoji predstavnik korisnika koji je član
razvojnog tima i stalno je dostupan ostalim članovima. On donosi korisničke priče, određuje
prioritete, dogovara se o sadržaju idućeg izdanja, sudjeluje u testiranju sustava. Također,
predstavnik korisnika odlučuje što će se napraviti s nerealiziranim pričama te treba li neku od
već implementiranih priča promijeniti i ponovo implementirati.
Testovi dobiveni primjenom test-first development-a trajno se pohranjuju. Kad god se stvori
nova verzija softvera, nad njom se osim najnovijih testova također moraju izvršiti i svi
prijašnji testovi. Time se osigurava da najnovije promjene nisu narušile staru funkcionalnost.
Još jedna osobina XP-a je da se softver oblikuje tako da podrži trenutne zahtjeve i ništa više
od toga. Takvo oblikovanje je u suprotnosti s principima tradicionalnog softverskog
inženjerstva gdje se softver nastoji izgraditi dovoljno općenito da bi se u budućnosti lako
mogao mijenjati. Pobornici XP smatraju da se promjene ionako ne mogu predvidjeti, pa se ne
isplati o njima brinuti unaprijed.
Opasnost kod bilo koje vrste iterativnog razvoja softvera je da se struktura softvera postepeno
degradira uslijed stalnih promjena. XP se bori protiv te opasnosti povremenim
reorganiziranjem programskog koda, takozvanim refactoring-om. Dakle, kad programer
primijeti da se struktura programa previše narušila, on je popravlja tako da pojednostavi ili
premjesti neke dijelove koda, eliminira ponavljanje sličnih dijelova, i tako dalje.
Iz svega izloženog vidimo da XP ima sve osobine agilne metode za razvoj softvera. Brojni
softverski timovi u cijelosti su prihvatili XP i pokazali da agilni način rada može biti efikasan
barem kod manjih projekata s vrlo promjenjivim zahtjevima. No još je veći broj onih timova
koji su izabrali samo neke od XP-ovih značajki, na primjer test-first development ili
programiranje u paru te ih uklopili u neku klasičnu metodu.
Vidjeli smo da klasične metode razvoja softvera predviđaju da će se softverski proces odvijati
kao projekt. To znači da softversko inženjerstvo, osim računarskog i tehničkog aspekta, ima i
Upravljanje softverskim projektom bit će tema posebnog kolegija. Zato ovo potpoglavlje daje
samo uvodni prikaz te složene problematike. U idućim odjeljcima najprije se nabrajaju razni
poslovi koje obavlja softverski menadžer. Zatim se nešto podrobnije opisuju dva takva posla:
planiranje i praćenje projekta te upravljanje rizicima.
Slični ciljevi žele se postići u bilo kojem inženjerskom projektu. Ipak, softversko inženjerstvo
razlikuje se od drugih inženjerskih struka, a te razlike čine upravljanje softverskim projektom
i postizavanje ovakvih ciljeva posebnim izazovom za menadžere. Evo nekih osobina po
kojima se razvoj softvera razlikuje od na primjer gradnje mosta ili broda.
Produkt je „neopipljiv“. Teško je vidjeti rezultat. Teško je procijeniti koliki dio posla je
obavljen i da li je kvalitetno obavljen. Menadžer se mora pouzdati u apstraktne dokumente
ili na mišljenja suradnika.
Nema standardnog razvojnog procesa. Postoje razne metode i alati, oni dosta ovise o
organizaciji koja ih primjenjuje. Ne zna se koji je najbolji način razvoja zadane vrste
softvera u zadanim okolnostima.
Projekt je obično „neponovljiv“. Novi softver donosi nešto novo i još neviđeno. Iskustva
na starim projektima nisu sasvim primjenjiva. Ulaskom u nova područja susrećemo se s
nepredviđenim problemima. Tehnologija se brzo mijenja pa je način rada svaki put
drukčiji.
Zbog navedenih osobina nije nikakvo čudo da mnogi softverski projekti kasne, premašuju
troškove ili daju rezultate ispod očekivanja. Očito je da upravljanje softverskim projektom
zahtijeva izuzetno dobrog i snalažljivog menadžera.
Bilo bi vrlo teško sastaviti sveobuhvatni opis radnog mjesta softverskog menadžera. Taj opis
varira ovisno o organizaciji koja razvija softver te o vrsti softverskog produkta. Ipak, većina
menadžera u većoj ili manjoj mjeri obavlja sljedeće poslove.
Pisanje prijedloga projekta, traženje podrške za njegovu realizaciju.
Procjenjivanje troškova projekta.
Planiranje i praćenje projekta.
Upravljanje rizicima.
Podnošenje izvještaja nadređenom menadžmentu ili naručiteljima.
Izbor suradnika, poticanje njihovog individualnog i timskog rada.
Postupak počinje tako da informacije sa slike 1.10 prikažemo kao mrežu (aciklički usmjereni
graf). U toj mreži čvorovi odgovaraju aktivnostima, a lukovi međuovisnostima (luk kaže da
aktivnost iz njegovog polaznog čvora mora prethoditi aktivnosti iz dolaznog čvora). Svakom
luku kao duljinu pridružimo trajanje aktivnosti iz njegovog polaznog čvora. Duljine putova u
mreži tada odgovaraju minimalnim trajanjima niza aktivnosti koje se zbog međuovisnosti
moraju odvijati sekvencijalno jedna nakon druge.
Za naš projekt mreža izgleda kao na slici 1.11. Osim „pravih“ aktivnosti T1, T2, ..., T12,
dodane su fiktivne aktivnosti Start i Finish koje odgovaraju početku i kraju projekta.
Također, dodani su takozvani međaši (milestones) M1, M2, ..., M8. Međaš je značajno mjesto
u projektu gdje su upravo završene neke aktivnosti i stvara se određeni izlaz. Taj izlaz može
biti na primjer izvještaj o obavljenom poslu ili dokument koji je dio sistemske dokumentacije
ili dio softvera. Međaši olakšavaju praćenje projekta – da bi ustanovio da li je neki međaš
dostignut menadžer provjerava postojanje traženog izlaza.
Mreža poput one na slici 1.11 omogućuje da se provede takozvana analiza kritičnih putova.
Kritični put je najdulji put od Start do Finish – taj pojam je dobro definiran jer je mreža
aciklička. Duljina kritičnog puta zapravo predstavlja minimalno vrijeme u kojem je moguće
izvršiti cijeli projekt. Aktivnosti na kritičnom putu zovu se kritične aktivnosti – na našoj slici
to su T1, M1, T3, M4, T9, M6, T11, M8, T12. Menadžer mora posvetiti posebnu pažnju
kritičnim aktivnostima jer kašnjenje bilo koje od njih izazvat će kašnjenje cijelog projekta. S
druge strane, za aktivnosti koje nisu na kritičnom izračunavaju se maksimalna kašnjenja koja
se mogu tolerirati jer još ne ugrožavaju vrijeme završetka cijelog projekta.
Informacije s mreže na slici 1.11 zajedno s rezultatima analize kritičnih putova mogu se
kompaktnije prikazati pomoću Ganttovog dijagrama – vidi sliku 1.12. Na Ganttovom
dijagramu vodoravna os odgovara vremenu a na uspravnoj osi su poredane aktivnosti.
Kalendar odvijanja svake aktivnosti prikazan je odgovarajućim pravokutnikom (vrpcom).
Zatamnjeni dio pravokutnika predstavlja tolerirano kašnjenje – primijetimo da za kritične
aktivnosti taj zatamnjeni dio ne postoji.
Daljnji korak u planiranju projekta je raspoređivanje ljudi na aktivnosti. slika 1.13 sadrži
Ganttov dijagram gdje se vidi koji čovjek obavlja koju aktivnost u koje vrijeme. Raspored je
konzistentan s kalendarom aktivnosti sa slike 1.12, a također poštuje pravila da jednu
aktivnost obavlja samo jedan čovjek te da jedan čovjek istovremeno obavlja samo jednu
aktivnost. Osim ljudi, na sličan način mogu se rasporediti i drugi resursi poput računala,
prostorija i slično.
Dijagrami na slikama 1.11, 1.12 i 1.13 predstavljaju plan izvršavanja projekta. Nakon što se
projekt počne izvršavati, menadžer treba pratiti da li sve teče po planu. Kod većine projekata
prije ili kasnije dolazi do odstupanja od plana, na primjer desi se da neka od aktivnosti zakasni
više nego što se to može tolerirati. Tada je potrebno uvažiti nove podatke i ponovo generirati
sve dijagrame – dobit ćemo revidirani plan s odgođenim datumima završetka nekih aktivnosti.
Revizija plana obavlja se relativno lako i brzo ako se služimo alatom za upravljanje projektom
poput Microsoft Project.
Postupak upravljanja rizicima prikazan je slikom 1.15. Kao što vidimo, postupak se sastoji od
četiri faze od kojih svaka daje odgovarajuće rezultate. Zadnje tri od njih se iteriraju. U
nastavku detaljnije opisujemo svaku fazu.
U prvoj fazi potrebno je identificirati rizike koji bi mogli predstavljati prijetnju procesu
razvoja softvera, softveru koji se razvija ili organizaciji koja je uključena u razvoj.
Identifikacija se najčešće svodi na „brainstorming“ u kojem sudjeluju svi članovi tima.
Također, softverski menadžer može upotrijebiti svoja iskustva iz prošlih projekata te se sjetiti
teškoća s kojima se ranije susretao. Postoje i check-liste uobičajenih rizika. Identifikacija
obično daje dosta dugačku listu potencijalnih rizika. No nastavak postupka izdvojit će samo
najvažnije članove te liste.
Nakon što su napravljene sve procjene, oblikuje se rang lista rizika po kriteriju njihove
značajnosti. Gleda se kombinacija vjerojatnosti pojavljivanja i učinka. Dakle najznačajniji su
rizici s velikom vjerojatnošću koji imaju katastrofalan ili ozbiljan učinak. Daljnje faze
postupka provode se samo za 10-ak rizika s vrha rang liste.
Faza nadziranja rizika sastoji se od provjere jesu li sve pretpostavke o projektu, produktu i
poslovnom okruženju i dalje iste ili su se promijenile. Povremeno treba ispitati za svaki od
rizika da li je on postao više ili manje vjerojatan te da li se promijenila ozbiljnost njegovog
učinka. Ako je došlo do promjena, pokreće se nova iteracija.
2. Utvrđivanje zahtjeva
U ovom poglavlju govorimo o prvoj osnovnoj aktivnosti u softverskom procesu, a to je
utvrđivanje zahtjeva (specifikacija). Najprije ćemo reći nešto općenito o toj aktivnosti te o
zahtjevima i načinima kako da se oni dokumentiraju. Zatim ćemo detaljnije govoriti o
metodama otkrivanja zahtjeva. Na kraju ćemo obraditi modeliranje uz pomoć grafičkog jezika
UML – ono predstavlja sastavni dio analize zahtjeva makar se također koristi i u daljnjim
fazama razvoja softvera.
U stvarnosti, razlika između ovih dviju vrsta nije sasvim precizno određena. Na primjer,
sigurnosni zahtjev da je pristup sustavu dozvoljen samo ovlaštenim korisnicima u prvi čas
djeluje kao nefunkcionalni. No njegovom razradom dolazimo do zahtjeva koji su sasvim
funkcionalni, na primjer uključivanje procedure za provjeru identiteta korisnika. Ovo ujedno
pokazuje da zahtjevi nisu nezavisni, to jest jedan od njih često stvara ili ograničava druge.
Slika 2.1 sadrži nekoliko primjera funkcionalnih zahtjeva vezanih uz zamišljeni središnji
bolnički informacijski sustav. Vidimo da zahtjevi mogu biti oblikovani na različitim razinama
detaljnosti. Često su i neprecizni, što u kasnijim fazama razvoja softvera može stvoriti
nesporazume između korisnika i softverskih inženjera. Na primjer, za prvi zahtjev nije jasno
mora li se implementirati traženje zadanog pacijenta u svim listama, ili je dovoljno prikazati
listu za zadanu bolnicu.
Zahtjev na produkt. Sustav treba biti dostupan svim bolnicama tijekom radnog
vremena ponedjeljak-petak 8.30-17.30 h. Zastoji u radu sustava unutar
radnog vremena ne smiju prijeći 5 sekundi dnevno.
Slika 2.2 prikazuje tri primjera nefunkcionalnih zahtjeva. Oni su opet vezani uz središnji
bolnički informacijski sustav. Primjeri usput pokazuju da se nefunkcionalni zahtjevi općenito
dijele na tri velike skupine.
Zahtjevi na produkt. Određuju ili ograničavaju ponašanje softvera. Tu spadaju zahtjevi na
brzinu rada, utrošak memorije, pouzdanost, sigurnost, uporabljivost.
Organizacijski zahtjevi. Slijede iz poslovnih pravila u organizacijama koje sudjeluju u
razvoju softvera. Na primjer, tu spada zahtjev da se mora koristiti određeni programski
jezik ili određena baza podataka.
Vanjski zahtjevi. Posljedica su faktora koji se nalaze izvan samog produkta i njegovog
razvojnog procesa. Na primjer, kod bankarskog softvera to je zakonska regulativa koja
određuje način poslovanja banke u nekoj zemlji. Ili to može biti zakon o zaštiti osobnih
podataka odnosno autorskih prava.
Za razliku od funkcionalnih zahtjeva, koji se u slučaju precizne formulacije lako mogu
testirati, nefunkcionalni zahtjevi često znaju biti takvi da ih je teško provjeriti. Slika 2.3
prikazuje najprije tipičan način kako korisnik bolničkog sustava opisuje uporabljivost tog
sustava. Zatim se vidi preformulacija istog zahtjeva u svrhu njegove provjerljivosti.
Otkrivanje
Studija i analiza Dokumentiranje Validacija
izvodljivosti zahtjeva zahtjeva zahtjeva
Validacija zahtjeva važna je zato da se na vrijeme otkriju eventualne greške u njima. Naime,
greške u zahtjevima najskuplje su greške budući da se one prenose u sve daljnje faze razvoja
softvera. Validacija se svodi na sljedeće provjere.
Opravdanost. Je li zahtjev kojeg je jedan korisnik postavio zaista potreban? Što drugi
korisnici misle o tome?
Konzistencija. Jesu li zahtjevi usklađeni jedan s drugim ili su u međusobnom konfliktu?
Potpunost. Jesu li uključene sve potrebne funkcije i ograničenja?
Realizam. Mogu li se zahtjevi ostvariti raspoloživom tehnologijom i budžetom?
Provjerljivost. Je li zahtjev tako formuliran da se njegovo ispunjavanje kasnije može
testirati?
Postupak utvrđivanja zahtjeva nažalost ne ide uvijek glatko. Treba biti spreman na to da bi se
mogli pojaviti sljedeći problemi.
Ukoliko novi sustav treba promijeniti sadašnji način rada, tada je teško otkriti zahtjeve na
njega budući da s njim još nema iskustava.
Razni korisnici imaju različite zahtjeve koji mogu biti u konfliktu. Konačni zahtjevi su
nužno kompromis s kojim nitko nije zadovoljan.
Financijeri sustava i njegovi korisnici obično nisu isti ljudi. Kupac postavlja zahtjeve
motivirane organizacijskim ili budžetskim ograničenjima koji su u konfliktu s korisničkim
zahtjevima.
Poslovno i tehničko okruženje se mijenja. Time se mijenjaju i zahtjevi. Prije nego što ih
implementiramo, zahtjevi će možda već biti promijenjeni.
Teškoće kod otkrivanja zahtjeva nastoje se riješiti raznim nestandardnim postupcima
otkrivanja zahtjeva kao što je na primjer upotreba prototipova. Konflikti u zahtjevima najlakše
se rješavaju pomoću modela sustava i u diskusiji s korisnicima. Velika promjenjivost zahtjeva
nalaže nam da koristimo fleksibilne metode dokumentiranja i donekle agilni pristup u razvoju
softvera.
Da bi zahtjeve mogli pretočiti u dokumente, najprije ih moramo na neki način zapisati. Postoji
nekoliko vrsta „jezika“ za zapisivanje zahtjeva.
Prirodni jezik. Zahtjevi su popisani kao numerirani niz rečenica u prirodnom jeziku
(hrvatskom, engleskom). Svaka rečenica izražava jedan zahtjev.
Strukturirani prirodni jezik. Zahtjevi su pisani u prirodnom jeziku, ali tako da se ispuni
zadani obrazac. Svako polje u obrascu daje informaciju o jednom aspektu zahtjeva.
Formalni jezik. Zahtjevi su specificirani uz pomoć posebnog jezika koji liči na programski
jezik ili na matematičku notaciju (funkcije, skupovi, algebarske operacije, …).
Grafička notacija. Da bi se definirali funkcionalni zahtjevi, koriste se grafički modeli
nadopunjeni tekstualnim bilješkama. Obično je riječ o UML dijagramima.
Rezultati utvrđivanja zahtjeva uključuju se u dokumente koji sadrže zapisane zahtjeve. Tih
dokumenata ima više vrsta, svaki od njih koristi neki od spomenutih jezika, a međusobno se
razlikuju po svom sadržaju i detaljnosti. Uvodimo sljedeće nazive za pojedine vrste
dokumenata.
32 PMF – Matematički odsjek
Softversko inženjerstvo - skripta
Korisnički zahtjev.
1. Sustav treba generirati mjesečni izvještaj koji prikazuje cijenu lijekova
potrošenih u svakoj od bolnica tijekom tog mjeseca.
Zahtjevi na sustav.
1.1 Zadnjeg radnog dana u mjesecu treba biti generiran izvještaj iz kojeg
se vide potrošeni lijekovi, njihova cijena i bolnica koja ih je potrošila.
1.2 Sustav treba automatski generirati taj izvještaj u 17.30h zadnjeg
radnog dana u mjesecu.
1.3 Izvještaj treba biti generiran posebno za svaku bolnicu, a treba
navesti pojedinačna imena lijekova, ukupan broj recepata i propisanih
doza za pojedini lijek te ukupnu cijenu propisanih lijekova.
1.4 Ako je isti lijek dostupan u raznim dozama (na primjer 10 mg, 20 mg),
tada treba postojati posebni ispis za svaku dozu.
1.5 Pristup izvještajima sa cijenama mora biti omogućen samo
ovlaštenim korisnicima koji su navedeni na odgovarajućoj listi.
Različite vrste dokumenata potrebne su u prvom redu zato što su one namijenjene različitim
vrstama čitatelja, od korisnika, preko korisnikovih menadžera, do softverskih inženjera. Slika
2.5 ilustrira razliku između korisničkih zahtjeva i zahtjeva na sustav – opet je riječ o
središnjem bolničkom informacijskom sustavu, jedan korisnički zahtjev razrađen je u
odgovarajućih pet zahtjeva na sustav. Slika 2.6 daje jedan mogući prijedlog strukture
sumarnog dokumenta o zahtjevima – prijedlog je zasnovan na preporukama udruge IEEE.
Poglavlje Opis
Idealno bi bilo kad bi svi nabrojani dokumenti opisivali „vanjske“ osobine predloženog
sustava, dakle njegove funkcije i ograničenja, bez prejudiciranja njegove unutrašnje građe. No
taj ideal obično nije moguće postići. Da bi same zahtjeve bolje strukturirali i točnije opisali,
kod iole većih sustava moramo ipak već u specifikaciji predložiti pogodnu arhitekturu
sustava, dakle podjelu na podsustave ili komponente. Ova primjedba pogotovo vrijedi za
zadnju vrstu dokumenata, dakle za specifikaciju softverskog dizajna.
Kod planiranja intervjua treba paziti da se razgovara s predstavnicima svih grupa korisnika.
Naime, svaka grupa ima svoje viđenje o tome što bi sustav trebao raditi. Na primjer, u slučaju
središnjeg bolničkog sustava, neke od grupa korisnika navedene su na slici 2.7.
Intervjui predstavljaju dobar način da se stekne općenit dojam o tome što korisnici rade i kako
bi im novi sustav u tome trebao pomagati. Ipak, kroz intervjue je dosta teško otkriti specifična
stručna znanja i zahtjeve vezane uz dotičnu aplikacijsku domenu (struku). Razlozi za te
teškoće su sljedeći.
Specijalisti iz aplikacijske domene koriste svoju specifičnu terminologiju koju softverski
inženjeri možda neće dobro razumjeti.
Neka znanja iz domene toliko su poznata korisnicima da se oni ne sjete da ih trebaju
spomenuti.
Intervjui također nisu dobra metoda otkrivanja znanja o organizaciji u kojoj bi novi sustav
trebao raditi. Naime:
Često postoje suptilni odnosi snaga između različitih ljudi unutar organizacije.
Proklamirana organizacijska struktura rijetko se poklapa sa stvarnim putovima donošenja
odluka.
Zaposlenici strancu često ne žele otkriti stvarnu istinu o svojoj organizaciji nego iznose
službenu istinu.
Zbog svih ovih teškoća, informacije dobivene kroz intervjue moraju se nadopuniti
informacijama iz drugih izvora. Tradicionalno, ti drugi izvori su:
literatura koja opisuje aplikacijsku domenu i poslovne procese u njoj,
dokumentacija postojećih softverskih sustava koje novi sustav treba zamijeniti ili s kojima
se mora povezati,
papirnati obrasci koji trenutno kolaju u poslovnim procesima,
postojeće baze podataka koje bi se trebale koristiti u novom sustavu,
zakoni i drugi propisi koje se odnose na aplikacijsku domenu.
Scenarij je neformalni opis zamišljene interakcije korisnika i sustava. Jedan takav opis
pokriva samo mali dio mogućih interakcija. Da bi dobili cjelovitiju sliku o zahtjevima na
sustav, potreban je veći broj scenarija.
Postoje razne vrste scenarija, koje se razlikuju po vrsti informacije i stupnju detaljnosti.
Korisničke priče (user stories) iz metode XP koju smo spominjali u potpoglavlju 1.3 zapravo
predstavljaju jednu relativno jednostavnu vrstu scenarija. Nešto opširniji i bolje strukturirani
primjer vezan uz bolnički informacijski sustav prikazan je na slici 2.8. Iz tog primjera vidimo
da dobro napisani scenarij treba sadržavati sljedeće informacije.
Polazne pretpostavke koje vrijede na početku interakcije.
Opis normalnog ili uobičajenog tijeka interakcije.
Opis mogućih iznimnih situacija koje remete normalni tijek te kako se s njima izlazi na
kraj.
Popis drugih aktivnosti koje se mogu odvijati u isto vrijeme kad i naša interakcija i mogu
donekle utjecati na nju.
Stanje sustava nakon što interakcija završi.
36 PMF – Matematički odsjek
Softversko inženjerstvo - skripta
Polazne pretpostavke
Pacijent se prethodno javio medicinskom recepcionaru. Recepcionar je već stvorio
zapis i unio u njega osobne podatke pacijenta (prezime i ime, datum rođenja, adresu, i
tako dalje). Medicinska sestra je prijavljena u sustav i sad će u isti zapis upisati povijest
bolesti pacijenta.
Druge aktivnosti
Za vrijeme unosa podataka, isti zapis mogu gledati i drugi zaposlenici bolnice, no oni
ne mogu mijenjati sadržaj zapisa.
Slučajevi uporabe (use cases) pojavljuju se u grafičkom jeziku za modeliranje UML. U svom
najjednostavnijem obliku, jedan slučaj uporabe bilježi jednu interakciju između sustava i
njegove okoline – dakle on određuje aktere (ljude, druge sustave) koji su uključeni u tu
interakciju te joj daje ime.
Skup od više slučajeva uporabe dokumentira se jednim use case dijagramom, gdje su akteri
nacrtani kao čovječuljci a interakcije kao ovali. I čovječuljci i ovali imaju upisana imena.
Svaki slučaj uporabe s use case dijagrama dalje se zasebno opisuje strukturiranim tekstom
nalik na onaj sa slike 2.8 ili takozvanim sequence dijagramom.
Slika 2.9 sadrži primjer use case dijagrama vezan uz bolnički informacijski sustav. Vidimo da
postoje akteri s imenima Medicinski recepcionar, Medicinska sestra, Menadžer i
Liječnik. Oni sudjeluju u slučajevima uporabe s imenima Registracija pacijenta, Unos
osobnih podataka, ... i drugima. Daljnji primjeri use case dijagrama te drugih UML
dijagrama mogu se naći u potpoglavlju 2.3.
Registracija pacijenta
Pregled zapisa
Generiranje izvještaja
Medicinska sestra
Uređivanje zapisa
Liječnik
Ne postoji neka jasna razlika između scenarija i slučajeva uporabe. Zapravo je riječ o sličnim
tvorevinama koje su neovisno uveli razni autori. Po mišljenju nekih autora, svaki slučaj
uporabe s use case dijagrama zapravo je jedan scenarij. Drugi pak misle da jedan slučaj
uporabe obuhvaća više scenarija budući da može uključivati više mogućih tokova kontrole.
Scenariji i slučajevi uporabe predstavljaju efikasnu tehniku otkrivanja zahtjeva koji se tiču
neposredne interakcije korisnika sa sustavom. No tom tehnikom ne mogu se otkriti specifični
zahtjevi vezani uz aplikacijsku domenu, niti se mogu obuhvatiti nefunkcionalni zahtjevi.
Korisnici budućeg sustava često ne uspijevaju jasno izraziti svoje zahtjeve, budući da ne
mogu predvidjeti kako će taj sustav utjecati na njihove radne navike, u kakvoj će interakciji
biti s drugim sustavima te u kojoj mjeri on može automatizirati radne procese. Tada se
pribjegava izradi prototipa. Riječ je o jednostavnom i brzo razvijenom programu, koji
oponaša budući sustav, lako se mijenja i nadograđuje te omogućuje isprobavanje raznih ideja,
koncepcija i opcija.
Prototip ustvari podržava čak dvije podaktivnosti unutar aktivnosti utvrđivanja zahtjeva:
Otkrivanje zahtjeva. Korisnici eksperimentiraju, pa tako otkrivaju svoje potrebe i dobivaju
nove ideje o tome što bi sustav trebao raditi.
Validacija zahtjeva. Uočavaju se greške i propusti u polaznim zahtjevima, na primjer
nepotpuni ili nekonzistentni zahtjevi.
Osim toga, prototip može donijeti sljedeće dodatne koristi.
Otkrivaju se nesporazumi između razvijača softvera i korisnika.
Lakše se identificiraju komplicirane funkcije koje zahtijevaju pozornost.
Menadžmentu se demonstrira izvedivost i korisnost sustava.
U slučaju „pravog“ prototipiranja, cjelokupni softverski proces izgleda kao na slici 2.10.
Pritom treba biti oprezan u izboru dijelova iz prototipa, budući da su oni često loše
strukturirani, loše dokumentirani, imaju slabe performanse, slabu pouzdanost te ne
zadovoljavaju zahtjeve sigurnosti.
Skiciraj Specificiraj
polazne Razvij prototip Evaluiraj
prototip sustav
zahtjeve
Upotrebljivi
dijelovi
Konačni
Razvij softver Validiraj sustav softverski
sustav
Da bi prototipiranje imalo smisla, sam prototip se mora stvoriti na brz, jeftin i fleksibilan
način. Za to su nam potrebne odgovarajuće razvojne tehnike, koje možemo ovako klasificirati.
Razvoj u dinamičnim jezicima visoke razine. Riječ je o programskim jezicima koji su
velikim dijelom interpretirani te zahtijevaju glomaznu run-time okolinu. Programi se pišu
brzo i jednostavno te se lako mijenjaju, makar su njihove performanse obično slabe zbog
interpretiranja i run-time podrške. Primjeri takvih jezika su Smalltalk, Prolog i donekle
Java.
Programiranje za baze podataka. Svi komercijalni sustavi za upravljanje bazama
podataka opskrbljeni su vlastitim alatima za izradu aplikacija koje obavljaju uobičajene
radnje s podacima: ažuriranje, pretraživanje, izrada izvještaja. Takvi alati nazivaju se
jezici 4. generacije (4GL). Primjeri za 4GL mogu se naći unutar baza Oracle ili DB2.
Izrada aplikacija (ustvari prototipova) pomoću 4GL je brza i jednostavna te ne zahtijeva
puno programiranja. No dobivena aplikacija je prilično spora i rastrošna. Daljnja mana
4GL je da su oni nestandardni i neprenošljivi s jedne baze na drugu.
Povezivanje gotovih dijelova ili aplikacija. Prototip se slaže od već gotovih dijelova. U tu
svrhu moramo imati na raspolaganju dovoljan broj upotrebljivih gotovih dijelova te okvir
ili mehanizam za povezivanje tih dijelova. Primjeri za ovakvu tehniku su Microsoft Visual
Basic, gdje se prototip se razvija „vizualnim“ programiranjem, a okvir za povezivanje je
prozor u kojeg se interaktivno ubacuju gotove komponente grafičkog sučelja poput
tekstualnih polja, izbornika ili gumba. Daljnji primjeri su skriptni jezici poput Shell, Perl
ili TCL/TK. Okvir za povezivanje je sama skripta: njene naredbe mogu biti komande
kojima se pozivaju gotove aplikacije ili uključuju komponente grafičkog sučelja.
Fokusirana
etnografija
Početna Utvrđivanje Evaluacija
etnografska nejasnoća u prototipa
analiza zahtjevima
Prototipiranje
sustava
Zbog svih ovih razloga, etnografija najbolje funkcionira u kombinaciji s drugim pristupima,
dakle kao njihov komplement. Na primjer, etnografija se dobro može povezati s
prototipiranjem, kao što je ilustrirano na slici 2.11. Naime, u skladu sa slikom:
početna etnografska analiza omogućuje da odmah stvorimo dobar prototip i preskočimo
nekoliko iteracija njegovog profinjavanja;
taj prototip daje se korisnicima, čime se mijenja njihova radna okolina;
nova radna okolina postaje predmetom nove etnografske analize.
Cijeli ciklus ponavlja se nekoliko puta.
Modeliranje je proces razvoja apstraktnih modela sustava. Obično se svodi na primjenu neke
vrste grafičke notacije, dakle na crtanje dijagrama. U prošlosti su se koristile razne notacije,
no danas je kao standard prihvaćen Unified Modeling Language – UML [8,9].
Modeli se koriste u raznim fazama razvoja softvera. Najprije se pojavljuju unutar utvrđivanja
zahtjeva kao sastavni dio analize zahtjeva. Isti modeli dalje se profinjavaju tijekom
oblikovanja i time se pretvaraju u opis sustava kojeg treba implementirati. Nakon
implementacije, modeli dalje služe kao dokumentacija građe i načina rada sustava.
U idućim odjeljcima najprije ćemo nabrojati razne vrste modela te načine njihove upotrebe.
Zatim ćemo detaljnije govoriti o vrstama modela koji promatraju sustav iz perspektive
konteksta, interakcije, strukture, odnosno ponašanja. Svi primjeri dijagrama bit će nacrtani u
skladu s pravilima UML.
Kao prvo, razlikujemo dvije vrste modela ovisno o tome da li oni modeliraju postojeći sustav
ili sustav koji tek treba razviti.
1. Modeli postojećeg sustava koriste se tijekom utvrđivanja zahtjeva. Oni objašnjavaju što
postojeći sustav radi te omogućuju diskusiju o njegovim prednostima i manama. Kroz tu
diskusiju dolazimo do zahtjeva na novi sustav.
2. Modeli novog sustava koriste se tijekom utvrđivanja zahtjeva da bi se korisnicima lakše
objasnilo što će novi sustav raditi i po čemu će se on razlikovati od postojećeg sustava.
Iste modele softverski inženjeri kasnije koriste da bi diskutirali o različitim varijantama
dizajna te da bi dokumentirali varijantu koja će se implementirati.
Glavno svojstvo modela je da on ističe važne osobine sustava a ispušta detalje. Također, od
važnih osobina on izabire samo neke, a zanemaruje ostale. Da bismo dobili cjelovitu
informaciju, za isti sustav moramo razviti više modela od kojih svaki promatra sustav iz
drukčije perspektive. Najvažnije perspektive su sljedeće.
Kontekst. Modelira se okolina sustava, dakle utvrđuje se granica koja određuje što je dio
sustava a što se nalazi izvan njega.
Interakcija. Modelira se interakcija između sustava i njegove okoline, ili interakcija
između komponenti sustava.
Struktura. Modelira se građa sustava ili građa podataka koje sustav obrađuje.
Ponašanje. Modeliraju se dinamičke pojave u sustavu te kako on reagira na događaje.
Modele dalje možemo podijeliti po vrsti UML dijagrama koja je upotrjebljena za njihovo
zadavanje. U UML-u postoji trinaest vrsta dijagrama, no najčešće se koristi sljedećih pet.
1. Activity dijagram. Prikazuje aktivnosti u nekom procesu te tok kontrole ili tok podataka u
tom procesu.
2. Use case dijagram. Prikazuje interakcije između sustava i njegove okoline.
3. Sequence dijagram. Detaljnije prikazuje interakcije između aktera izvan sustava i
pojedinih objekata unutar sustava.
4. Class dijagram. Prikazuje klase objekata koji se pojavljuju u sustavu te veze između tih
klasa.
5. State machine dijagram. Prikazuje kako sustav ili objekt reagira na unutrašnje ili vanjske
događaje te prelazi iz stanja u stanje.
Konačno, modele možemo podijeliti po načinu ili svrsi njihove upotrebe. Postoje tri
uobičajena načina.
1. Model služi kao pomagalo koje olakšava diskusiju o postojećem ili budućem sustavu.
2. Model služi kao dokumentacija postojećeg sustava.
3. Model služi kao polazište za automatsku implementaciju sustava – vidi odjeljak 1.2.3.
Svaki od ovih načina uporabe postavlja drukčije zahtjeve u pogledu detaljnosti i rigoroznosti
modeliranja. Očigledno, prvi način dozvoljava neformalne i neprecizne modele, dok modeli
koji se koriste na treći način moraju biti razrađeni do najsitnijih detalja.
U ranoj fazi utvrđivanja zahtjeva potrebno je odrediti granice novog sustava. U dogovoru s
korisnicima treba odlučiti koja funkcionalnost mora biti uključena u sustav, a što će se
prepustiti njegovoj okolini.
Nakon što su određene granice sustava, crta se kontekstni model nalik na sliku 2.12. Zapravo
je riječ o UML class dijagramu gdje pravokutnici umjesto klasa predstavljaju cijele sustave –
to je označeno takozvanim stereotipom <<system>>. Prikazane su i veze među sustavima,
one obično znače razmjenu podataka. Na slici 2.12 sustav kojeg razvijamo nalazi se u sredini,
a ostali sustavi čine njegovu okolinu. Na primjer, vidi se da naš sustav komunicira s registrom
zdravstvenog osiguranja iz Ministarstva zdravlja te također sa sustavom za izdavanje
elektroničkih recepata.
<<system>> <<system>>
Informacijski Registar
sustav Zavoda zdravstvenog
za statistiku osiguranja
<<system>>
Bolnički
informacijski
sustav
<<system>> <<system>>
Sustav Sustav
elektroničkih elektroničkih
uputnica recepata
Kontekstni model sa slike 2.12 ne objašnjava točnu prirodu veza između našeg sustava i
njegove okoline. Više informacija o tim vezama dobivamo iz modela interakcije. UML nudi
dva načina modeliranja interakcija.
1. Use case dijagrami. Imenuju takozvane slučajeve uporabe (use cases) dakle interakcije
između aktera izvan sustava i samog sustava.
2. Sequence dijagrami. Detaljnije razrađuju interakcije između aktera izvan sustava i
pojedinih objekata unutar sustava, ili međusobne interakcije između tih objekata.
Use case dijagrame već smo upoznali u odjeljku 2.2.2. Jedan primjer već smo vidjeli na slici
2.9. Drugi, nešto jednostavniji primjer nalazi se na slici 2.13 – tu vidimo da medicinski
recepcionar može pokrenuti transfer podataka iz našeg sustava u vanjski sustav.
Transfer podataka
Kao što smo već objašnjavali, use case dijagram sastoji se od imenovanih aktera koji su
nacrtani kao čovječuljci, imenovanih slučajeva uporabe koji su nacrtani kao ovali te spojnica
koje pokazuju sudjelovanje pojedinog aktera u pojedinom slučaju uporabe. Akter je korisnik
ili vanjski sustav koji stupa u interakciju s našim sustavom. Slučaj uporabe je usluga koju naš
sustav daje akteru ili funkcija koju je akter pokrenuo.
Kad god je to moguće, svi slučajevi uporabe crtaju se na istom use case dijagramu. Takav
dijagram osim interakcija također opisuje i kontekst. Naime, svi slučajevi uporabe (ovali)
nalaze se unutar sustava, a akteri (čovječuljci) čine njegovu okolinu. Koji put se to naglašava
tako da se ovali ograde od čovječuljaka okvirom koji predstavlja granicu sustava.
Medicinska sestra
Gledaj (PID)
Autorizacija
[Autorizacija OK]
Kao što se vidi na slici 2.14, sequence dijagram je organiziran na sljedeći način. U
vodoravnom smjeru nanizani su akteri i objekti iz sustava koji sudjeluju u interakciji. Iz
svakog aktera ili objekta izlazi okomita crta koja označava tijek vremena. Podebljani
pravokutnik na toj crti određuje period aktivnosti dotičnog aktera ili objekta. Vodoravne
strelice označavaju vremenski redoslijed poruka koje akteri ili objekti međusobno
razmjenjuju. Ustvari je riječ o pozivima objektovih operacija (metoda) od kojih svaka ima
svoje ime i parametre. Okvir Alt određuje da će se od dvije uokvirene poruke izvršiti samo
jedna, i to ovisno o ispunjenju odgovarajućeg uvjeta.
U fazi analize zahtjeva sequence dijagrami ne moraju biti do kraja razrađeni. Naime, mnoge
interakcije ne mogu se do kraja opisati jer ovise o odlukama koje će biti donesene tek u
implementaciji. Na primjer, na slici 2.14 nije određeno kako će se doći do podatka UID koji
služi za autorizaciju korisnika.
Model strukture prikazuje organizaciju ili građu sustava. Model se sastoji od dijelova koji
čine sustav i veza između tih dijelova. Može biti riječ o:
statičkom modelu koji pokazuje strukturu dizajna sustava, ili
dinamičkom modelu koji pokazuje organizaciju sustava za vrijeme njegovog rada.
Dinamičko modeliranje više je zastupljeno u kasnijim fazama razvoja softvera. Za sada ćemo
se ograničiti na ono što je važnije za početne faze softverskog procesa, a to je modeliranje
statičke strukture.
Objektno orijentirane metode razvoja softvera zahtijevaju da sustav promatramo kao skup
objekata koji međusobno komuniciraju. Ti objekti pripadaju odgovarajućim klasama. Slijede
definicije tih pojmova.
Objekt je entitet uz kojeg je vezan skup atributa i skup operacija. Vrijednosti atributa
vezanih uz objekt određuju stanje tog objekta. Operacije vezane uz objekt mijenjaju
vrijednosti njegovih atributa te na taj način djeluju na njegovo stanje.
Klasa je skup istovrsnih objekata. Definicija klase služi kao obrazac za stvaranje objekata.
Definicija klase sadrži deklaracije svih atributa i operacija vezanih uz objekt iz te klase.
Modeliranje statičke strukture sustava najvećim dijelom se svodi na modeliranje klasa. U fazi
analize zahtjeva, klase obično opisuju nešto što postoji u stvarnom svijetu, na primjer
pacijente, liječnike, recepte, preglede, ... . U kasnijim fazama pojavljuju se i apstraktnije klase
koje su potrebne za implementaciju sustava, na primjer klasa za pristup bazi podataka ili klasa
koja inkapsulira mrežnu komunikaciju.
Modeliranje statičke strukture također obuhvaća definiranje veza između klasa. Makar se veze
definiraju na razini klasa, one se najčešće realiziraju na razini objekata, to jest one kažu da
neki objekti iz tih klasa mogu biti međusobno povezani, „znati“ jedan za drugoga, ili biti u
nekom drugom odnosu. Na primjer, ako jedan objekt sadrži referencu na drugi objekt,
pripadne klase su u vezi.
Statička struktura obično se modelira pomoću UML class dijagrama. Taj dijagram sastoji se
od pravokutnika koji predstavljaju klase i spojnica koje predstavljaju veze. Klase imaju
zadana imena, a veze mogu i ne moraju biti imenovane. Na spojnicama mogu biti upisani
takozvani multipliciteti veza, to jest brojevi koji kažu koliko objekata jedne klase može biti
povezano s odabranim objektom druge klase.
Slika 2.15 sadrži class dijagram za bolnički informacijski sustav. Vidimo da postoje klase
koje odgovaraju pacijentima, pregledima, liječnicima, lijekovima, i tako dalje. Između tih
klasa uspostavljaju se razne veze. Na primjer pacijent se podvrgava pregledu, pacijent je
upućen u bolnicu od liječnika opće prakse, i tako dalje. Oznaka multipliciteta 1 znači „točno
1“, oznaka 1..4 znači „od 1 do 4“, 1..* znači „jedan ili više“, a 0..* znači „nula jedan ili više“..
Tako na primjer jedan liječnik opće prakse može uputiti u bolnicu više pacijenata, no svaki
pacijent je upućen od točno jednog liječnika opće prakse. Slično, jedan pregled mogu
obavljati najviše 4 bolnička liječnika zajedno.
Liječnik
specijalist
1
Upućen_prema
1..*
0..* 1..* 1..* 1 Liječnik opće
Stanje Pacijent prakse
Dijagnosticirano Upućen_od
1
Podvrgava_se
1..*
1..* 0..*
Pregled Lijek
Propisuje
1..*
Sudjeluje_u
1..4
Bolnički liječnik
Primijetimo da class dijagrami poput onog sa slike 2.15 izgledaju vrlo slično kao Chenovi
dijagrami koji se koriste za opis konceptualne sheme baze podataka u skladu s modelom
entiteta, veza i atributa. Zaista, class dijagram zapravo poopćuje Chenov dijagram, naime
entitet iz baza podataka može se shvatiti kao jednostavna vrsta klase koja ima atribute ali
nema operacije. Na taj način, class dijagram koji se pojavio relativno nedavno uklopio je u
sebi dobra iskustva znatno starije grafičke notacije iz 70-ih godina 20. stoljeća.
UML class dijagrami mogu se oblikovati uz razne stupnjeve detaljnosti. Kad prikazujemo
veze među klasama, spretno je svaku klasu prikazati na najjednostavniji način, samo imenom.
No za točniji opis pojedine klase moramo dodati informacije o njezinim atributima i
operacijama. Slika 2.16 prikazuje razrađenu verziju jedne od klasa s prethodnog dijagrama.
Pravokutnik koji predstavlja klasu sad je podijeljen u tri dijela: na vrhu je ime klase, u sredini
je popis atributa, a na dnu su popisane operacije.
Definicija klase sa slike 2.16 vjerojatno je dovoljno dobra da posluži za analizu zahtjeva, no
nedovoljna je za stvarnu implementaciju. Naime, atributima nisu zadani tipovi, a operacijama
se ne znaju parametri. U kasnijim fazama razvoja sustava ove definicije morat će se još bolje
razraditi.
U objektno orijentiranim metodama razvoja softvera važnu ulogu ima generalizacija. Riječ je
o posebnoj vezi koja povezuje podklase i nadklase, dakle vezi koja kaže da je svaki objekt
jedne klase ujedno i objekt druge klase. Generalizacija podrazumijeva nasljeđivanje: atributi i
operacije definirani za nadklasu također su implicitno definirani i za podklasu. No podklasa
može imati svoje dodatne atribute i operacije.
Bolnički liječnik
IdentifikacijskiBroj
Prezime
Ime
DatumRođenja
Odjel
Plaća
Status
….
Zaposli ()
Otpusti ( )
Umirovi ()
PromijeniPlaću ()
…..
Slika 2.18 prikazuje nasljeđivanje za tri klase iz hijerarhije predmeta u knjižnici. Atributi i
operacije koji su definirani za klasu Publikacija primjenjivi su i na objekte iz podklase
Knjiga odnosno Časopis. No vidimo da svaka od podklasa ima i svoje specifične atribute.
Liječnik
Liječnik opće
Bolnički liječnik prakse
Liječnik
specijalist Timski liječnik
Liječnik Kvalificirani
pripravnik liječnik
Publikacija
Kataloški broj
Naslov
Izdavač
Status
Nabavi ()
Katalogiziraj ()
Otpiši ()
Posudi ()
Vrati ()
Knjiga Časopis
Autor Volumen
Izdanje Broj
Godina izdanja ISSN
ISBN
Još jedna važna vrsta veza između klasa je agregacija. Ta veza kaže da objekt jedne klase
sadrži objekte druge klase kao svoje sastavne dijelove. Na primjer, objekt iz klase Avion
sadrži sva objekta iz klase Krilo i četiri objekta iz klase Motor.
Nastavni
materijali
1 1 1
1 1..* 1..*
Udžbenik Slajdovi Zadaci za vježbu
Da bi se na class dijagramu veza agregacije lakše prepoznala, UML uvodi posebnu oznaku u
obliku romba koji se stavlja na spojnicu uz složeniju klasu. Slika 1.19 prikazuje agregaciju
vezanu uz predmet na fakultetu. Nastavni materijali za učenje sastoje se od udžbenika sa
cjelovitim prikazom gradiva, slajdova koje nastavnik koristi u nastavi te dodatnih zadataka za
vježbu.
Modeli ponašanja opisuju dinamičke promjene u sustavu za vrijeme njegovog rada. Ti modeli
pokazuju što će se desiti kad sustav odgovori na podražaj iz svoje okoline. Postoje dvije vrste
podražaja.
1. Podaci (data). Pojavi se neki podatak koji sustav mora obraditi.
2. Događaj (event). Desi se neki događaj na koji sustav mora reagirati.
Događaj može imati uza sebe vezane neke podatke, no to ne mora uvijek biti slučaj. Bitna
razlika između podatka i događaja je to što sustav sam odlučuje kad će obraditi neki podatak,
dok na događaj mora reagirati odmah tako da prekine ono što je taj čas radio.
Većina sustava je takva da njihovo ponašanje možemo opisati kao vođeno podacima (data
driven) ili kao vođeno događajima (event driven). Evo primjera.
Tipični poslovni sustav uglavnom je vođen podacima. Sustav za obračunavanje
telefonskih usluga čita datoteku sa zabilježenim pozivima pretplatnika, računa cijenu tih
poziva i ispisuje račun.
Sustav u realnom vremenu (real time) najčešće je vođen događajima. Sustav za
prospajanje poziva u telefonskoj centrali reagira na događaje kao što su dizanje slušalice,
utipkavanje brojeva i slično.
Zbog toga i modele ponašanja dijelimo na one koji su vođeni podacima te na one koji su
vođeni događajima.
Modeli vođeni podacima (data driven models) prikazuju nizove aktivnosti do kojih dolazi
tijekom obrade ulaznih podataka i stvaranja izlaznih podataka. Pojavili su se još u 70-im
godinama 20. stoljeća u sklopu funkcionalno-orijentiranih metoda razvoja softvera. U svojoj
čuvenoj knjizi [28], autor Tom DeMarco uveo je takozvane dijagrame toka podataka (data
flow diagrams), kao prvi oblik grafičkog modeliranja u softverskom inženjerstvu. Ti
dijagrami svojevremeno su bili vrlo popularni, a prikazivali su funkcije (procese) koji
transformiraju podatke i tokove podataka između tih funkcija.
Današnji UML ne podržava dijagrame toka podataka u njihovom izvornom obliku. No UML
je u verziji 2.0 na traženje stručne zajednice uveo activity dijagrame, koji su slični i mogu se
koristiti kao zamjena. Ustvari, UML activity dijagram je generalizacija dijagrama toka
podataka i još starijeg dijagrama toka kontrole.
Slika 2.20 sadrži activity dijagram koji opisuje postupak ubrizgavanja inzulina pacijentu
dijabetičaru onda kad mu je izmjerena razina šećera u krvi izvan dozvoljenih granica.
Općenito, u activity dijagramu ovali predstavljaju aktivnosti a pravokutnici objekte (dakle
podatke). Strelica predstavlja ili tok podataka ili tok kontrole, ovisno o tome je li na njoj
prisutan objekt ili nije.
Drugi način prikazivanja tijeka obrade podataka je pomoću UML sequence dijagrama, istih
onih koje smo već upoznali u odjeljku 2.3.2. Prije smo vidjeli da sequence dijagram modelira
interakciju. No ako je dijagram takav da poruke na njemu idu samo s lijeva na desno, onda je
riječ o sekvencijalnoj obradi podataka. Dok je activity dijagram isticao aktivnosti (funkcije),
sequence dijagram u većoj mjeri ističe objekte (podatke). Kao primjer takvog korištenja
sequence dijagrama imamo sliku 2.21 gdje se vidi obrada neke narudžbe opreme u poduzeću i
slanje te narudžbe dobavljaču.
Izračunaj
potrebnu
količinu
inzulina
Dobavljač
Službenik
Ispuni ()
Provjeri ()
[Provjera OK]
Ažuriraj (Iznos)
Spremi ( )
Pošalji ( )
Modeli vođeni događajima (event driven models) prikazuju kako sustav odgovara na vanjske
ili unutarnje događaje. Zasnovani su na pretpostavci da se sustav može naći u konačno mnogo
stanja te da događaji služe kao podražaji koji potiču prijelaz iz jednog stanja u drugo.
Modeliranje ponašanja vođenog događajima u novije vrijeme ostvaruje se pomoću UML state
machine dijagrama. No više-manje ista vrsta dijagrama koristila se i u starijim metodama za
oblikovanje sustava u realnom vremenu u 80-im godinama 20. stoljeća [29]. Sa stanovišta
matematike ili teorijskog računarstva, state machine dijagram nije ništa drugo nego konačni
automat.
State machine dijagram sastoji se od ovala koji predstavljaju stanja sustava (ili objekta) te od
strelica koje predstavljaju prijelaze iz stanja u stanje. Na svakoj strelici označen je podražaj
koji uzrokuje prijelaz. Unutar ovala može biti upisana neka akcija koju sustav izvodi dok se
nalazi u tom stanju. Polazno i završno stanje označeni su ispunjenim krugovima.
Puna snaga
Onesposobljena
Do: prikaži
poruku "Vrata
otvorena"
Na slici 2.22 vidi se primjer state machine dijagrama koji opisuje rad jednostavne mikrovalne
pećnice. Ta pećnica ima sklopku za podešavanje grijanja punom snagom ili s pola snage,
numeričku tipkovnicu za unos vremena pečenja, gumb start/cancel, alfanumerički displej za
ispis poruka te zvono. Normalni redoslijed akcija je da se izabere jačina grijanja, upiše
pomoću tipkovnice vrijeme pečenja te pritisne gumb za start. No zbog sigurnosnih razloga
pećnica neće raditi ako su njena vrata otvorena. Detaljniji opis svih stanja i podražaja nalazi
se na slici 2.23.
Stanje Opis
Podražaj Opis
Slika 2.23: opis stanja i podražaja za state machine dijagram s prethodne slike.
Problem sa state machine dijagramima je da broj mogućih stanja jako brzo raste čim sustav
postane iole složeniji. Kod velikih modela zato treba na neki način sakriti detalje. Jedan način
sakrivanja detalja je uvođenje super-stanja, dakle stanja koje na dijagramu više razine
izgledaju kao jedno stanje ali se na posebnom dijagramu niže razine razgrađuju na više stanja.
Rad
Provjera
Status ok Pečenje
Do: provjeri Do: puštaj
stanje grijalicu da radi
Greška na
obrtnoj
platformi
Prošlo je
Greška na vrijeme
emiteru
Alarm Gotovo
Vrata
otvorena Cancel
Onesposobljena Čekanje
Kao primjer, promatramo stanje Rad sa slike 2.22. Tu je zapravo riječ o super-stanju koje se
može razraditi na način prikazan na slici 2.24. Dakle Rad se sastoji od četiri manja stanja,
početno od njih je Provjera, a završno je Gotovo koje uključuje i oglašavanje zvona. U
slučaju bilo kakvih problema, operacija se prekida.
3. Oblikovanje i implementacija
U ovom poglavlju bavimo se osnovnim aktivnostima koje u softverskom procesu obično
slijede nakon utvrđivanja zahtjeva: to su oblikovanje i implementacija. Najprije ćemo reći
nešto općenito o tim aktivnostima i pripadnim podaktivnostima, pristupima i trendovima.
Zatim ćemo detaljnije obraditi pojedine izuzetno važne aspekte oblikovanja, kao što su
oblikovanje arhitekture i objektni pristup oblikovanju. Na kraju ćemo se posvetiti
specifičnostima razvoja danas vrlo raširenih distribuiranih odnosno uklopljenih sustava.
Nakon što je specifikacija ustanovila što softverski sustav treba raditi, oblikovanje treba
utvrditi kako će sustav raditi. Rezultat oblikovanja je dizajn sustava: precizni opis građe
sustava, dijelova od kojih se on sastoji, sučelja između dijelova, korisničkog sučelja te
eventualno struktura podataka i algoritama koji se koriste. Oblikovanje je iterativni postupak,
to jest do dizajna se dolazi postepenim profinjavanjem i razradom kroz više iteracija.
Nakon oblikovanja slijedi implementacija, to jest svi dijelovi predviđeni dizajnom realiziraju
se uz pomoć pogodnog programskog jezika. Zadnje iteracije oblikovanja obično se preklapaju
s implementacijom. Također, implementacija se donekle preklapa s verifikacijom
(testiranjem), budući da se programeri odmah bave debuggiranjem.
Oblikovanje je kreativna aktivnost koju je teško precizno opisati. Ipak, možemo reći da se
oblikovanje sastoji od podaktivnosti u skladu sa slikom 3.1. Svaka od njih daje svoje izlazne
rezultate.
Utvrđivanje
zahtjeva
Oblikovanje Oblikovanje
Oblikovanje Apstraktno struktura
specificira- Oblikovanje dijelova Oblikovanje
arhitekture nje sučelja sustava podataka algoritama
Specifikacija
Arhitektura Opis dijelova Opis struktura Opis
softverskog Opis sučelja
sustava sustava podataka algoritama
dizajna
Da bi izašli na kraj sa složenošću sustava koji treba oblikovati, softverski inženjeri obilato se
služe principom „podijeli pa vladaj“. Dakle, oblikovanje se u velikoj mjeri svodi na
dekompoziciju većih dijelova u manje te posebno razmatranje svakog od tih manjih dijelova.
Najprije kod oblikovanja arhitekture, cijeli sustav rastavljamo na podsustave. Kasnije kod
oblikovanja dijelova, svaki podsustav dalje rastavljamo na dijelove, pa te dijelove na još
manje dijelove, i tako dalje.
Razlika između dva pristupa oblikovanju ilustrirana je slikama 3.2 i 3.3. Te slike prikazuju
dva dizajna za isti sustav koji obrađuje fakture. Prvi dizajn dobiven je funkcionalnim
pristupom, a drugi slijedi iz objektnog pristupa. U skladu s time slika 3.2 građu sustava
prikazuje UML activity dijagramom, a sustav se sastoji od procesa koji su nacrtani kao ovali.
S druge strane, slika 3.3 građu sustava prikazuje UML class dijagramom, a sustav se sastoji
od objekata iz klasa koje su nacrtane kao pravokutnici .
Ustanovi je
Čitaj izdane li faktura Faktura
fakture Izdaj račun Račun
plaćena [plaćena]
Faktura Izdaj
Sve fakture Faktura Sve uplate opomenu Opomena
[neplaćena]
Kupac Račun
Očito je da konačna građa softvera bitno utječe na njegovu kvalitetu. Postavlja se pitanje:
kako treba oblikovati softver da bi on bio kvalitetan? Kako na tu kvalitetu utječe sam pristup
u oblikovanju, dakle način dekomponiranja? Odgovor ovisi o tome koji od atributa kvalitete
softvera nam je najvažniji.
Na primjer, ako nam je prvenstveno stalo do mogućnosti održavanja, tada je dobro da se
softver sastoji od velikog broja malih dijelova. Unutar pojedinog dijela treba postojati jaka
„kohezija“ njegovih još manjih dijelova, a veze između osnovnih dijelova trebaju biti
relativno „labave“. Takav dizajn dobiva se primjenom objektnog pristupa.
S druge strane, ako nam je prvenstveno stalo do efikasnosti (performansi), tada je dobro
da se softver sastoji od malog broja relativno velikih dijelova, tako da se smanji
komuniciranje između tih dijelova. Poželjno je da razne funkcije direktno pristupaju
PMF – Matematički odsjek 57
Robert Manger
podacima, što stvara potrebu za globalnim podacima. Takav dizajn moguće je dobiti
primjenom funkcionalnog pristupa.
U skladu s upravo izloženim zaključujemo da sadašnja popularnost objektnog pristupa zaista
ima svoje opravdanje. Naime kod većine sustava glavno mjerilo kvalitete je baš mogućnost
održavanja, dok efikasnost obično nije od presudne važnosti. S druge strane, vidimo da stariji
funkcionalni pristup isto ima svojih prednosti i može se pokazati opravdanim na primjer kod
uklopljenih sustava i sustava u realnom vremenu.
Razlike između modela iz analize odnosno modela iz oblikovanja najbolje se vide kad se
usporedi slika 2.16 iz prethodnog poglavlja sa slikom 3.4 iz ovog poglavlja. U oba slučaja
riječ je o specifikaciji jedne klase. Slika 2.16 primjerena je analizi zahtjeva, naime prikazana
klasa spada u poslovnu domenu i definirana je na neformalan način. S druge strane, slika 3.4
Inbox
-InboxId : int
-VlasnikID : int
-Poruka: String[*]
+dajInboxId() : int
+dajVlasnikId() : int
+dajPoruku(indeks : int) : String
+nađiPoruku(obrazac : String) : int [*]
+brisiPoruku (indeks : int) : void
+posaljiPoruku (posiljateljId : int, primateljId : int, poruka : String) : void
Ručno kodiranje velikih sustava predstavlja napor koji se mjeri u velikom broju radnih sati
programera. Neki od novih trendova vezanih uz implementaciju nastoje taj napor smanjiti
tako da se dio programa stvori automatski ili zamijeni već prethodno stvorenim kodom. Evo
nekoliko načina kako se to može postići.
U skladu s idejom formalnog razvoja, izrađuje se formalna specifikacija softvera. Zatim se
ta formalna specifikacija primjenom odgovarajućih alata automatski pretvara u
programski kod.
U skladu s idejom grafičkog razvoja, izrađuje se skup preciznih grafičkih modela sustava.
Zatim se ti grafički modeli primjenom odgovarajućih alata automatski pretvaraju u
programski kod.
U skladu s idejom razvoja usmjerenog na ponovnu upotrebu, sustav se oblikuje tako da se
u što većoj mjeri sastoji od već gotovih dijelova. Ti gotovi dijelovi ne moraju se ponovo
kodirati.
Zajedničko svojstvo svih ovdje navedenih tehnika je da one teret implementacije prebacuju na
ranije faze softverskog procesa, dakle na oblikovanje ili utvrđivanje zahtjeva.
Kao što smo već napominjali, formalni razvoj je već dulje vremena predmet intenzivnog
istraživanja, no za sada je primjenjiv samo u vrlo specifičnim situacijama. Također, mnogo se
istražuje i ideja grafičkog razvoja: pokazuje se da je na primjer iz UML dijagrama kao što su
class, sequence odnosno state machine dijagrami moguće generirati upotrebljivi programski
kod, no taj kod je obično nedovršen i treba ga ručno doraditi. U ovom trenutku najveće uštede
u kodiranju postižu se primjenom razvoja usmjerenog na ponovnu upotrebu. Postoji više
konkretnih tehnika takvog razvoja i one će detaljnije biti opisane u potpoglavljima 6.1 - 6.3.
U nastavku ćemo najprije reći nešto općenito o podsustavima i odnosima među njima. Zatim
ćemo detaljnije objasniti dvije podaktivnosti unutar oblikovanja arhitekture, a to su
strukturiranje sustava odnosno modeliranje kontrole.
Podsustav definiramo kao relativno samostalnu cjelinu, čije funkcioniranje uglavnom ne ovisi
o uslugama koje pružaju drugi podsustavi. Podsustav je sastavljen od svojih dijelova
(komponente, moduli, objekti, … ). On ima definirano sučelje za komunikaciju s drugim
podsustavima te se podvrgava određenim režimima kontrole.
Da bi oblikovali arhitekturu nekog sustava, nije dovoljno samo definirati njegove podsustave,
već također treba odrediti odnose između tih podsustava. Primijetimo da postoje dvije bitno
različite vrste odnosa podsustava: međusobna komunikacija, odnosno međusobna
kontrola. Zato se u sklopu oblikovanja arhitekture pojavljuju sljedeće dvije podaktivnosti.
60 PMF – Matematički odsjek
Softversko inženjerstvo - skripta
Rezultat strukturiranja predočuje se kao neformalni blok dijagram, gdje su blokovi pod-
sustavi, a strelice označavaju komunikaciju. Pojedini blok može sadržavati podblokove. Od
UML dijagrama moguće je za tu istu svrhu koristiti class ili package ili component dijagram.
Slika 3.5 sadrži blok dijagram sustava za pakiranje uz pomoć robota. Predmeti stižu po
tekućoj traci, robot ih uzima, prepoznaje, pakira te stavlja na drugu tekuću traku. Slika 3.6
sadrži blok dijagram sustava za automatsko ubrizgavanja inzulina pacijentu dijabetičaru onda
kad mu je izmjerena razina šećera u krvi izvan dozvoljenih granica.
Pod-sustav za
umjetni vid
Pod-sustav za
odabir načina
pakiranja
Pod-sustav za Upravljanje
pokretnom
pakiranje trakom
Displej 1 Displej 2
Primjeri na prethodnim slikama pokazuju kako se za svaki sustav može razviti specifična
arhitektura. No postoje i uobičajeni modeli strukture koji su se pokazali upotrebljivi za razne
sustave. U nastavku ćemo opisati četiri takva modela.
Pod-sustav 1 Pod-sustav 2
Repozitorij
(baza podataka)
Pod-sustav 3 Pod-sustav 4
Ovo je uobičajena struktura za sustave koji rade s velikim količinama podataka (na primjer:
informacijski sustav banke ili poduzeća, CAD/CAM sustav, CASE alat). Konkretni primjer je
CASE alat Visual Paradigm kojeg koristimo na vježbama, ili informacijski sustav ISVU.
Slika 3.8 prikazuje strukturu zamišljenog lower-CASE alata.
Editori za Generatori
UML koda
Editor za
Javu
Prevoditelj
dizajna Projektni repozitorij
Editor za
Python
Analizator Generator
dizajna izvještaja
Model klijent – poslužitelj (client - server). U skladu s njime, sustav se sastoji od sljedećih
dijelova:
poslužitelji: podsustavi koji nude usluge drugim podsustavima,
klijenti: podsustavi koji traže usluge ponuđene od poslužitelja,
mreža: omogućuje komunikaciju klijenata i poslužitelja.
Klijent mora znati imena dostupnih poslužitelja i njihove usluge. Poslužitelj ne mora znati ni
imena ni broj klijenata. Struktura je vidljiva na slici 3.9.
Mreža
Poslužitelj 1 Poslužitelj 2
Slika 3.10 prikazuje zamišljenu multimedijsku knjižnicu. U njoj se čuvaju slike u visokoj
rezoluciji, filmovi i zvučni zapisi. Svaka vrsta sadržaja pohranjena je na specijaliziranom
poslužitelju. Postoji i dodatni poslužitelj s katalogom svih dokumenata. Korisnikov klijent u
stanju je komunicirati sa svakom od poslužitelja da bi od njega dobio traženi dokument ili
informaciju u odgovarajućem formatu.
Širokopojasna mreža
Poslužitelj
Video poslužitelj Audio poslužitelj Poslužitelj slika
kataloga
Filmovi u Digitalne
Digitalizirani
Katalog digitalnom fotografije u
zvučni zapisi
formatu visokoj rezoluciji
Slojeviti model (model apstraktnog stroja). Sustav je organiziran kao niz podsustava koji se
zovu slojevi. Svaki sloj definira „apstraktni stroj“ čiji strojni jezik (ustvari skup usluga) služi
za implementaciju idućeg sloja. Struktura je ilustrirana slikom 3.11.
Sloj 3
Sloj 2
Sloj 1
Ovakva struktura pojavljuje se kod sustava gdje želimo ostvariti što veću neovisnost rješenja
o hardverskoj platformi. Primjeri su: aplikacija stvorene u jeziku Java, grafičko sučelje
izgrađeno pomoću biblioteka Motif/X-Toolkit/Xlib, OSI model za mrežne protokole sa 7
slojeva, Internetski model za mrežne protokole sa 4 sloja. Slika 3.12 prikazuje zamišljeni
bibliotečni sustav sastavljen od 5 slojeva; on dozvoljava objedinjeni pristup znanstvenoj
literaturi koja je pohranjena u nekoliko digitaliziranih sveučilišnih knjižnica.
Upravljanje Upravljanje
Login formularima
i upitima ispisom
Objedinjeni katalog
Model cjevovoda i filtra (pipe and filter). Sustav se sastoji od niza podsustava koji se zovu
filtri. Razmjena podataka odvija se u jednom smjeru i oblikuje takozvani cjevovod. Svaki
filtar prima podatke od prethodnog filtra, transformira ih, pa ih tako transformirane šalje
idućem filtru. Na taj način podaci koji ulaze u sustav doživljavaju niz transformacija da bi se
na kraju pretvorili u izlazne rezultate. Struktura je ilustrirana slikom 3.13. Naziv „cjevovod i
filtar“ potječe iz operacijskog sustava UNIX, gdje UNIX naredbe služe kao filtri, a cjevovod
se uspostavlja povezivanjem filtara pomoću pipe operatora „|“.
Ovaj model često se koristio u prošlosti za oblikovanje neinteraktivne (paketne, batch) obrade
podataka, na primjer računanje plaća zaposlenicima, ispis računa telefonskim pretplatnicima.
Najčešće se koristio posebni slučaj „ulaz-obrada-izlaz“ koji se sastoji od tri filtra: prvi učitava
podatke, drugi računa s njima, treći ispisuje rezultate. Slika 3.14 prikazuje nešto složeniji
primjer, gdje je model upotrjebljen za oblikovanje arhitekture prevodioca programskog jezika
(compiler-a).
Postoje dva bitno različita pristupa kako se može ostvariti tok kontrole između podsustava:
Centralizirana kontrola: jedan podsustav igra ulogu „kontrolora“, dakle on pokreće i
zaustavlja ostale podsustave.
Kontrola upravljana događajima (event driven): kontrola je distribuirana u tom smislu što
pojedini podsustavi samostalno reagiraju na vanjske događaje. Ti događaji mogu biti
generirani od drugih podsustava ili od okoline sustava.
Pod pojmom „događaj“ ponovo mislimo na signal koji može poprimiti zadani raspon
vrijednosti. To nije obični ulazni podatak, budući da vrijeme njegovog pojavljivanja nije pod
kontrolom procesa koji ga obrađuje.
Postoje opet standardni modeli kontrole koji su se pokazali upotrebljivi u raznim sustavima.
Opisat ćemo četiri takva modela, od kojih prva dva spadaju među centralizirane, a druga dva
među one koji su upravljani događajima. Svaki model kontrole može se kombinirati s bilo
kojim modelom za strukturu sustava.
Model poziva i povratka (call - return). Spada među modele sa centraliziranom kontrolom.
Riječ je o ideji koja je implementirana u klasičnim programskim jezicima. Kontrola kreće s
vrha hijerarhije podsustava (iz glavnog programa) i prosljeđuje se na niže članove hijerarhije
(preko poziva potprograma). Model je prikazan na slici 3.15.
Ovaj model ima smisla samo za sekvencijalne sustave: naime u jednom trenutku samo jedan
podsustav je aktivan. Prednost modela je mogućnost jednostavne analize toka kontrole. Mana
što je teško obraditi iznimne situacije (exceptions) koje remete normalni rad: ako se iznimka
dogodi negdje duboko u hijerarhiji, potrebno je više puta prebacivati kontrolu na više članove
hijerarhije.
Glavni program
Model menadžera. Jedan podsustav, takozvani menadžer, kontrolira ostale tako što im šalje
signale za početak, kraj, odnosno sinkronizaciju njihovog rada. Svi podsustavi u principu rade
paralelno, makar je to moguće simulirati i u sekvencijalnom sustavu. Menadžer izvršava
beskonačnu petlju u kojoj ispituje varijable stanja da bi ustanovio koje podsustave treba
pokrenuti ili zaustaviti. Model je predočen slikom 3.16.
Pod-sustav 1 Pod-sustav 2
Menadžer
Pod-sustav 3 Pod-sustav 4
Model difuzije (broadcast). Spada u modele upravljane događajima. Bilo koji događaj
prosljeđuje se svim podsustavima. Odgovara samo onaj podsustav koji je napravljen da
obrađuje taj događaj. Glavna razlika u odnosu na prethodni model je u tome što upravljanje
nije prepušteno jednom podsustavu, već svaki podsustav samostalno odlučuje hoće li reagirati
na događaj ili neće. Model je ilustriran slikom 3.17.
Ovaj model prisutan je na primjer u grafičkim korisničkim sučeljima, gdje se događaj klika
mišem emitira svim elementima sučelja, a reagira samo onaj element nad kojim se kursor
miša nalazio. Moguća je varijanta sa selektivnim emitiranjem događaja samo onim
podsustavima koji su „pretplaćeni“ na određene vrste događaja.
(događaj)
Model upravljan prekidom (interrupt driven) također je upravljan događajima. Svakoj vrsti
vanjskog događaja pridružen je jedan hardverski prekid (interrupt). Svakom prekidu
pridružen je posebni podsustav - takozvani interrupt handler. Kad procesor primi prekid
odgovarajuće vrste, hardverska sklopka prekida trenutni proces i prebacuje kontrolu na
pripadni handler. Taj handler obradi događaj, nakon čega procesor nastavlja onaj proces koji
je bio prekinut. Model se vidi na slici 3.18.
(prekidi)
Interrupt
vector
Novi objektno-oblikovani sustavi mogu biti razvijeni uz upotrebu objekata koji su bili
stvoreni za prethodne sustave. To smanjuje cijenu razvoja softvera i vodi ka upotrebi
standardnih objekata. Ipak, pokazuje se da su za ponovnu upotrebu pogodnije veće cjeline od
pojedinih objekata, takozvane komponente – o njima će biti riječi u potpoglavlju 6.2.
Kontekst promatranog dijela softvera opisuje se modelima koje smo opisali u odjeljku 2.3.2,
na primjer pomoću UML class ili package ili component dijagrama. Važno je utvrditi granicu
našeg dijela softvera, identificirati druge podsustave ili komponente ili vanjske sustave koje se
nalaze u njegovoj okolini te uočiti veze između našeg dijela i dijelova iz okoline. Sve
interakcije našeg dijela softvera s okolinom modeliraju se UML use case dijagramom, dok za
detaljno specificiranje jedne interakcije može poslužiti UML sequence dijagram ili
strukturirani tekst.
Oblikovanje na najvišoj razini opet se može dokumentirati pomoću UML class ili package ili
component dijagrama. No na tim dijagramima promatrani dio softvera rastavljen je na manje
sastavne dijelove. Također se označavaju veze između manjih dijelova, koje mogu značiti
razmjenu podataka ili tok kontrole.
Kod identifikacije klasa koji put je potrebno klase iz aplikacijske domene koje smo dobili
analizom zahtjeva rastaviti na više jednostavnijih klasa. Također je potrebno dodati nove
klase koje su nužne za implementaciju, na primjer one koje omogućuju komunikaciju preko
mreže, pristup bazi podataka, grafičko korisničko sučelje i tako dalje. Sve skupa može se
prikazati pomoću UML class dijagrama.
Profinjeni modeli strukture i ponašanja dokumentiraju se UML class ili sequence ili state
machine dijagramima. Dovoljno su detaljni da omogućuju implementaciju. UML class
dijagrami precizno razrađuju veze među klasama. Tu može biti riječ o nasljeđivanju,
agregaciji ili o vezi koja kaže da objekti jedne klase pozivaju operacije nad objektima druge
klase.
Sučelje klase sastoji se od sučelja operacija koje će u objektima te klase biti dostupne drugim
objektima. Precizno se definiraju se broj i tipovi parametara za svaku operaciju te tip rezultata
operacije. Sve se to opet može dokumentirati razrađenim UML class dijagramima ili u nekom
programskom jeziku poput Jave ili C++ ili C#. Osim sučelja pojedine klase, mogu se
definirati i općenitija sučelja, na primjer za cijele komponente.
Unutar jedne meteorološke stanice nalazi se nekoliko instrumenata koji mjere razne
meteorološke veličine poput brzine i smjera vjetra, temperature tla i zraka, tlaka zraka te
količine padalina po četvornom metru u 24 sata. Svaki od tih instrumenata nalazi se pod
kontrolom softvera koji periodički očitava i bilježi izmjerene vrijednosti. Budući da je
propusnost veze sa satelitom relativno uska, softver u meteorološkoj stanici lokalno obavlja
djelomičnu obradu i sažimanje izmjerenih podataka. Zatim se ti sažeti podaci na zahtjev šalju
preko satelita u meteorološki informacijski podsustav.
1 Kontrolni 1
pod-sustav
1 1 1..n
Satelit 1
1
Izvještaj o vremenu
Ponovno pokretanje
Gašenje
Rekonfiguriranje
Kontrolni pod-sustav
Upravljanje na daljinu
Unutrašnja komunikacija
Komunikacija Skupljanje
Instrumenti
preko satelita podataka
MeteoroloskaStanica MeteoroloskiPodaci
Identifikator temperatureZraka
temperatureTla
brzineVjetra
izvjestajVrijeme () smjeroviVjetra
izvjestajStanje () tlakovi
daljinskoUpravljanje (naredbe) padaline
rekonfiguracija (naredbe)
restart (instrumenti) skupi ()
shutdown (instrumenti) obradi ()
Informacijski pod-sustav
zahtjev (izvjestaj)
potvrda
izvjestajVrijeme ( )
potvrda
zahtjev (obrada )
obradi ( )
salji (izvjestaj)
potvrda
odgovor (izvjestaj)
potvrda
Pod daljinskim
upravljanjem
shutdown( ) daljinskoUpravljanje( )
izvjestajStanje( )
izvjestajVrijeme()
Skuplja
Konfigurira se Šalje podatke
podatke
izvještaj
gotov
Obrađuje
podatke
Kao ilustraciju zadnjeg koraka u oblikovanju, prilažemo sliku 3.27 na kojoj su definirana dva
sučelja za meteorološku stanicu. Prvo sučelje tiče se izvještavanja, dakle slanja izmjerenih
podataka i statusa u informacijski podsustav. Drugo sučelje služi za udaljeno upravljanje
stanicom preko satelita. Primijetimo da između sučelja i klasa ne mora postojati odnos jedan-
naprama-jedan. To je posebno naglašeno u programskom jeziku Java gdje se sučelja mogu
definirati neovisno o klasama, a razne klase mogu implementirati isto sučelje. U našem
primjeru operacije iz prvog sučelja izravno se preslikavaju na odgovarajuće operacije iz klase
MeteoroloskaStanica. No četiri operacije iz drugog sučelja realiziraju se različitim
komandnim nizovima znakova koje šaljemo jednoj te istoj operaciji daljinskoUpravljanje()
iz klase MeteoroloskaStanica.
<<interface>> <<interface>>
Izvjestavanje DaljinskoUpravljanje
MeteoroloskaStanica PodaciOZagadjenju
Identifikator podaciNO
podaciSmog
izvjestajVrijeme () podaciBenzen
izvjestajZagadjenje ()
izvjestajStanje () skupi ()
daljinskoUpravljanje (naredbe) obradi ()
rekonfiguracija (naredbe)
restart (instrumenti)
shutdown (instrumenti)
Temelji obrazaca za oblikovanje bili su postavljeni u knjizi [30] autora Gamme i suradnika.
Ta knjiga definira 30-ak najpoznatijih obrazaca. Drugi autori dalje su definirali dodatne
obrasce, tako da ih se do danas skupilo više stotina. Obrasci su izvršili jak utjecaj na objektno
oblikovanje softvera. Osim što daju provjerena rješenja za česte probleme, oni postaju i neka
vrsta rječnika za razgovor o dizajnu. Jedan inženjer može drugom inženjeru objasniti svoj
dizajn tako da navede obrasce koje je koristio.
Kao primjer korištenja obrazaca, promatrajmo situaciju sa slike 3.29. Riječ je o programu
gdje se stanje jednog te istog objekta prikazuje na više načina. Dakle vrijednosti atributa A, B,
C, D nacrtane su u obliku kružnog grafikona te također u obliku stupčastog grafikona.
Pojavljuje se sljedeći problem: kako osigurati da bilo koja promjena stanja objekta odmah
uzrokuje simultanu promjenu svih prikaza?
40%
B
25% 40
20% 25
20
15% 15
D
A B C D
C
Subjekt
A: 40
Promatrač 1 B: 25 Promatrač 2
C: 15
D: 20
Opis rješenja: Ono se zasniva na dvije apstraktne klase Subject i Observer te na konkretnim
klasama ConcreteSubject i ConcreteObserver koje nasljeđuju odgovarajuće apstraktne
klase. Apstraktne klase sadrže općenite operacije koje su primjenjive u svim situacijama.
Stanje koje treba prikazivati sadržano je u objektu iz klase ConcreteSubject. Taj objekt
nasljeđuje operacije od Subject, što mu omogućuje dodavanje ili uklanjanje Observer-a
(svaki od njih odgovara jednom prikazu stanja) te slanje obavijesti da mu se stanje
promijenilo.
Objekt iz klase ConcreteObserver čuva kopiju stanja ConcreteSubject-a i implementira
apstraktnu operaciju Update( ) iz klase Observer. Time je omogućeno da se kopije stanja
usklađuju te da se prikazi obnavljaju kad god je došlo do promjene stanja. UML model
obrasca prikazan je na slici 3.31.
Posljedice: Subjekt zna samo za apstraktnog promatrača i ne zna detalje konkretnih klasa
koje nasljeđuju tog apstraktnog promatrača. Zato među tim objektima postoji minimalna
povezanost. S druge strane, zbog tog nedostatka znanja, ne mogu se izvesti optimizacije
koje bi poboljšale performanse kod iscrtavanja prikaza. Promjene u subjektu mogle bi
izazvati niz povezanih promjena u promatračima.
Subject Observer
ConcreteSubject ConcreteObserver
subjectState observerState
observerState =
GetState ( ) return subjectState Update ( ) subject -> GetState( )
Slika 3.31: UML class dijagram koji pobliže objašnjava obrazac Promatrač.
Rješenje ovog problema daje obrazac Promatrač (Observer) iz knjige [30], Dokumentacija tog
obrasca nalazi se na slici 3.30, a njen sastavni dio je i UML class dijagram na slici 3.31.
Vidimo da se predloženi dizajn sastoji od dvije apstraktne klase te od većeg broja konkretnih
klasa koje ih nasljeđuju. Konkretne klase implementiraju apstraktne operacije za ažuriranje
prikaza, uvodeći pritom polimorfizam.
Distribuirani sustav je sustav čiji dijelovi su raspoređeni na više umreženih računala. Svi
današnji veliki sustavi su distribuirani pa je to razlog zašto njima treba posvetiti posebno
potpoglavlje. Nekadašnja mainframe računala s izravno spojenim terminalima zamijenili su
skupovi umreženih poslužiteljskih i osobnih računala. Umjesto privatnih mreža s posebnom
namjenom, za komunikaciju se koriste javne mreže Internet tipa. Razvoj brzih bežičnih mreža
omogućio je i uključivanje ručnih uređaja poput mobitela ili tableta. Na taj način nastali su i
sve više prevladavaju „sveprisutni“ distribuirani sustavi.
Otežano upravljanje. Veći broj raznorodnih računala teže je održavati nego jedno
računalo.
Nepredvidivost kakvoće usluge. Brzina odziva ovisi o ukupnom opterećenju (obično
javne) mreže na koje nemamo utjecaja.
c2 c3 c4 c12
c11
c1 s1 s4
c10 Poslužiteljski
c5 proces
s2 s3 c9
c6
Klijentski
c8 proces
c7
c1 s1, s2 c2 c3, c4
Poslužiteljsko
mreža računalo
Prezentacijski sloj
(presentation layer)
Sloj obrade
(processing layer)
Kod modela mršavog klijenta (thin client) većinu posla obavlja poslužitelj, a klijent se bavi
samo prezentacijom. Primjeri su: aplikacija s web sučeljem (klijent je zapravo web
preglednik), ili stara „baštinjena“ mainframe aplikacija (klijent je emulator tekstualnog
terminala). Kod modela debelog klijenta (fat client) klijent izvršava veći dio aplikacije, a
poslužitelj se bavi isključivo transakcijama nad bazom podataka. Na slici 3.36 imamo primjer
sustava bankomata, gdje se na bankomatu nalazi klijent, a na bančinom mainframe računalu je
poslužitelj.
ATM
ATM
Prednost mršavog klijenta je da klijentsko računalo ne mora biti pravi PC nego može biti i
nešto jednostavnije i jeftinije; mana je da je poslužitelj usko grlo. Prednost debelog klijenta je
bolji raspored tereta i veća autonomija klijenta; mana je složenije administriranje jer se nova
verzija aplikacije mora distribuirati na svaki od klijenata. Hibrid između mršavog i debelog
klijenta predstavljaju aplikacije zasnovane na Java applet-ima koji se s poslužitelja prebacuju
(download) na klijenta.
Složeniji raspored slojeva na računala zove se troredni (three-tier) gdje je svaki sloj na
zasebnom računalu. Ako se na bilo kojem sloju pojavi usko grlo, moguće je povećati broj
računala. Troredni raspored prikazan je na slici 3.37.
Klijent
HTTPS interakcija
Klijent
Slika 3.38 prikazuje sustav za internetsko bankarstvo. Korisnici ustvari gledaju web formulare
pomoću običnog web preglednika. Te web formulare dinamički oblikuje web poslužitelj,
služeći se podacima o bankovnim računima kojima upravlja poslužitelj baze podataka. Ako
promet postane prevelik, dodaje se više web poslužitelja.
Makar se većina distribuiranih sustava sastoji od klijenata i poslužitelja, postoje i sustavi koji
slijede drukčije modele. U ovom odjeljku opisat ćemo tri takva alternativna modela. Oni
naravno nisu međusobno isključivi, tako da su moguće i njihove razne kombinacije.
Model gospodar – rob (master – slave). Riječ je o jednostavnom modelu gdje se sustav
sastoji od jednog glavnog procesa koji zovemo gospodar i niza pomoćnih procesa koje
zovemo robovi. Gospodar upravlja radom sustava tako da robovima dodjeljuje poslove.
Robovi paralelno obavljaju poslove koje im je dodijelio gospodar.
Rob
Rezultati rješavanja
pod-zadatka
Rob
Procesor u
kontrolnoj sobi
Proces za
koordinaciju i
prikaz
situacije
Procesor za
senzore Gospodar
Kao primjer, pogledajmo sliku 3.40 koja prikazuje arhitekturu sustava u realnom vremenu za
upravljanje prometom oblikovanu po modelu gospodar – rob. Gospodar od roba zaduženog za
senzore prima podatke o intenzitetu prometa na pojedinim raskrižjima. Na osnovu tih
podataka, gospodar bira način regulacije prometa. Rob zadužen za aktuatore zapravo pali i
gasi semafore u skladu s načinom regulacije koji je dojavio gospodar.
Objekt 4 Objekt 5
Usluge 4 Usluge 5
Fizički raspored middleware-a po računalima je takav da svako računalo koje ima objekte
također ima i svoju kopiju middleware-a. Dva objekta koja se nalaze na istom računalu
komuniciraju preko lokalne kopije middleware-a, dok se komunikacija objekata na različitim
računalima ostvaruje tako da pripadni middleware-i „razgovaraju“.
Arhitektura s distribuiranim objektima dobra je zato jer ona u najvećoj mjeri može iskoristiti
prednosti distribuiranih sustava. Naime vrijedi sljedeće.
Fizički raspored objekata irelevantan je sa stanovišta korektnog rada aplikacije, pa se
može podešavati tako da osigura što bolje performanse.
Sustav je otvoren u smislu da pojedini objekti mogu biti razvijeni u različitim
programskim jezicima za različite platforme.
Sustav je skalabilan u smislu da je lagano dodati nove objekte ili kopije istog objekta da bi
se otklonila uska grla.
Sustav se dinamički može rekonfigurirati, tako da objekti u toku rada sele s jednog
računala na drugo, u skladu s promijenjenim zahtjevima.
No arhitektura s distribuiranim objektima ima i sljedeće nedostatke.
Kompliciranija je od arhitekture s klijentima i poslužiteljima ili arhitekture gospodar-rob.
Zahtijeva instalaciju i održavanje složenog middleware-a na svim računalima gdje se
nalaze objekti.
Nije podržana nekim općeprihvaćenim standardom. Takav standard trebala je biti
CORBA, no ona se nije uspjela nametnuti u dovoljnoj mjeri. Umjesto CORBA-e, u praksi
se najviše koriste middleware-i kompanija Microsoft i Sun koji su međusobno
nekompatibilni.
Na slici 3.42 vidi se arhitektura s distribuiranim objektima za data mining sustav. Taj sustav
nastoji otkriti zakonitosti među podacima koji su spremljeni u različitim bazama podataka i
odnose se na prodaju više vrsta roba u više robnih kuća. Na primjer, jedna takva zakonitost
bila bi: „Muški kupac od 30-ak godina koji u petak popodne dolazi kupiti pelene vjerojatno će
kupiti i pivo“.
Na slici 3.42 svaka od baza podataka prikazana je kao distribuirani objekt s read-only
pristupom. Svaki od objekata-integratora bavi se drukčijom vrstom odnosa među podacima:
na primjer jedan integrator proučava varijacije prodaje roba ovisne o godišnjim dobima, a
drugi se zanima za korelacije između različitih tipova roba. Objekt-vizualizator grafički
prikazuje otkrivene zakonitosti, a generator izvještaja daje tekstualne prikaze. Korisnici
pristupaju sustavu preko složenog sučelja koje povezuje grafičke i tekstualne prikaze. Objekti
se povezuju međusobnim pozivanjem operacija uz posredništvo middleware-a. Vidimo da
većina objekata i traži i daje usluge.
Integrator 2
korisnici
p5 p6 p7
p11
p8
p4 p3 p10
p12
p9
p1 p2
Model ravnopravnih partnera ima sličnosti s modelom distribuiranih objekata po tome što
također zaobilazi ili prevladava uobičajenu podjelu procesa na klijente i poslužitelje. Ipak,
između ova dva modela postoje i sljedeće razlike.
Kod distribuiranih objekata sustav se sastoji od međusobno različitih dijelova; svaki od tih
dijelova specijalizirao se za obavljanje jedne fiksirane uloge. Kod ravnopravnih partnera
sustav se sastoji od istovrsnih dijelova; svaki od tih dijelova samo privremeno preuzima
neku od uloga.
Kod distribuiranih objekata dijelovi su relativno čvrsto integrirani pomoću middleware-a
koji podržava paradigmu poziva udaljenih metoda. Kod ravnopravnih partnera ti partneri
su puno labavije povezani, naime oni komuniciraju samo povremeno služeći se
uobičajenim mrežnim protokolima i razmjenom poruka.
Poslužitelj za
pronalaženje
(super-partner)
p5 p6
p3
p4
p2
p1
U skladu sa slikom 3.44, polucentralizirana arhitektura osim običnih partnera uvodi i super-
partnere koji imaju sve informacije o mreži i služe kao posrednici u uspostavljanju veza
između običnih partnera. Da bi jedan partner našao odgovarajućeg partnera za komunikaciju,
on se obraća za pomoć super-partneru, što je na slici označeno crtkanim linijama. Super-
partner dojavljuje koji su drugi partneri na raspolaganju. Čim su obični partneri otkrili jedan
drugoga, oni uspostavljaju neposrednu komunikaciju, što je na slici označeno punim linijama.
Ovakvo rješenje koristi se na primjer u internetskoj telefoniji, gdje takozvani media gateway
controller služi kao neka vrsta telefonske centrale pretvarajući telefonske brojeve u IP adrese.
Uklopljeni sustavi predstavljaju specifičnu no vrlo raširenu vrstu softvera. Makar ih često ne
primjećujemo, oni se nalaze doslovce svuda oko nas: u perilicama rublja, telefonima,
glazbenim linijama, mikrovalnim pećnicama, bojlerima, automobilima, avionima, ... . U
prvom odjeljku ovog potpoglavlja navodimo osobine uklopljenih sustava, a u drugom
odjeljku bavimo se modelima za njihovu arhitekturu. Treći odjeljak posvećen je važnom
aspektu uklopljenih sustava, a to je ispravan timing njegovih procesa. Zadnji odjeljak govori o
alatima koji omogućuju efikasnu implementaciju uklopljenih sustava.
Uklopljeni sustav (embedded system) je softver koji je ugrađen u neki hardverski uređaj,
neposredno je u interakciji s hardverom i osigurava njegovo ispravno funkcioniranje. Taj
softver reagira na događaje koje mu dojavljuje hardver. Kao odgovor na događaje, on šalje
kontrolne signale hardveru. Pritom odgovor mora biti dovoljno brz jer u protivnom cijeli
hardversko-softverski sklop neće raditi kako treba.
Općenito, sustav u realnom vremenu (real-time system) je softver čiji ispravni rad ovisi ne
samo o rezultatima koje on proizvodi nego i o vremenu u kojem su ti rezultati proizvedeni.
„Meki“ sustav u realnom vremenu (soft real-time system) je sustav kod kojeg se kršenje
zahtjeva o brzini stvaranja rezultata smatra degradacijom performansi. „Tvrdi“ sustav u
realnom vremenu (hard real-time system) je takav sustav gdje se spora proizvodnja rezultata
smatra neispravnim radom.
Osim potrebe za odzivom u realnom vremenu, postoje još neke osobine po kojima se
uklopljeni sustavi razlikuju od drugih vrsta softvera. Slijedi popis tih osobina.
Uklopljeni sustav kontinuirano radi od trenutka paljenja hardvera do trenutka gašenja. U
slučaju greške on se mora „oporaviti“ i nastaviti rad.
Interakcije s okolinom su nepredvidive i ne mogu se kontrolirati. Uklopljeni sustav mora
odgovarati na neočekivani događaj čim se taj događaj desi, a ne onda kad bi to njemu
odgovaralo. To znači da se takav sustav mora sastojati od više paralelnih procesa.
Za hardverski uređaj mogu postojati fizička ograničenja, kao što su ograničenje na
raspoloživu energiju ili ograničenje na predviđeni prostor. Zato uklopljeni sustav mora
štedjeti energiju ili mora preuzeti funkciju nekih dijelova hardvera koji ne stanu u prostor.
Uklopljeni softver često stupa u neposrednu interakciju s hardverom, bez posredovanja
driver-a ili operacijskog sustava. To je potrebno zbog boljih performansi ili zbog
specifičnosti samog hardvera.
Za uklopljenog sustave izuzetno je važno da su oni pouzdani i sigurni. Naime, uklopljeni
sustavi često upravljaju uređajima čiji krivi rad bi mogao ugroziti ljude ili stvoriti velike
materijalne štete. To onda vodi do konzervativnog pristupa u razvoju, dakle do korištenja
starijih no provjerenih metoda i alata.
Uklopljeni sustav treba zamišljati kao reakcijski sustav, dakle sustav koji reagira na događaje
iz svoje okoline brzinom te okoline. Tražena vremena odziva obično su određena zakonima
fizike. To je drukčije nego kod standardnih vrsta softvera gdje sam softver upravlja brzinom
interakcije.
Vidimo da u sustavu zaštite od provalnika postoje četiri vrste podražaja: pad napona,
otvaranje vrata, otvaranje prozora te pokreti u sobi. Ovisno o kombinaciji podražaja,
proizvode se neki od sljedećih odgovora: prebacivanje napajanja s električne mreže na
akumulatorsku bateriju, aktiviranje alarma, paljenje svjetala, slanje sintetizirane glasovne
poruke policiji preko telefona.
Ponašanje uklopljenog sustava zorno se može modelirati UML state machine dijagramom.
Naime podražaji (događaji) na koje sustav reagira obično uzrokuju prelazak sustava iz jednog
stanja u drugo. U odjeljku 2.3.4 na slici 2.22 već smo imali dijagram koji prikazuje rad
mikrovalne pećnice. Sad kao drugi primjer prilažemo Sliku 3.46 – na njoj je state machine
dijagram za benzinsku pumpu.
Podražaj Odgovor
Otvorila su se jedna vrata ili prozor ili Pokreni alarm, upali svjetlo na odgovarajućem
je opažen pokret u jednoj sobi. mjestu u zgradi.
Otvaranje vrata, otvaranje prozora ili Pokreni alarm, upali svjetlo na odgovarajućem
pokreti istovremeno na dva ili više mjestu, pošalji sintetiziranu glasovnu poruku
mjesta u zgradi. policiji telefonom.
Timeout
Čitanje Inicijalizacija
Validacija
Čekanje Spremna Točenje
Do: provjeri
Do: prikazuj Do: toči gorivo,
valjanost
dobrodošlicu Brizgalica ažuriraj prikaz
kreditne kartice
aktivirana
Resetiranje Zaustavljena
Do: prikaži
poruku o greški
Plaćanje
Do: tereti
Potvrda plaćanja kreditnu Cijev u držaču
karticu
Slika 3.46: UML state machine dijagram za sustav koji upravlja benzinskom pumpom.
Proces oblikovanja uklopljenog sustava drukčiji je nego za obične vrste softvera [14]. Prvi
korak obično se sastoji od donošenja odluke koje od funkcionalnosti će se implementirati u
softveru a koje u hardveru. Ograničenja na energiju i prostor prilično sužavaju projektantovu
slobodu, tako da klasični proces dekompozicije većih dijelova u manje obično nije primjenjiv.
Kao što smo već rekli, uklopljeni sustav sastoji se od više paralelnih procesa, svaki o njih
prati jedan ili više senzora odnosno upravlja s jednim ili s nekoliko aktuatora. Općeniti model
arhitekture prikazan je na slici 3.47. Veza između procesa koji odgovaraju jednom senzoru
odnosno jednom aktuatoru detaljnije je prikazana na slici 3.48.
Podražaji
Uklopljeni sustav
(sustav u realnom vremenu)
Odgovori
Senzor Aktuator
Podražaj Odgovor
Praćenje Obrada Upravljanje
senzora podataka aktuatorom
Općenita arhitektura sa slike 3.47 dalje se može profiniti tako da bolje odgovara nekim
posebnim vrstama uklopljenih sustava. U nastavku ćemo promatrati tri takva profinjenja.
Prikaz
Senzori
Vrijednosti Vrijednosti
Proces iz senzora Proces analize za prikaz Proces
promatranja podataka prikazivanja
Proces Proces za
alarmiranja poduzimanje akcije
Primjer uklopljenog sustava koji bi mogao koristiti ovakvu arhitekturu je prije spominjani
sustav za zaštitu od provalnika. Jedna varijanta njegove građe bit će priokazana u sljedećem
odjeljku na slici 3.55. Dakle, sustav prati nekoliko vrsta senzora koji bilježe pokrete u
sobama, otvaranje vrata ili prozora, pad napona u električnoj mreži. Kad sustav posumnja na
prisutnost provalnika, on automatski zove policiju, pali svjetla u sobama i svira alarm. U
slučaju pada napona također se uključuje pomoćno napajanje iz akumulatora.
Upravljanje okolinom. Koristi se za sustave koji upravljaju radom nekog uređaja na osnovi
podražaja iz okoline tog uređaja. Struktura je vidljiva na slici 3.50.
Prikaz
Senzori
Vrijednosti Vrijednosti
Proces iz senzora Proces analize za prikaz Proces
promatranja podataka prikazivanja
Upravljačke Stanje
naredbe aktuatora
Aktuator
Senzor pritiska
Kočnica 1 na pedalu Kočnica 2
Nadgledanje
pedale kočnice
Upravljanje Upravljanje
kočnicom 1 kočnicom 2
Proces analize
podataka
Cjevovod procesa. Koristi se za sustave koji skupljaju podatke iz okoline i zatim ih obrađuju
ili transformiraju. Budući da podaci stižu velikom brzinom, obrada također mora biti brza,
inače bi se dio podataka mogao izgubiti. Zato se obrada razbija u niz zasebnih transformacija.
Svaku od tih transformacija obavlja posebni procesor ili procesorska jezgra, što znači da se
pojedine faze obrade odvijaju paralelno. Arhitektura cjevovoda prikazana je na slici 3.52.
Proizvedeni Podaci za
Proces podaci Proces potrošača Proces
...
proizvođač međuspremnik potrošač
Prikaz
Senzori za
neutronski fluks Identifikator
senzora i
vrijednost Pohranjivanje
fluksa Međuspremnik
A/D konverter za sirove prosječnih
vrijednosti razina
Prosječne
razine
Obrada sirovih fluksa Međuspremnik za
vrijednosti fluksa prosječne razine
Primjer uklopljenog sustava koji bi mogao koristiti cjevovod procesa jest sustav za skupljanje
podataka unutar nuklearnog reaktora. Skupljaju se podaci sa senzora koji mjere neutronski
fluks (gustoću neutrona) u reaktoru. Podaci iz senzora skupljaju se u međuspremniku, pa se iz
međuspremnika izdvajaju i obrađuju. Prosječna razina fluksa prikazuje se na operatorovom
zaslonu i zatim se sprema za buduću obradu. Detaljniji prikaz građe vidi se na slici 3.53.
Rekli smo da korektnost rada uklopljenog sustava ovisi o brzini njegovog odgovaranja na
podražaje. Zato kod oblikovanja uklopljenog sustava posebnu pažnju treba posvetiti timing-u
njegovih procesa. Dakle za svaki proces treba procijeniti njegovo trajanje te predložiti način i
frekvenciju njegovog pokretanja. Analiza procijenjenih i predloženih vrijednosti treba
pokazati da će sustav biti u stanju obraditi sve podražaje i proizvesti sve odgovore na vrijeme.
Analiza timing-a posebno je složena kad sustav mora izlaziti na kraj s mješavinom periodičkih
i aperiodičkih podražaja. Budući da su aperiodički podražaji nepredvidljivi, analiza mora
počivati na pretpostavkama o vjerojatnosti njihovog pojavljivanja. Ako se te pretpostavke
pokažu krive, performanse sustava možda neće biti zadovoljavajuće.
Ipak, današnja računala su brza pa je postalo moguće većinu podražaja tretirati kao
periodičke. Dakle umjesto da podražaj implementiramo kao hardverski prekid, služimo se
brzim procesom koji opetovano u kratkim vremenskim razmacima ispituje da li je do
podražaja došlo ili nije. Zato ćemo se u nastavku koncentrirati na vremenska ograničenja za
periodičke procese.
Kao primjer vremenske analize promatrat ćemo opet sustav za zaštitu od provalnika. Popis
podražaja i odgovora već smo vidjeli na slici 3.45. No sada prilažemo i sliku 3.54 gdje su
navedeni zahtjevi vezani uz vremena odziva.
50 Hz (0,5 ms) B
U zamišljenoj građi senzor za pad napona samo je jedan. No da bi sustav bio učinkovit,
senzora za vrata, prozore odnosno pokrete mora biti više, na primjer do 20 od svake vrste, a
oni moraju biti raspoređeni na raznim mjestima u zgradi. Proces zadužen za otkrivanje
podražaja određene vrste redom prati sve odgovarajuće senzore, ali tako da pri jednom
pokretanju gleda samo jedan senzor.
Na slici 3.55 je za sve procese osim testnog također navedeno vrijeme jednog izvršavanja u
najgorem slučaju. Procesi za praćenje senzora vrlo su jednostavni, svode se na čitanje i
usporedbu jednog podatka, zato su njihova vremena vrlo kratka i iznose 0,5 ms. Glavni
kontrolni proces ima nešto više posla jer mora provjeriti više podataka i donijeti odluke, zato
je njegovo vrijeme 1ms. Procesi koji upravljaju aktuatorima još su zahtjevniji, pa traju 5, 10
ili čak 20 ms. Kod periodičkih procesa frekvencije su konzistentne s vremenima izvršavanja,
dakle proces završava prije trenutka kad bi se ponovo morao pokrenuti.
96 PMF – Matematički odsjek
Softversko inženjerstvo - skripta
Lako je provjeriti da sustav na slici 3.55 zadovoljava vremenske zahtjeve sa slike 3.54. Kao
primjer, analizirat ćemo učestalost provjere vrata. Proces za praćenje senzora za vrata ima
frekvenciju 50 Hz, što znači da se pokreće svakih 20 ms. No senzora za vrata ima do 20, pa se
isti senzor ponovo gleda tek nakon 20 pokretanja procesa. Dakle između dvije provjere istih
vrata može proteći 400 ms, no to je još uvijek manje od traženih 500 ms. Slična analiza vrijedi
i za prozore i pokrete.
Primijetimo da proces za praćenje napona ima vrlo visoku frekvenciju 250 Hz – to je nužno
da bi se prebacivanje napajanja na bateriju stiglo izvesti u traženom roku od 50 ms. Zaista,
frekvencija od 250 Hz znači da se napon provjerava svakih 4 ms. No da bi se otkrio pad
napona potrebne su dvije provjere i usporedba izmjerenih vrijednosti, što traje 9,5 ms. Nakon
tog otkrića treba pričekati da se pokrene i izvrši glavni kontrolni proces, što može potrošiti
daljnjih 5 ms. Glavni kontrolni proces pokrenut će proces za prebacivanje napajanja koji traje
20 ms. Dakle odgovor sustava proizvest će se u 33,5 ms, a to je unutar traženih 50 ms.
Kad bi proces za praćenje napona radio na sporijoj frekvenciji od 50 Hz, reakcija na pad
napona bila bi prespora. Naime, tada bi dva mjerenja i usporedba vrijednosti trajala 40,5 ms, a
rad glavnog kontrolnog procesa i procesa za prebacivanje napajanja zahtijevao bi daljnjih 25
ms, pa bi ukupno vrijeme odziva bilo barem 65,5 ms.
Nakon što smo implementirali sve procese, njihov istovremeni rad i međusobna suradnja
ostvaruju se uz pomoć real-time operacijskog sustava (RTOS) [16]. Za razliku od
standardnog operacijskog sustava poput Linux-a ili Microsoft Windows-a, RTOS je manji i
jednostavniji, no on omogućuje finiju kontrolu izvršavanja procesa. Za svaki proces moguće
je zadati način kako se on pokreće te frekvenciju njegovog uzastopnog pokretanja – RTOS će
nastojati izvršavati procese onako kako mu je zadano. Primjeri RTOS-a su Windows CE,
VxWorks, QNX i RTLinux.
Građa RTOS-a vidljiva je na slici 3.57. Dakle, RTOS se obično sastoji od sljedećih dijelova:
1. Sat koji mjeri realno vrijeme i daje informacije potrebne za periodičko pokretanje procesa.
2. Interrupt handler koji poslužuje aperiodičke zahtjeve za uslugama.
3. Scheduler koji pregledava listu procesa i bira one koji su spremni za izvršavanje.
4. Resource manager koji alocira memoriju i procesor za proces koji je spreman za
izvršavanje.
5. Dispatcher koji pokreće proces s već alociranom memorijom i procesorom.
Informacije o
načinu i frekvenciji
pokretanja procesa
Sat u realnom
Scheduler Interrupt handler
vremenu
Zahtjevi procesa
za resursima
Spremni Oslobođeni
procesi resursi
Lista spremnih
Dispatcher Lista procesora
procesa
Procesi unutar uklopljenog sustava često se moraju sinkronizirati ili moraju razmijeniti
poruke. Takve operacije nisu izravno podržane u assembleru ili C-u, pa se ostvaruju pozivima
sistemskih funkcija iz RTOS-a. Također, dešava se da dva procesa trebaju koristiti zajedničku
strukturu podataka, tako da jedan piše u strukturu a drugi čita iz nje. Tada je potrebno
osigurati međusobno isključivanje konfliktnih pisanja i čitanja, za što se opet koriste
mehanizmi iz RTOS-a, na primjer semafori [16].
4. Verifikacija i validacija
U ovom poglavlju bavimo se verifikacijom i validacijom (V&V). Riječ je o osnovnoj
aktivnosti unutar softverskog procesa kojom se nastoji utvrditi da li softver zadovoljava
specifikaciju te da li on odgovara potrebama korisnika. Prvo potpoglavlje sadrži definicije
pojmova vezanih uz V&V. Daljnja dva potpoglavlja proučavaju dvije metode verifikacije
softvera, a to su statička verifikacija odnosno testiranje.
V&V srodni su pojmovi, no među njima ipak postoji suptilna razlika. Naime.
Verifikacija (Are we building the product right?) je provjera da li softver odgovara
specifikaciji, dakle dokumentu o zahtjevima.
Validacija (Are we building the right product?) je provjera da li softver zadovoljava
„stvarnim“ potrebama korisnika.
Razlika nastaje zato što specifikacija obično ne uspijeva u potpunosti zabilježiti stvarne
potrebe korisnika.
Konačni cilj V&V je uvjeriti se da je softver dovoljno dobar i pouzdan da može poslužiti
svojoj svrsi. To ne znači da softver mora biti sasvim bez greške, već samo da on mora biti
dovoljno dobar i pouzdan za predviđeni oblik korištenja. Stupanj toleriranja grešaka ovisi o
funkciji koju softver obavlja, očekivanjima korisnika te o tržišnim uvjetima.
U nastavku ovog potpoglavlja pobliže opisujemo metode V&V te mjesto i ulogu V&V u
cjelokupnom softverskom procesu. Također naglašavamo da V&V nije isto što i
debuggiranje.
Većina autora smatra da se statičkim metodama može uz male troškove otkriti 60-90%
grešaka, nakon čega testiranje ide brže, a ukupni troškovi su manji. Znači, dvije vrste metoda
su komplementarne te se obje trebaju primjenjivati.
Statička
V&V
Prototip Testiranje
Test Test
Puštanje u Primopre-
integracije integracije
rad dajni test
sustava pod-sustava
Da bi aktivnosti V&V dale očekivane efekte, planovi testiranja trebali bi nastati već u fazi
specifikacije i oblikovanja sustava, kao što je prikazano na slici 4.2. Plan za testiranje softvera
je dokument sa sljedećim dijelovima:
opis procesa testiranja,
popis zahtjeva koji će se testirati,
Tijekom V&V otkrivaju se greške. Softver se mijenja da bi se greške popravile. Taj proces
debuggiranja često je integriran s aktivnostima V&V. Ipak, V&V i debuggiranje su različiti
procesi. Naime:
V&V je proces koji utvrđuje postojanje grešaka u softveru.
Debuggiranje je proces koji locira (otkriva uzrok) i popravlja te greške.
Rezultati
Zahtjevi Test primjeri
testiranja
Oblikuj Ponovo
Lociraj Popravi testiraj
popravak
grešku grešku program
greške
Opis procesa debuggiranja vidljiv je na slici 4.3. Debuggiranje je kreativni proces kojeg je
teško precizno opisati. Vješti programeri koji provode debuggiranje pouzdaju se u svoje
iskustvo, poznavanje čestih grešaka i poznavanje svojstava korištenog programskog jezika, pa
na taj način otkrivaju uzrok greške. Pritom programerima mogu biti od pomoći interaktivni
debugger-i kakvi postoje u lower-CASE alatima.
Vidjeli smo da se statička V&V može obavljati u raznim fazama softverskog procesa. Ipak, u
ovom potpoglavlju ograničit ćemo se na najčešći oblik takve V&V, a to je statička
verifikacija programa. Ona se svodi na analizu i pregled programskog koda, bez stvarnog
izvođenja programa. Primjenjuje se prije testiranja programa, da bi se otkrila glavnina
grešaka. Nakon toga testiranje ide znatno brže, a ukupni troškovi verifikacije su znatno manji.
U sljedeća tri odjeljka obradit ćemo tri tehnike koje spadaju u statičku verifikaciju.
Inspekcija programa prakticirala se u velikim tvrtkama poput IBM i HP tijekom 70-ih, 80-ih i
90-ih godina 20. stoljeća. Riječ je o reguliranom procesu u kojem sudjeluje grupa ljudi sa
strogo zadanim ulogama:
Sam proces odvija se u skladu sa slikom 4.4. Najvažnija faza je dobro pripremljen sastanak
(do 2 sata) na kojem inspekcijska grupa pregledava program i otkriva greške. Na sastanku se
ne raspravlja o tome kako će se greške popraviti, već je to naknadni posao autora. Moderator
u fazi nastavka odlučuje da li je potrebno ponoviti cijeli proces.
Inspekcija programa danas možda djeluje zastarjelo. Ipak, ona se zasniva na neospornoj
činjenici da programeri teško uočavaju greške u svojem vlastitom programskom kodu, no
znatno bolje uočavaju greške u tuđem programskom kodu. Ova činjenica u današnje vrijeme
je ponovno došla do izražaja u agilnoj metodi XP. Naime, programiranje u paru unutar XP
može se shvatiti kao vrsta uzajamne inspekcije, gdje dva programera jedan drugome
pregledavaju programski kod i otkrivaju greške.
Automatska statička analiza obavlja se pokretanjem softverskih alata koji prolaze kroz izvorni
tekst programa i otkrivaju moguće greške i anomalije u tom tekstu. Skreće se pažnja na
„sumnjiva mjesta“ u programu koja bi mogla sadržavati greške. Ispisuju se poruke. Sam popis
sumnjivih situacija koje upućuju na grešku ovisi o programskom jeziku i nalikuje na popis sa
slike 4.5.
#include <stdio.h>
printarray (Anarray) {
int Anarray;
printf (“%d”, Anarray);
}
main ( ) {
int Anarray[5]; int i; char c;
printarray (Anarray, i, c);
printarray (Anarray);
}
> cc lint_ex.c
> lint lint_ex.c
Nema sumnje da za jezike poput C statička analiza predstavlja efikasnu tehniku za otkrivanje
programerskih grešaka. No u „strožim“ jezicima poput Jave samim pravilima jezika
izbjegnute su neke konstrukcije koje lako dovode do greške, na primjer sve varijable moraju
biti inicijalizirane, nema goto naredbi (pa je teže stvoriti nedostupni kod), upravljanje
memorijom je automatsko (nema pokazivača). Takav pristup sprečavanja grešaka umjesto
njihovog kasnijeg otkrivanja pokazuje se efikasnim načinom poboljšavanja pouzdanosti
programa. Zato je statička analiza u slučaju Java programa manje isplativa nego u slučaju C
programa.
Idejom formalne verifikacije intenzivno su se bavila mnoga velika imena računarstva tijekom
70-ih godina 20. stoljeća (Hoare, Dijkstra, Wirth). Ipak, u to vrijeme nije se došlo dalje od
malih akademskih primjera. Ideja se i dalje njeguje u krugovima pobornika formalnih metoda
za razvoj softvera, predmet je intenzivnog istraživanja te polako postiže sve bolje rezultate. U
posljednje vrijeme pažnju istraživača privlači varijanta formalne verifikacije koja se zove
provjera modela (model checking).
Gradnja
modela Model sustava
Kao primjer model checking-a, zamislimo da za meteorološku stanicu koju smo proučavali u
odjeljku 3.3.3 želimo dokazati da ona uvijek prije ili kasnije ulazi u stanje slanja podataka.
Tada nam kao model može poslužiti UML state machine dijagram sa slike 3.26. Provjera
svojstva svodi se na generiranje svih mogućih putova (svih mogućih nizova prijelaza) kroz
dijagram. Ako svaki od tih putova sadrži stanje „Šalje podatke“, svojstvo je dokazano. Inače
smo našli protuprimjer, dakle mogući niz prijelaza za koji svojstvo ne vrijedi. Primijetimo da
se metodama model checking-a postiže samo parcijalna verifikacija softvera: provjeravaju se
samo neka svojstva koja slijede iz specifikacije, a zanemaruju se ostala svojstva.
Ključna stvar u model checking-u je stvaranje modela programa. Ako se model stvara ručno,
to može zahtijevati previše vremena. Također, lako se može desiti da model ne odgovara u
potpunosti programu. Zato je puno bolje ako se model stvara automatski iz izvornog teksta
programa. Takvo automatsko stvaranje postoji na primjer u alatu Java Pathfinder kojeg je
razvila NASA i koji služi za verifikaciju Java programa.
Postoje razne vrste testiranja. Jedna moguća klasifikacija prikazana je na slici 4.8. Prva razina
podjele na toj slici napravljena je po kriteriju tko odnosno kada sudjeluje u testiranju.
Testiranje
Razvojno testiranje
(development testing)
Statističko testiranje
Testiranje u svrhu
otkrivanja grešaka
Testiranje dijelova
Funkcionalno testiranje
Strukturalno testiranje
Testiranje po putovima
Testiranje integracije
Testiranje izdanja
(release testing)
Testiranje zahtjeva
Testiranje scenarija
Testiranje performansi
Korisničko testiranje
(user testing)
Alfa testiranje
Beta testiranje
Primopredajno testiranje
Svaka vrsta testiranja s prve razine podjele dalje se dijeli na podvrste. Na primjer, razvojno
testiranje uključuje u sebi sljedeće dvije podvrste. One obje služe za provjeru da li softver koji
razvijamo zadovoljava zahtjeve, no razlikuju se s obzirom na vrstu zahtjeva i način biranja
test-podataka.
Testiranje u svrhu otkrivanja grešaka. Služi za provjeru funkcionalnih zahtjeva. Namjera
je otkriti odstupanja između softvera i njegove specifikacije. Ta odstupanja posljedica su
grešaka u softveru. Test-podaci su konstruirani tako da otkriju prisutnost greške, a ne tako
da simuliraju normalnu uporabu softvera.
Statističko testiranje. Služi za provjeru nekih oblika nefunkcionalnih zahtjeva. Namjera je
na primjer izmjeriti performanse softvera ili stupanj njegove pouzdanosti. Test-podaci su
odabrani tako da liče na stvarne korisničke podatke te da odražavaju njihovu stvarnu
statističku razdiobu. Obično je riječ o velikom broju slučajno odabranih test primjera, što
omogućuje statističku procjenu performansi ili pouzdanosti.
Testiranje
Testiranje integracije
dijelova
Testiranje Testiranje
dijelova integracije
Proces testiranja u svrhu otkrivanja grešaka obično se sastoji od nekoliko faza, koje uzimaju u
obzir da veliki sustav ima složenu građu. Detaljni prikaz faza vidi se na slici 4.9. Sažetiji
prikaz tih istih faza nalazi se na slici 4.10. S jedne strane testiramo sastavne dijelove softvera,
s druge strane testiramo da li su ti dijelovi na ispravan način integrirani u veće cjeline te da li
su te veće cjeline ispravno integrirane u još veće cjeline, i tako dalje. U fazi testiranja
integracije, testiranje se fokusira na interakcije između dijelova te na funkcionalnost cjeline.
Ipak, često se dešava da se u toj fazi otkrivaju i greške u dijelovima. Zbog toga se faze mogu
ponavljati. Testiranje dijelova obično provode osobe koje su razvile te dijelove, a testiranje
integracije može bit posao nezavisnog tima.
Da bi testiranje dijela softvera bilo uspješno, važno je znati odabrati test podatke. U nastavku
ćemo promatrati nekoliko pristupa koji se razlikuju po načinu odabira test podataka.
Ulazni
Ie
podaci
Testirani dio
softvera
Izlazni
Oe
rezultati
Kao ilustraciju, promatramo proceduru za traženje elementa Key u polju T koja bi trebala
zadovoljavati specifikaciju sa slike 4.12. Procedura vraća odgovor Found da li je Key
pronađen u T te indeks L na kojem se Key nalazi u T. Iz same specifikacije, jasno je da
domenu možemo podijeliti na dvije klase:
ulazi gdje je Key zaista element polja T (Found = true);
ulazi gdje Key nije element polja T (Found = false).
Dalje, iskustva u radu s poljima govore nam da treba probati:
polje T s ekstremnom duljinom, u ovom slučaju s jednim elementom;
element Key na rubovima odnosno na sredini polja T.
Kad kombiniramo ova dva načina podjele domene na klase, dobivamo particiju sa slike 4.13
koja se sastoji od 6 klasa. Shodno tome, biramo 6 test-primjera koji se vide na slici 4.14.
Polje Traži se
Jedna vrijednost Element iz polja
Jedna vrijednost Element koji nije u polju
Više od jedne vrijednosti Prvi element u polju
Više od jedne vrijednosti Zadnji element u polju
Više od jedne vrijednosti Srednji element u polju
Više od jedne vrijednosti Element koji nije u polju
Kao primjer, pogledajmo na slici 4.15 implementaciju u Javi naše procedure za traženje
elementa u polju. Koristi se algoritam binarnog traženja. Sad se podrazumijeva malo stroža
specifikacija, naime polje mora biti uzlazno sortirano. Promatranjem programskog koda
uočavamo da svaki korak algoritma dijeli polje na tri dijela. Zato osim izbora elementa Key
na rubovima te na sredini polja T uvodimo i dva nova izbora: neposredno ispred i iza srednjeg
elementa u polju - vidi sliku 4.16. Nakon revizije starih test primjera (polje mora biti
sortirano) te dodavanja dvaju novih primjera dobivamo ukupno 8 test primjera sa slike 4.17.
Class BinSearch{
Element na sredini
Testiranje po putovima (path testing). Riječ je o posebnoj vrsti strukturalnog testiranja, gdje
se test primjeri biraju tako da se isproba svaki „nezavisni put“ kroz dijagram toka kontrole
testiranog dijela softvera. Dakle najprije se mora nacrtati dijagram toka kontrole dotičnog
dijela softvera. Dijagram se crta tako da se naredbe while i if - then - else prikažu obrascima
sa slike 4.18, a ostale naredbe se prikažu svaka po jednim čvorom. Uočavaju se čvorovi koji
predstavljaju „početak“ i „kraj“ toka kontrole. Testiranje po putovima zahtijeva da se
konstruiraju takvi test primjeri koji će isprobati svaki od nezavisnih putova kroz dijagram.
Nezavisni put je onaj koji ide od „početka“ do „kraja“ i prolazi bar jednim novim lukom.
ne
Uvjet Uvjet
da da ne
Za Java implementaciju binarnog traženja sa slike 4.15 odgovarajući dijagram toka kontrole
vidi se na slici 4.19. Brojevi čvorova na dijagramu odgovaraju brojevima redaka u Java kodu.
Početak toka kontrole je čvor 1 a kraj je čvor 14. Postoje 4 nezavisna puta, i to:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 14;
1, 2, 3, 4, 5, 14;
1, 2, 3, 4, 5, 6, 7, 11, 12, 5, 6, 7, 8, 9, 10, 14;
1, 2, 3, 4, 5, 6, 7, 11, 13, 5, 6, 7, 8, 9, 10, 14 ;
Ako se u test primjerima prođe svaki od ovih putova, tada smo sigurni da je:
svaka naredba bila izvršena bar jednom,
svako grananje bilo isprobano za slučaj istine i za slučaj laži.
elemArray[mid] != key
7 11
elemArray[mid] = key elemArray[mid] > key elemArray[mid] < key
8 12 13
14 10
U slučaju naše implementacije binarnog traženja lako bismo konstruirali 4 test primjera koji
odgovaraju uočenim nezavisnim putovima. No kod kompliciranijih rutina (mnogo grananja i
petlji) to bi moglo biti znatno teže. Zato se pribjegava takozvanim dinamičkim analizatorima
programa. Oni mjere broj izvršavanja pojedine naredbe tijekom testiranja. Na taj način
otkrivamo koji dijelovi programa nisu bili dovoljno testirani pa smišljamo nove test primjere.
Testiranje integracije provodi se nakon što se manji dijelovi softvera udruže u veću cjelinu.
Cilj testiranja je otkriti greške koje nastaju zato što dijelovi na pogrešan način koriste
međusobna sučelja. U skladu sa slikom 4.20, test primjeri se primjenjuju na cjelinu, a ne na
pojedine dijelove.
A B
Test primjeri
Postoje različiti tipovi sučelja između udruženih dijelova. Nabrajamo četiri tipa.
Proceduralno sučelje. Jedan dio softvera poziva proceduru koja pripada drugom dijelu
softvera.
Parametarsko sučelje. Podatak ili referenca na njega prenosi se kao parametar u pozivu
procedure iz jednog dijela softvera u drugi.
Slanje poruka. Jedan dio softvera zahtijeva uslugu od drugog dijela tako što mu pošalje
poruku. Povratna poruka uključuje rezultat izvršene usluge.
Zajednička memorija. Blok memorije dostupan je raznim dijelovima softvera. Jedan dio
sprema podatke u blok, a drugi ih čita iz bloka.
Testiranje integracije posebno je teško zato što se greške mogu pojaviti samo u iznimnim
situacijama (veliko opterećenje sustava) ili pak na neočekivanim mjestima (u sasvim drugom
dijelu softvera). Slijede općeniti naputci za testiranje integracije.
Pregledaj programski kod svakog dijela softvera i popiši sve interakcije jednog dijela s
drugim dijelovima.
U slučaju proceduralnog sučelja probaj situaciju kad procedura vraća status greške.
U slučaju parametarskog sučelja oblikuj testove koji koriste ekstremne vrijednosti
parametara.
Ako se prenašaju pokazivači (pointer-i), isprobaj primjere s nul-pokazivačima.
Ako se razmjenjuju poruke, probaj stvoriti znatno više poruka nego što se očekuje u
normalnim okolnostima.
Ako se koristi zajednička memorija, variraj redoslijed aktiviranja dijelova softvera koji
pristupaju toj memoriji.
Softverski sustavi obično sadrže nekoliko razina integracije. Na primjer: najmanje jedinke
udružuju se u module, koji se spajaju u podsustave, koji čine sustav. Zbog više razina
integracije, testiranje integracije mora se ponoviti više puta. Pritom redoslijed testiranja može
biti jedan od sljedeća dva.
Top-down: najprije se testira integracija na najvišoj razini, zatim na nižoj razini, … , na
kraju na najnižoj razini. Pritom se nepostojeći ili netestirani dijelovi s niže razine
zamjenjuju s nadomjescima - takozvanim stub-ovima. Stub ima isto sučelje kao
odgovarajući dio ali vrlo ograničenu funkcionalnost.
Bottom-up: najprije se testira integracija na najnižoj razini, zatim na idućoj višoj razini,
…, na kraju na najvišoj razini. Nisu potrebni stub-ovi jer za svaku iduću razinu integracije
već imamo implementirane i testirane sve sastavne dijelove. Ipak, potrebni su test driver-i
koji pozivaju manje dijelove softvera i simuliraju njihovu okolinu.
Dva redoslijeda testiranja integracije ilustrirana su na slikama 4.21 i 4.22.
Redoslijed
Razina 1 Razina 1 ...
testiranja
Test
driver-i
Test
driver-i
Razina N-1 Razina N-1 Razina N-1
Neki autori smatraju da je testiranje toliko važno da ono može voditi cijeli proces razvoja
softvera. Ti autori formulirali su ideju razvoja vođenog testiranjem (test-driven development)
[17]. Riječ je o pristupu gdje se testiranje isprepliće s razvojem programskog koda. Dakle kod
se razvija na inkrementalan način zajedno s testovima za taj inkrement. Nema pomaka na
idući inkrement sve dok trenutna verzija koda ne prođe test.
Razvoj softvera vođen testiranjem sastavni je dio agilnih metoda poput XP [10] i tamo se
zove test-first development. No isti pristup može se uklopiti i u klasične metode. Proces
razvoja vođenog testiranjem ilustriran je slikom 4.23.
Identificiraj prošao
novu
funkcionalnost
nije Implementiraj
prošao
Napiši test Izvrši test funkcionalnost
uz refactoring
Kao što vidimo na slici 4.23, razvoj vođen testiranjem sastoji se od sljedećih koraka.
1. Identificira se novi inkrement funkcionalnosti. On treba biti relativno mali, tako da se
može implementirati u nekoliko desetaka redaka koda.
2. Piše se test za tu funkcionalnost te se taj test implementira pomoću CASE alata za
automatsko testiranje.
3. Nad trenutnom verzijom softvera izvršava se novi test zajedno sa svim prijašnjim
testovima koji su bili implementirani ranije. U prvom pokušaju novi test neće proći budući
da nova funkcionalnost još nije bila implementirana.
4. Sad se tek implementira nova funkcionalnost i ponovo se izvršava test. Implementiranje
može uključiti i refactoring postojećeg koda.
5. Nakon što novi testovi uspješno prođu, moguće je nastaviti s implementacijom idućeg
komada funkcionalnosti.
PMF – Matematički odsjek 115
Robert Manger
Prema mišljenju njegovih pobornika, razvoj vođen testiranjem ima sljedeće prednosti.
Bolje razumijevanje koda. Pisanjem testa programer bolje artikulira svoju ideju o tome što
bi idući segment koda trebao raditi.
Bolja pokrivenost koda testovima. Osigurano je da za svaki komad koda postoji
odgovarajući test. Sigurni smo da će se svi dijelovi koda izvršiti prilikom testiranja.
Testiranje unatrag. Skup testova postepeno se razvija zajedno sa sustavom. Nakon svake
promjene programskog koda moguće je odmah izvesti sve stare testove i provjeriti da
promjena nije narušila staru funkcionalnost.
Jednostavnije debuggiranje. Kad test ne prođe, očito je da se uzrok nalazi u novom dijelu
koda – njega treba provjeriti i promijeniti. Nisu potrebni alati za debuggiranje.
Dokumentiranje sustava. Sami testovi služe kao vrsta dokumentacije koja opisuje što bi
programski kod trebao raditi. Čitanje testova omogućuje lakše razumijevanje koda.
Slično kao i agilne metode, razvoj vođen testiranjem za sada se pokazao uspješnim kod malih
ili srednje velikih projekata.
5. Održavanje i evolucija
Nakon puštanja u uporabu, softverski sustav mora se i dalje mijenjati. Promjene softvera
nužne su da bi se držao korak s novim korisničkim zahtjevima, promjenama poslovnog
okruženja, napretkom hardvera i tako dalje. U sljedećim potpoglavljima najprije govorimo
općenito o dva osnovna načina mijenjanja softvera, a to su održavanje odnosno evolucija.
Zatim detaljnije proučavamo organizirani proces održavanja koji se obično naziva upravljanje
konfiguracijom. Na kraju se bavimo specifičnom problematikom mijenjanja zastarjelog
(baštinjenog) softvera.
Proces mijenjanja softvera nazivamo održavanje odnosno evolucija. Za neke autore ove dvije
riječi su sinonimi, s time da je prva tradicionalna i posuđena iz tehnike, a druga je novija i
točnija. Mi ćemo pod održavanjem podrazumijevati planirani rutinski dio procesa koji
se sastoji od manje radikalnih promjena, dok će evolucija označavati ukupni proces s
nepredvidivim elementima koji može dovesti do bitnih promjena u arhitekturi softvera i
korištenoj tehnologiji. U odjeljcima koji slijede najprije objašnjavamo razlike između raznih
vidova mijenjanja softvera. Zatim detaljnije govorimo o vrstama i dinamici održavanja te o
cijeni održavanja. Na kraju raspravljamo o održavanju unutar agilnih metoda razvoja softvera.
Prema autoru Warrenu [31], postoje sljedeće tri strategije mijenjanja softvera koje se
međusobno dopunjuju.
Održavanje softvera. Promjene se rade zato da bi se držao korak s (promijenjenim)
zahtjevima. Mijenja se funkcionalnost, no struktura softvera uglavnom ostaje ista.
Arhitekturna transformacija. Riječ je o značajnoj promjeni arhitekture softverskog
sustava. Na primjer, sustav se iz centralizirane mainframe arhitekture prebacuje u
distribuiranu arhitekturu s klijentima i poslužiteljima. Funkcionalnost se može ili ne mora
promijeniti.
Softversko reinženjerstvo. Ne dodaje se nikakva nova funkcionalnost. Također, nema
velike promjene u arhitekturi. Umjesto toga, sustav se transformira u oblik koji se lakše
može razumjeti i dokumentirati te obrađivati raspoloživim alatima. Na primjer,
programski kod se automatski prebacuje iz jednog (zastarjelog) programskog jezika u
drugi (suvremeni).
Održavanje softvera je kontinuirani rutinski proces koji se svodi na niz uzastopnih promjena.
Kao rezultat održavanja nastaje velik broj različitih verzija softvera, od kojih svaka
predstavlja nešto drukčiju konfiguraciju sastavnih dijelova. Cijeli proces treba pažljivo
planirati i kontrolirati. Također je neophodno imati točnu evidenciju svih verzija i njihovih
konfiguracija. Skup potrebnih metoda, alata i organizacijskih zahvata naziva
se upravljanje konfiguracijom i bit će opisan u potpoglavlju 5.2.
Autori Lehman i Belady [32] objavili su empirijska istraživanja dinamike održavanja softvera.
Istraživanja sugeriraju da vrijede sljedeći, takozvani Lehmanovi „zakoni“.
1. Nužnost mijenjanja. Softver koji se zaista koristi u stvarnom svijetu nužno se mora
mijenjati jer u protivnom ubrzo postaje neuporabljiv.
2. Povećavanje složenosti. Dok se softver mijenja, njegova struktura teži tome da postane
sve složenija. Da bi se očuvala jednostavnost strukture, potrebno je uložiti dodatni trud i
resurse.
3. Ograničena brzina unapređivanja. Količina novosti koju pojedino izdanje softvera može
donijeti otprilike je konstantna i karakteristična je za taj softver.
Prvi i drugi Lehmanov zakon dovoljno su razumljivi bez dodatnih komentara. Treći zakon
znači da ako u jednom izdanju unesemo previše novosti, unijet ćemo i mnogo novih grešaka,
pa će iduće izdanje morati biti posvećeno ispravljanju tih grešaka, a prosječna količina
novosti po izdanju vratit će se na svoju normalnu vrijednost. Konstanta iz trećeg zakona
određena je procesom polaznog razvoja softvera i ne može se naknadno popraviti. Znači, ako
je proces razvoja bio kvalitetniji, stvorit će se softver koji je pogodniji za održavanje, pa će
konstanta biti veća, to jest dopuštat će veću brzinu kasnijeg unapređivanja softvera.
Ukupna cijena održavanja softvera dostiže i prelazi cijenu njegovog polaznog razvoja. Cijenu
održavanja možemo smanjiti opet tako da povećamo kvalitetu originalnog razvojnog procesa.
Uz veću kvalitetu cijena razvoja će biti veća, ali će se stvoriti softver koji je jeftiniji za kasnije
održavanje. Ova ideja ilustrirana je slikom 5.1.
Manje
sustav 1 kvalitetan Skuplje održavanje
razvoj
Klasične metode razvoja prave jasnu razliku između originalnog razvoja softvera i njegovog
kasnijeg održavanja. Kod agilnih metoda zapravo nema jasne razlike. Naime.
Razvoj se ionako promatra kao beskonačni niz iteracija u kojima se softver stalno mijenja
i usklađuje sa zahtjevima.
Prve iteracije u tom nizu mogu se smatrati originalnim razvojem.
Kasnije iteracije odgovaraju održavanju.
PMF – Matematički odsjek 119
Robert Manger
Najpoznatija agilna metoda XP odlikuje se raznim osobinama koje smo opisali u odjeljku
1.3.3. Neke od tih osobina posebno su zanimljive i korisne sa stanovišta održavanja. Zaista:
Korisničke priče, koje prvo služe za izražavanje početnih zahtjeva, kasnije mogu služiti za
opis zahtjeva za promjenama.
Stalna uključenost korisnika u razvojni proces omogućuje da se ispravno odredi prioritet
promjena tijekom održavanja.
Tehnika test-first development rezultira velikim brojem testova koji omogućuju
automatsku provjeru ispravnosti softvera nakon svake promjene tijekom održavanja.
Reorganizacija programskog koda takozvanim refactoring-om može se shvatiti kao
preventivno održavanje, dakle kao investicija u kvalitetu softvera u svrhu njegovog lakšeg
kasnijeg mijenjanja.
U skladu s agilnim metodama, održavanje nije ništa drugo nego nastavak agilnog razvojnog
procesa. Ipak, poteškoće mogu nastupiti onda kad se originalnim razvojem softvera bavio
jedan tim, a održavanje se prepušta nekom drugom timu. Postoje dvije problematične
situacije.
1. Ako je razvojni tim koristio agilni pristup, a tim za održavanje nije tome vičan pa želi
raditi na klasičan način. Timu za održavanje tada će nedostajati detaljna dokumentacija
sustava.
2. Ako je razvojni tim koristio klasični pristup, no tim za održavanje preferira agilne metode.
Tada tim za održavanje mora potrošiti dosta vremena za razvoj nedostajućih
automatiziranih testova.
Tijekom svog životnog vijeka softverski sustav se održava. Kao rezultat tog održavanja
nastaju brojne verzije sustava. Svaka verzija može se promatrati kao nešto drukčija
konfiguracija sastavnih dijelova. Da bismo mogli izaći na kraj sa svim tim konfiguracijama,
potrebna nam je posebna aktivnost koji se naziva upravljanje konfiguracijom. U sljedećim
odjeljcima najprije ćemo opisati svrhu upravljanja konfiguracijom te njegovu podjelu na
podaktivnosti. Zatim ćemo detaljnije opisati svaku od podaktivnosti.
Upravljanje konfiguracijom potrebno je kod velikih sustava gdje postoji velik broj različitih
verzija koje su istovremeno u razvoju ili u uporabi. Pojedine verzije implementiraju pojedine
prijedloge za promjenama, popravke grešaka te prilagodbe različitim hardverima ili
operacijskim sustavima. Kad se ne bi služili odgovarajućim pravilima, postupcima i alatima,
lako bi nam se moglo desiti da izgubimo evidenciju o tome koje promjene ili dijelovi su bili
ugrađeni u koju verziju sustava. Također bi nam se moglo desiti da počnemo mijenjati krivu
verziju, ili da krivu verziju isporučimo korisnicima, ili da zaboravimo gdje je pohranjen
izvorni kod za neku određenu komponentu. Osim evidencije o promjenama i verzijama,
sustav za upravljanje konfiguracijom mora također omogućiti timski rad većeg broja (možda
dislociranih) programera, tako da oni mogu raditi svoje promjene bez da jedan drugom
smetaju.
Zahtjevi za
promjenama
Gradnja
sustava
Upravljanje
promjenama
Upravljanje Upravljanje
verzijama izdanjima
Upravljanje promjenama počinje kad korisnik ili član tima za podršku korisnicima pošalje
zahtjev za promjenom. To na primjer može biti izvještaj o bug-u s opisom simptoma ili
zahtjev za dodatnom funkcionalnošću. Zahtjev za promjenom obično se oblikuje
ispunjavanjem predviđenog obrasca koji je danas obično u elektroničkom obliku. Korisnik
ispunjava samo neka polja u tom obrascu, a u postupku obrade zahtjeva te donošenja odluke
odgovorne osobe ispunjavaju dodatna polja. Na taj način u svakom trenutku je vidljivo
trenutno stanje zahtjeva. Primjer djelomično ispunjenog obrasca vidi se na slici 5.4.
Nakon što je zahtjev bio poslan, odgovorna osoba iz tima za podršku korisnicima provjerava
je li on valjan. Provjera je potrebna zato što su mnogi zahtjevi takvi da ne zahtijevaju akciju.
Na primjer, isti bug možda je već bio prijavljen. Ili je možda riječ o nesporazumu o tome što
sustav treba raditi. Ili se zahtijeva funkcionalnost koja je već implementirana no korisnik to ne
zna. U svim ovakvim slučajevima, zahtjev se zatvara s time da se u obrazac prethodno upisuje
razlog zatvaranja. No ako je riječ o valjanom zahtjevu, on se stavlja na listu aktivnih
neriješenih zahtjeva koji čekaju daljnju analizu.
Sljedeća faza u obradi valjanog zahtjeva je tehnička procjena opsega i cijene tražene
promjene. To obično radi tim za razvoj i održavanje softvera. Proučava se utjecaj promjene na
ostatak sustava, to jest utvrđuje se koji sve dijelovi sustava su pogođeni promjenom. Ako
jedna promjena zahtijeva i niz promjena na drugim mjestima, to će povećati njenu cijenu.
Nakon tehničke procjene opsega i cijene, posebna grupa odgovornih osoba odlučuje je li
promjena svrsishodna i isplativa s poslovnog stanovišta. Ta grupa obično se naziva change
control board (CCB) i ona treba razmotriti sve netrivijalne promjene te odrediti prioritete.
Odobrene promjene vraćaju se timu za razvoj i održavanje, a odbijeni zahtjevi se zatvaraju i
arhiviraju. Sitne korekcije bug-ova automatski se odobravaju.
Važni faktori koje treba uzeti u obzir kod odobravanja ili neodobravanja neke promjene su
sljedeći.
Posljedice neimplementiranja promjene.
Korisnost od promjene.
Broj korisnika kojih se tiče promjena.
Cijena implementiranja promjene.
Razdoblje proteklo od posljednjeg izdanja (ne valja prečesto).
Zadnji dio upravljanja promjenama sastoji se od implementacije same promjene unutar nove
verzije softvera. To radi tim za razvoj i održavanje. Čim softver nakon implementacije
uspješno prođe testove, zahtjev za promjenom se zatvara.
Pošalji Provjeri
zahtjev zahtjev
nevaljan valjan
Razvoj i održavanje
Analiza
implemen-
Change tacije
Control Board
Poslovna Procjena
procjena opsega i
cijene
Odobravanje Promjena
promjene softvera
odob-
reno Testiranje
nije softvera
odobreno
Zatvori prošao
zahtjev nije
prošao
Zatvori
zahtjev
Zahtjev za promjenom
Kad razvojni tim mijenja neki dio softvera (funkciju, klasu, modul), potrebno je o tome voditi
evidenciju. Uobičajeni način je pratiti povijest promjena u obliku standardiziranog komentara
na početku izvornog programskog koda tog dijela. Primjer takvog komentara vidljiv je na slici
5.5.
Codeline (B)
L1 L2 Ex1
B B1.1 B1.2 B1.3
Baseline – V2
Codeline (C)
L1 L2 Ex2
Biblioteke i vanjske komponente
L1 L2 Ex1 Ex2
Mainline
Niz verzija izvornog koda gdje su kasnije verzije izvedene iz prethodnih verzija naziva se
codeline. Jedan codeline u pravilu odgovara jednom dijelu sustava (funkciji, klasi, modulu,
komponenti, … ), što znači da za jedan te isti dio imamo više verzija. Skup verzija dijelova i
pomoćnih biblioteka koje se mogu kombinirati u cjelovit sustav naziva se baseline. Jedan
baseline dakle odgovara jednoj verziji sustava. Na slici se vidi da različiti baseline-i koriste
različite verzije dijelova iz pojedinih codeline-a. Niz verzija sustava (dakle niz baseline-a)
razvijenih iz nekog polaznog baseline-a naziva se mainline.
Datum stvaranja
Niz verzija
Izvorni tekst
D1 D2 D3 za V1.3
Način pohranjivanja
Stariji alati za upravljanje verzijama najviše su pažnje posvećivali kompaktnoj pohrani. Kod
današnjih alata najvažnije je podržati nezavisni razvoj. Način na koji se omogućuje
nesmetani istovremeni rad više programera prikazan je na slici 5.8. Kao što vidimo, alat za
upravljanje verzijama sve verzije svih dijelova pohranjuje u zajednički repozitorij. Da bi
izvršio neke promjene, programer mora „izvaditi“ (check-out) dijelove iz repozitorija i
kopirati ih u svoj radni prostor. Nakon izvršenih promjena, programer „vraća“ (check-in)
promijenjene dijelove iz svog radnog prostora u repozitorij.
A B X Y
Alice Bob
C C
A B C Z X R
Slika 5.8. prikazuje konkretnu situaciju gdje dva programera Alice i Bob mijenjaju isti dio
softvera C. Te istovremene promjene neće jedna drugoj smetati. Naime, prilikom vraćanja C-a
u repozitorij, alat će ono što vraća Alice pretvoriti u novu verziju s novim identifikatorom, a
ono što vraća Bob u još noviju verziju s još novijim identifikatorom. Tako će na kraju u
repozitoriju postojati tri verzije za C (stara i dvije nove).
Codeline 2.1
<branch>
V2.1.1 V2.1.2
Codeline 2
<merge>
V2.0 V2.1 V2.4
Posljedica ovakvog nezavisnog mijenjanja istog dijela softvera je da se codeline može granati.
Umjesto linearnog niza verzija može postojati više nezavisnih grana, kao što je prikazano na
slici 5.9. U nekim situacijama potrebno je napraviti naknadno spajanje grana, to jest stvoriti
novu verziju koja uključuje sve promjene. Na slici 5.9, vidi se da je verzija 2.4 dobivena je
kombiniranjem verzija 2.1.2 i 2.3. Spajanje se obično ne može napraviti sasvim automatski
već programer mora ručno prilagoditi obje verzije da bi ih učinio kompatibilnima.
check_in
check_out
(co) Sustav za Poslužitelj
co
upravljanje za gradnju
verzijama
Kao što se vidi na slici 5.10, gradnja sustava je složeni proces budući da su u njega uključene
tri platforme.
1. Platforma za razvoj na kojoj programer mijenja i testira programski kod (obično radna
stanica).
2. Platforma na kojoj rade alat za upravljanje verzijama i alat za gradnju (obično mrežni
poslužitelj).
3. Ciljna platforma na kojoj će se izvršavati izgrađeni sustav.(na primjer mobitel ili procesor
u perilici rublja).
Rad alata za gradnju sustava detaljnije je prikazan na slici 5.11. Vidimo da za gradnju nije
dovoljan samo izvorni kod programa, nego su također potrebne biblioteke potprograma,
datoteke s podacima (na primjer datoteka s porukama o greškama), konfiguracijske datoteke,
zbirke testova i drugo. Također, moraju biti dostupni odgovarajući prevodioci (compiler-i) i
povezivači (linker-i). Jedan od prvih alata za gradnju sustava bio je UNIX-ov make, no po
današnjim kriterijima on je već zastario. Neki od novijih alata su Apache Ant, Microsoft
Build, Rational ClearMake i drugi.
Datoteke s Konfigu-
Izvršivi
izvornim racijske testovi
kodom datoteke
Automatizirani
Datoteke s Izvršivi ciljni
sustav za
podacima sustav
gradnju
Prevoditelji i Rezultati
Biblioteke
povezivači testova
Kod klasičnih metoda održavanja, mnoge od nastalih verzija sustava zapravo se ne isporučuju
korisnicima budući da donose premalo promjena. Verzija koja se daje na uporabu korisnicima
naziva se izdanje. Postoje dvije vrste izdanja.
1. Veliko izdanje (major release). Donosi značajnu novu funkcionalnost. Obično se
naplaćuje korisnicima.
2. Malo izdanje (minor release). Popravlja greške iz prethodnog izdanja. Obično se šalje
korisnicima kao update bez naplate.
Odluka o pretvaranju određene verzije sustava u izdanje važna je poslovna odluka. Nju
donose menadžeri softverske kuće uzimajući u obzir sljedeće faktore.
Tehnička kvaliteta sustava. Ako u aktualnom izdanju postoje ozbiljne greške, potrebno je
hitno objaviti novo ispravljeno izdanje.
Promjena u platformi. Ako se pojavilo novo izdanje operacijskog sustava, potrebno je i za
aplikacijski sustav stvoriti novo prilagođeno izdanje.
Lehmanovi zakoni. Nakon izdanja s mnogo nove funkcionalnosti mora brzo slijediti
izdanje koje popravlja greške i poboljšava performanse.
Držanje koraka s konkurencijom. Ako je konkurencija u svojem proizvodu uvela novu
funkcionalnost, moramo našim korisnicima što prije ponuditi istu funkcionalnost.
Zahtjevi marketinga. Odjel marketinga može zahtijevati da se novo izdanje pojavi do
određenog datuma, na primjer do Božića.
Korisnički zahtjevi. Kod sustava koji se rade po narudžbi, ako su korisnici postavili
određene zahtjeve za promjenama i platili za njih, tada se novo izdanje s implementiranim
promjenama mora isporučiti što prije.
Ritam izdavanja. Izdanja ne smiju biti ni prečesta ni prerijetka. Ako su prečesta, korisnici
ih neće instalirati jer im to uzima vrijeme. Ako su prerijetka, korisnici bi mogli prijeći na
konkurentske proizvode.
Novo izdanje sustava mora biti pripremljeno na dovoljno općenit način, tako da se može
instalirati u svim predvidivim situacijama. Na primjer, zamislimo da imamo ovakav scenarij.
1. Prvo izdanje sustava bilo je distribuirano korisnicima i koristilo se neko vrijeme.
2. Drugo izdanje stvorilo je potrebu za instalacijom nove datoteke s podacima.
3. Treće izdanje zahtijeva datoteku instaliranu s drugim izdanjem.
Tada postupak instalacije trećeg izdanja ne smije pretpostaviti da je datoteka s podacima već
instalirana. Naime, neki korisnici možda su preskočili drugo izdanje te s prvog odmah prelaze
na treće. Dakle, datoteka se mora ponovo distribuirati i instalirati s trećim izdanjem.
Isporuka novog izdanja korisnicima izvodi se na razne načine ovisno o vrsti softvera i vrsti
izdanja. Kompanije poput Microsoft, Adobe ili Apple velika izdanja svojih generičkih
proizvoda prodaju u kutijama preko tradicionalnih trgovačkih kanala, a mala izdanja
dostavljaju besplatno preko Interneta u obliku automatskih update-a. Isporuka specijaliziranih
softverskih produkata teže se može automatizirati budući da su takvi produkti kod svakog
korisnika konfigurirani na nešto drukčiji način.
Baštinjeni sustav obično je bio razvijen prije 20-30 godina te je kasnije bio mijenjan. U
originalnom razvoju koristila se neka od funkcionalno-orijentiranih metoda za razvoj softvera.
Zato imamo sljedeće osobine.
Sustav se sastoji od više programa i zajedničkih podataka koje koriste ti programi. Podaci
se čuvaju u datotekama ili pomoću (zastarjelog) sustava za upravljanje bazom podataka.
Pojedini program unutar sustava oblikovan je funkcionalnim pristupom i sastoji se od
funkcija koje komuniciraju preko parametara i globalnih varijabli.
U slučaju poslovnih primjena, sustav se obično svodi na „batch“ obradu ili obradu
transakcija. U oba slučaja, opća organizacija je s skladu s modelom „ulaz-obrada-izlaz“
koji je već bio spomenut u odjeljku 3.2.2.
Sustav je implementiran u zastarjelom programskom jeziku koji današnji programeri ne
razumiju te za koji više nema prevoditelja.
Dokumentacija sustava je dijelom izgubljena ili neažurna. U nekim slučajevima jedina
dokumentacija je izvorni programski kod. Ima slučajeva kad je čak i izvorni kod izgubljen
te jedino postoji izvršiva verzija programa.
Bolje
Postojeći Razumijevanje i strukturirani i softversko
sustav transformacija razumljiviji re-inženjerstvo
sustav
Reverzno
inženjerstvo
Modularizacija Podatkovno
programa re-inženjerstvo
Prevođenje
izvornog koda
Poboljšanje
strukture
programa
Strukturirani Reorganizirani
program podaci
Kao primjer poboljšanja strukture programa pogledajmo sliku 5.14. Riječ je o nestrukturiranoj
verziji kontrolera sustava za grijanje. Kod je gotovo nemoguće razumjeti zbog brojnih goto
naredbi – to je takozvana „špageti logika“. Nakon reinženjerskog zahvata, dobili smo znatno
razumljiviju verziju sa slike 5.15. Ovakav zahvat moguće je obaviti uz pomoć automatskog
alata, koji najprije konstruira dijagram toka kontrole originalne „goto“ verzije, a zatim
realizira taj dijagram uz pomoć if i while naredbi.
Loop
--The Get statement finds values for the given variables from
-- The system's environment
Get (Time-on, Time-off, Time, Setting, Temp, Switch) ;
case Switch of
when On => if Heating-status = off then
Switch-heating; Heating-status := on ;
end if ;
when Off => if Heating-status = on then
Switch-heating; Heating-status := off ;
end if ;
when Controlled =>
if Time >= Time-on and Time <= Time-off then
if Temp > Setting and Heating-status = on then
Switch-heating; Heating-status := off ;
elsif Temp < Setting and Heating-status = off then
Switch-heating; Heating-status := on ;
end if ;
end if ;
end case ;
end loop ;
postaje
Program 2 Program 7
Sustav za
upravljanje
bazom Logički i
Program 1 podataka fizički modeli
podataka
Slika 5.16 ilustrira ideju o zamjeni datoteka sa zajedničkom bazom podataka. Programi u
polaznom sustavu koristili su klasične datoteke u kojima je postojala redundancija i
nekonzistentnost, i od kojih je svaka bila optimizirana za jednu aplikaciju a nepogodna za
druge. Nakon reinženjerskog zahvata imamo integriranu i konzistentnu bazu podataka koja
osim postojećih aplikacija može podjednako dobro podržati i razne buduće aplikacije. Za
ovakav zahvat potrebno je stvoriti logički model podataka, prepraviti sve programe tako da
pristupaju bazi umjesto datotekama te prebaciti podatke iz datoteka u bazu.
(terminali)
Baštinjeni (mainframe)
sustav
(mreža)
Jezgra
baštinjenog (mrežni poslužitelj)
sustava
Prezentacija
Kontrola interakcije
Aplikacijski servisi
Baza podataka
Postoje razni načini distribuiranja sustava, koji se razlikuju po načinu kako su slojevi
raspoređeni između poslužitelja i klijenata. Spektar mogućnosti ilustriran je slikom 5.20.
Slojevi koji su prebačeni na klijenta u pravilu se moraju mijenjati jer u protivnom nećemo
moći iskoristiti prednosti grafičkog sučelja. Zato distribucije gdje je sve veći broj slojeva
prebačen na klijenta postaju sve skuplje. Najjeftinije rješenje prebacuje samo prezentaciju na
klijenta, no time ne dobivamo mnogo jer se klijent tada ponaša kao emulator terminala,
pa sučelje i dalje slijedi logiku tekstualnih formulara. Najskuplje rješenje je da se sve osim
baze prebaci na klijenta - tada se poslužitelj svodi na poslužitelja baze podataka i možda se
može zamijeniti komercijalnim DBMS-om, čime bi se cijeli baštinjeni sustav izbacio iz
Klijent: prezentacija,
Klijent: prezentacija, validacija, kontrola,
Klijent: prezentacija validacija, kontrola servisi
Slika 5.20: načini raspoređivanja slojeva unutar baštinjenog sustava na klijente i poslužitelje.
Opisani načini distribuiranja sustava pretpostavljali su da polazni sustav ima jasno odijeljene
slojeve. U praksi to često nije slučaj, to jest slojeve nije moguće izdvojiti budući da su njihove
funkcije pomiješane u raznim modulima. Tada se pribjegava nešto drukčijem vidu
arhitekturne transformacije, koji je opisan slikom 5.21. Transformirana arhitektura tada se
sastoji od sljedeća tri dijela.
Baštinjeni sustav, „zamrznut“ u svom originalnom obliku, instaliran na poslužiteljskom
računalu.
Iznova razvijeno (grafičko) korisničko sučelje, koje radi kao klijent na osobnom računalu.
Posebno razvijeni „wrapper“, koji prevodi zahtjeve klijenata u interakcije s
nepromijenjenim baštinjenim sustavom. Iz perspektive klijenta, wrapper izgleda kao
poslužitelj. Iz perspektive baštinjenog sustava, wrapper izgleda kao skup tekstualnih
terminala.
(mreža)
6. Ponovna upotreba
U dosadašnjim poglavljima govorili smo o procesu razvoja softvera. Implicitno smo
pretpostavljali da je riječ o novom softveru koji nastaje za točno određenu svrhu ili za
određenu grupu korisnika. U ovom poglavlju bavimo se pitanjem kako već razvijeni softver
ponovo upotrijebiti za neku drugu svrhu ili za neke druge korisnike.
Ideja ponovne upotrebe prisutna je 40-ak godina, još od pojave prvih viših programskih jezika
i biblioteka potprograma. Ideja je također utjelovljena u modelu razvoja softvera uz ponovnu
upotrebu, koji smo zajedno s njegovim prednostima i manama opisali u potpoglavlju 1.2.
Ipak, da bi ponovna upotreba zaista bila učinkovita i isplativa, potrebne su sofisticirane
tehnike. Takve tehnike počele su se razvijati tek početkom 21. stoljeća i u ovom trenutku
predstavljaju predmet intenzivnog istraživanja. Smatra se da je ponovna upotreba jedan od
najvažnijih aktualnih trendova softverskog inženjerstva. Očekuje se da će ona u bliskoj
budućnosti donijeti bitne pomake u produktivnosti razvoja softvera.
U ovom potpoglavlju nabrojat ćemo razne tehnike koje su se s više ili manje uspjeha koristile
kao način ponovne upotrebe softvera. Također ćemo uočiti neka bitna svojstva po kojima se te
tehnike razlikuju. Raspravljat ćemo i o kriterijima za izbor pogodne tehnike ovisno o
konkretnoj situaciji.
U posljednjih 30-ak godina razvijene su brojne metode i tehnike za ponovnu upotrebu. One se
razlikuju po mnogim svojim svojstvima, na primjer po veličini dijelova softvera koji se
ponovno upotrebljavaju, ili po samoj prirodi onoga što se upotrebljava.
S obzirom na prirodu onoga što se upotrebljava, razlikujemo dvije vrste ponovne upotrebe.
1. Ponovna upotreba programskog koda ili izvršivog programa. Već napisani softver
uključuje se u novi sustav. Na primjer, može biti riječ o korištenju biblioteke,
nasljeđivanju klase, uključivanju komponente, pozivu web servisa.
2. Ponovna upotreba modela, koncepta ili dizajnerskog rješenja. Na primjer, koristi se
poznati obrazac za oblikovanje, no na osnovi njega piše se vlastiti programski kod. Ili se u
skladu s modelom grafičkog razvoja koristi već postojeći UML dijagram te se iz njega
automatski generira programski kod.
Dalje slijedi popis nekih od metoda i tehnika koje su se s više ili manje uspjeha koristile kao
oblik ponovne upotrebe.
1. Obrasci za oblikovanje. Bili su opisani u odjeljku 3.2.4. Riječ je o ponovnoj upotrebi
provjerenih generičkih rješenja za probleme oblikovanja koji se često pojavljuju u raznim
kontekstima.
2. Aplikacijski okviri. Riječ je o korištenju skupa apstraktnih ili konkretnih klasa koje treba
nadograditi ili proširiti da bi se od njih dobio željeni aplikacijski sustav. Detaljnije ćemo
obraditi u odjeljku 6.2.1.
3. Produktne linije. Mijenjanjem polazne generičke aplikacije nastaje niz sličnih konkretnih
aplikacija sa zajedničkom arhitekturom. Svaka aplikacija u nizu prilagođena je određenoj
grupi korisnika. Detaljnije ćemo obraditi u odjeljku 6.2.2.
4. Ponovna upotreba COTS produkata. Kratica COTS znači Commercial Off-the-Shelf.
Potrebe korisnika rješavaju se korištenjem pogodno konfiguriranih postojećih javno
dostupnih softverskih paketa, ili njihovim integriranjem. Primjeri COTS-a su: Microsoft
Excel, WRI Mathematica ili SAP. Detaljnije ćemo obraditi u odjeljku 6.2.3.
5. Razvoj zasnovan na komponentama. Sustav se razvija integriranjem gotovih komponenti,
dakle integriranjem dijelova koji su razvijeni baš za ponovnu upotrebu u skladu s
odgovarajućim standardima za komponente. Ovoj tehnici bit će posvećeno posebno
potpoglavlje 6.3.
6. Razvoj zasnovan na web servisima. Sustav se razvija povezivanjem servisa koji su javno
dostupni na webu i s kojima se može komunicirati preko odgovarajućih protokola. Ova
tehnika bit će tema potpoglavlja 6.4.
7. Ponovna upotreba baštinjenih sustava. Korištenjem odgovarajućih wrapper-a uspostavlja
se sučelje prema starom baštinjenom sustavu te se na taj način stari sustav ponovo koristi
u suvremenom okruženju. O ovoj tehnici već smo govorili u potpoglavlju 5.3.
8. Korištenje standardnih biblioteka. U novom sustavu koriste se funkcije ili klase iz neke
biblioteke, na primjer koristi se matematička funkcija, ili klasa koja enkapsulira
komunikaciju preko mreže, ili klasa za implementaciju rada sa stogom, i tako dalje. Ova
tehnika zapravo je najstariji oblik ponovne upotrebe i postoji već 40-ak godina.
9. Grafički razvoj softvera (model-driven engineering). O tome smo govorili u potpoglavlju
1.2. Softver se opisuje grafičkim modelom, na primjer skupom UML dijagrama.
Programski kod automatski se generira iz tog modela. Ovdje je riječ o ponovnoj upotrebi
znanja kako se pojedini element grafičkog modela treba pretvoriti u programski kod.
10. Korištenje generatora programa. U nekim usko specijaliziranim domenama postoje alati
koji iz specifikacije problema automatski generiraju odgovarajući program. Na primjer,
softveri za baze podataka za zadanu SQL tablicu mogu generirati aplikaciju koja
omogućuje ažuriranje i pretraživanje te tablice. Riječ je o ponovnom korištenju znanja o
domeni i programskih rješenja koja su ugrađena u alat.
Vidimo da postoji velik broj tehnika za ponovnu upotrebu. Postavlja se pitanje koja od njih je
najpogodnija u danoj situaciji. Pri traženju odgovora na to pitanje treba uzeti u obzir sljedeće
faktore.
Rok za isporuku rješenja korisnicima. Ako softver treba razviti u vrlo kratkom roku, tada
treba pokušati s upotrebom COTS produkata, makar to možda neće dati rješenje koje je
sasvim u skladu sa zahtjevima.
Očekivani životni vijek softvera. Ako se razvija sustav s dugim vijekom trajanja, tada se
treba koncentrirati na ostvarivanje uvjeta za lako održavanje, pa možda ipak treba pribjeći
samostalnom razvoju.
Znanje i vještina razvojnog tima. Metode ponovne upotrebe prilično su složene, pa je
potrebno dosta vremena da bi se one savladale i počele efikasno koristiti. Ako razvojni tim
već ima iskustva s nekom određenom tehnikom, tada ta tehnika treba ući u uži izbor.
Zahtjevi na pouzdanost ili na performanse. Ako se od sustava traži izuzetna pouzdanost ili
posebno dobre performanse, tada treba izbjegavati tehnike ponovne upotrebe gdje
nemamo pristup do izvornog koda. Naime, bez dostupnog programskog koda ne možemo
dati nikakve garancije za pouzdanost. Također, treba znati da automatski generatori
obično ne daju kod s dobrim performansama.
Aplikacijska domena. U nekim domenama, na primjer kod upravljanja proizvodnjom ili u
knjižnicama ili u bankarstvu, već postoje dobri generički proizvodi koje možemo
konfigurirati ili nadograditi u skladu sa specifičnim potrebama. Nema velike potrebe za
samostalnim razvojem.
Platforma na kojoj bi sustav trebao raditi. Razvoj zasnovan na komponentama obično je
prilagođen određenoj platformi. Na primjer, postoje sustavi komponenti koje rade unutar
Microsoftove .NET arhitekture ili sustavi komponenti za Java RMI. Dakle ako koristimo
komponente, vezani smo uz određeni operacijski sustav ili programski jezik.
Odluka o tome da li će se razvoj softvera zasnivati na ponovnoj upotrebi ili neće često je u
većoj mjeri menadžerska nego tehnička odluka. Menadžeri nerado pristaju na kompromise
koji su nužni da bi se mogli koristiti gotovi dijelovi. Također, menadžeri se boje rizika koje
donosi ponovna upotreba, posebno se boje gubitka kontrole nad evolucijom sustava.
U ovom potpoglavlju opisujemo oblike ponovne upotrebe softvera koji se koriste već
nekoliko desetljeća. Riječ je o aplikacijskim okvirima, produktnim linijama, odnosno upotrebi
COTS produkata. Svaki od ovih oblika obrađen je u posebnom odjeljku.
Aplikacijski okvir je integrirani skup klasa koje međusobno surađuju i grade zajedničku
arhitekturu za porodicu sličnih aplikacija. Aplikacijski okvir možemo promatrati kao kostur
buduće aplikacije ili kao nedovršenu aplikaciju - da bi ga pretvorili u aplikaciju, moramo na
neki način dovršiti njegov kod.
Budući da je okvir implementiran kao skup konkretnih ili apstraktnih klasa, on je uvijek
vezan uz određeni objektno-orijentirani programski jezik. Postoje okviri za Javu, C#, C++ i
druge jezike. Kao izaberemo neki okvir, moramo dalje raditi u njegovom jeziku.
Aplikacijski okviri mogu se na sljedeći način podijeliti u vrste s obzirom na sadržaj ili
područje kojim se bave.
Okviri za sistemsku infrastrukturu. Služe za razvoj infrastrukture poput mrežne
komunikacije, grafičkog korisničkog sučelja, ili „parsiranja“ komandi (prevođenja jezika).
Okviri za middleware. Implementiraju standarde za komunikaciju komponenti i razmjenu
podataka između komponenti. Primjeri su Microsoft .NET ili Enterprise Java Beans.
Omogućuju razvoj zasnovan na komponentama o kojem ćemo govoriti u potpoglavlju 6.3.
Okviri za specifične aplikacije. Odnose se na pojedine aplikacijske domene poput
financijskih sustava, knjižnica, zdravstvenih informacijskih sustava i tako dalje. Uključuju
znanje o dotičnoj domeni i implementiraju njene uobičajene operacije.
Okviri za web aplikacije. Podržavaju razvoj web aplikacija s dinamičkim web stranicama.
Sadrže klase koje omogućuju laganu implementaciju uobičajenih funkcionalnosti kao što
su: prijavljivanje korisnika, kontrola pristupa korisnika sadržajima, generiranje
dinamičkih web stranica, povezivanje s bazom podataka, upravljanje sesijom, interakcija s
korisnikom (ajax).
Petlja
GUI događaja
Callback
Callback Callback
Makar je aplikacijski okvir dostupan u obliku izvornog programskog koda, programer koji ga
koristi u pravilu ne mijenja taj kod. Umjesto toga programer radi nešto od sljedećeg.
On dodaje konkretne klase koje nasljeđuju apstraktne klase iz okvira.
On piše glavni program koji na osnovu zadanih klasa najprije stvara sve potrebne objekte,
a zatim upravlja izvođenjem cijele aplikacije.
On definira takozvane callback–ove: to su metode koje se automatski pozivaju kao
odgovor na događaje koje okvir prepoznaje.
Na primjer, ako koristimo okvir za grafičko korisničko sučelje, tada sam okvir već definira
klase koje odgovaraju elementima korisničkog sučelja, dakle prozorima, gumbima,
izbornicima i tako dalje. Naš posao je da napišemo program koji će stvoriti objekte iz tih klasa
i time sastaviti konkretno sučelje za našu aplikaciju. Također, naš posao je da napišemo
callback–ove koji će se aktivirati onda kad korisnik klikne mišem na određeni gumb ili onda
kad korisnik odabere određenu stavku s određenog izbornika. Dakle, naš posao je da okviru
dodamo funkcionalnost koja je specifična za našu aplikaciju. To je ilustrirano na slici 6.1.
Produktna linija ili porodica aplikacija je skup srodnih aplikacija koje je u pravilu razvila ista
softverska kuća i koje imaju zajedničku arhitekturu. Svaki član porodice je specijaliziran u
nekom smislu. Zajednička jezgra svih članova ponovo se upotrebljava svaki put kad se pojavi
potreba za novim članom. Razvoj novog člana sastoji se od pisanja dodatnih dijelova ili od
prepravljanja postojećih dijelova u nekoj od starih aplikacija.
Kao primjer ponovne upotrebe softvera korištenjem produktne linije pogledajmo arhitekturu
sustava za upravljanje inventarom na slici 6.2. Riječ je o slojevitoj arhitekturi. Prati se
raspored nekih komada opreme unutar neke organizacije. Ukoliko je riječ o elektrani i
njezinim generatorima i transformatorima, tada oprema u pravilu ne mijenja svoju lokaciju.
Ukoliko isti sustav koristimo za praćenje opreme na fakultetu, morat ćemo dodati modul za
premještanje na primjer računala iz jednog laboratorija u drugi, pa ćemo na taj način dobiti
novog člana produktne linije. Slika 6.3 prikazuje značajnije promijenjenu verziju polazne
aplikacije koja ovaj put služi za raspoređivanje vatrogasnih vozila ili vozila hitne pomoći;
dodani su specifični moduli za planiranje rute vozila, za rad s kartama, za sučelje prema
komunikacijskom sustavu, i tako dalje. Baza podataka je podijeljena u tri dijela koji se odnose
na vozila, drugu opremu i karte.
Interakcija
Korisničko sučelje
Upravljanje inventarom
Interakcija
Sučelje za
Sučelje za komunikacijski
operatora sustav
Upravljanje inventarom
Praćenje Bilježenje Raspo- Upravljanje Lociranje
statusa incidenata ređivanje opremom vozila
vozila vozila u vozilima
Slika 6.3: arhitektura jednog člana produktne linije - raspoređivanje vatrogasnih vozila.
Slika 6.4 prikazuje korake u razvoju novog člana produktne linije. Ponovno pregovaranje o
zahtjevima je poželjno zato da bi se minimizirale promjene u postojećoj (najsličnijoj) verziji
aplikacije. Ukoliko korisnik pristane na kompromise u zahtjevima, tada će nova verzija biti
jeftinija i brže isporučena.
Izaberi Ponovo
Otkrij zahtjeve najsličnijeg pregovaraj s
korisnika člana produktne korisnikom o
linije zahtjevima
Uzastopni razvoj novih članova produktne linije dovest će do postepenog kvarenja polazne
arhitekture. U jednom trenutku softverska kuća mora se odlučiti na razvoj nove (bolje)
generičke aplikacije koja će služiti kao polazište za novu produktnu liniju. Ta nova aplikacija
ne nasljeđuje programski kod nego samo znanje i iskustvo stečeno kroz razvoj polazne linije.
Produktne linije i aplikacijski okviri očito imaju mnogo zajedničkih svojstava. Obje tehnike
podržavaju zajedničku arhitekturu za skup sličnih aplikacija, obje zahtijevaju dodatno
programiranje da bi se stvorila nova verzija sustava. No postoje i sljedeće razlike između ta
dva pristupa.
Aplikacijski okviri oslanjaju se na objektno-orijentirane mehanizme poput nasljeđivanja i
polimorfizma. U pravilu, programski kod samog okvira nikad se ne mijenja. Produktne
linije ne moraju biti pisane u objektno-orijentiranom jeziku. Njihov programski kod se
mijenja svaki put kad stvaramo novu verziju.
Aplikacijski okviri prvenstveno su usmjereni na općenitu tehničku podršku, na primjer na
izradu bilo kakve web aplikacije. Produktne linije obično uključuju znanje o određenoj
domeni. Na primjer, mogla bi postojati programska linija za izradu web aplikacija iz
domene knjižničarstva.
Produktne linije često kontroliraju određenu opremu. Na primjer, mogla bi postojati
programska linija driver-a za porodicu pisača. To znači da produktna linija sadrži sučelja
prema hardveru. Aplikacijski okviri obično su softverski orijentirani i oni u pravilu
izbjegavaju ovisnost o hardveru.
Produktna linija zapravo je porodica od nekoliko sličnih konkretnih aplikacija. Kad
pomoću produktne linije stvaramo novu aplikaciju, polazna točka nam je najsličnija
konkretna aplikacija iz porodice. S druge strane, aplikacijski okvir čini samo jedna
generička (nedovršena) aplikacija. Kad pomoću aplikacijskog okvira stvaramo novu
aplikaciju, krećemo od te jedne generičke i nadograđujemo je.
Kratica COTS znači commercial off-the-shelf. COTS produkt je javno dostupni softverski
sustav koje se može kupiti u dućanu ili dobiti besplatno i koji se može prilagoditi potrebama
raznih korisnika bez da se mijenja njegov izvorni programski kod. Primjeri COTS produkata
su: Microsoft Word ili Excel, WRI Mathematica, ERP sustavi poput SAP, DBMS-i poput
Oracle ili MySQL.
Sustavi dobiveni upotrebom COTS produkata dijele se na sljedeće dvije vrste s obzirom na
način upotrebe samog COTS produkta.
1. Sustavi sa COTS rješenjem. Sastoje se od po jednog velikog COTS produkta koji je
konfiguriran u skladu s korisnikovim zahtjevima.
2. Sustavi dobiveni integracijom COTS produkata. Sastoje se od više COTS produkata,
možda od različitih proizvođača, koji su povezani u cjelinu obično preko dodatno
razvijenih adaptera.
Poslovna pravila
Baza podataka
Integracija COTS produkata potrebna je onda kad ni jedan od tih produkata ne pruža svu
potrebnu funkcionalnost, ili onda kad novi COTS produkt želimo integrirati s postojećim
sustavima. Kod razvoja sustava koji uključuju integraciju COTS produkata naglasak je na
samoj integraciji. To obično uključuje pisanje dodatnih komada softvera, takozvanih adaptera,
koji izlaze jednog COTS produkta pretvaraju u ulaze za drugi COTS produkt i obratno.
Također je osjetljivo pitanje izbora COTS produkta i izbora funkcija koje će se zaista koristiti
u pojedinom produktu (obično postoje preklapanja u funkcionalnosti).
Kao primjer integracije COTS produkata, zamislimo neku veliku organizaciju koja želi
stvoriti sustav za objedinjenu nabavu. Taj sustav treba omogućiti zaposlenicima da naručuju
uredski materijal i druge potrepštine sa svog stolnog računala. Objedinjavanjem svih narudžbi
i centraliziranom kupovinom kod dobavljača koji daje najveći količinski popust ostvarit će se
značajna ušteda. Kompanija već ima baštinjeni sustav za naručivanje koji se koristi u
središnjem uredu za nabavu
Klijent
Poslužitelj
E-mail Adapter
sustav
U ovom potpoglavlju bavimo se danas aktualnom i po svemu sudeći vrlo efikasnom tehnikom
ponovne upotrebe koja se zasniva na takozvanim komponentama. Najprije govorimo općenito
o komponentama i njihovom korištenju. Zatim opisujemo dva razvojna procesa koji su vezani
uz komponente: prvi se odnosi na razvoj samih komponenti koje će se ponovo upotrebljavati,
a drugi na razvoj novih aplikacija uz upotrebu komponenti. Na kraju proučavamo postupke
međusobnog spajanja komponenti u svrhu izgradnje složenijih podsustava odnosno cijelih
sustava.
Razni autori daju donekle različite definicije komponente, no svi se otprilike slažu da ona
mora imati sljedeća svojstva.
Komponenta je nezavisna izvršiva cjelina. Nije nam dostupan njezin izvorni kod, ona se
ne kompilira zajedno s ostalim dijelovima našeg sustava, već se instalira u binarnom
obliku i pokreće kao zasebni proces.
Komponenta objavljuje svoje sučelje. Sve interakcije s njom odvijaju se kroz to sučelje.
Samo sučelje zadaje se u obliku parametriziranih operacija, slično kao kod objekta.
Sučelje komponente sastoji se od dva dijela.
- Ponuđeno sučelje (provides interface) definira usluge koje komponenta pruža.
- Traženo sučelje (requires interface) definira koje usluge moraju biti dostupne samoj
komponenti u sustavu koji je koristi. Ako tih usluga nema, komponenta neće moći
raditi.
Komponenta se ponaša kao crna kutija. Nije nam vidljivo njezino unutrašnje stanje. Ne
znamo na koji način ona implementira svoje operacije. U pravilu je nevažno u kojem
programskom jeziku je ona razvijena.
Komponenta je zamjenjiva cjelina. Dakle ako imamo dvije komponente koje pružaju iste
usluge preko istih sučelja, tada jednu od njih možemo zamijeniti drugom.
Svaka komponenta pokorava se jednom od standardnih modela za komponente. Taj model
određuje pravila kako se zadaju sučelja za komponente, dakle pravila vezana uz imena
operacija, parametre, tipove podataka, iznimke, metapodatke.
Komponente se međusobno integriraju pomoću posebnog softvera koji se zove
middleware. Na svakom stroju gdje je instalirana komponenta mora biti instaliran i
middleware. Bez obzira nalaze li se na istom ili na različitim strojevima, dvije
komponente međusobno komuniciraju posredstvom middleware-a. Svaki middleware
implementira jedan određeni model za komponente.
Komponenta mora biti detaljno dokumentirana, tako da njeni potencijalni korisnicu mogu
odlučiti da li ona ispunjava njihove potrebe. Dokumentacija u prvom redu mora definirati
sintaksu i semantiku svih operacija iz sučelja.
Slika 6.7. prikazuje komponentu koja pruža usluge štampanja. Ponuđeno sučelje sastoji se od
sljedećih operacija: slanje dokumenta na štampanje na zadanom štampaču, uvid u stanje reda
dokumenata koji čekaju štampanje na zadanom štampaču, registriranje ili deregistriranje
štampača, prebacivanje dokumenta iz reda jednog u red drugog štampača, izbacivanje
dokumenta iz reda. Traženo sučelje sastoji se od operacije koja daje datoteku s opisom
određenog štampača te od operacije koja prosljeđuje naredbu određenom štampaču. Očito je
da je opisana komponenta ponovo upotrebljiva: ona se može uključiti u bilo koji sustav koji
treba usluge štampanja.
GetQueue
GetPDfile
Remove
PrintService
PrinterInt Transfer
Register
Unregister
Slika 6.7 ujedno predstavlja i jednostavni primjer UML component dijagrama. Takvi
dijagrami služe za prikaz građe sustava sastavljenog od komponenti. Vidimo da se po UML-
ovim pravilima komponenta crta kao pravokutnik s odgovarajućom ikonom. Ponuđeno
sučelje obično se crta kao niz „utikača“, a traženo sučelje kao niz „utičnica“. Na složenijim
component dijagramima pojavljuje se više komponenti. Situacija kad jedna komponenta daje
uslugu a druga je prima crta se tako da odgovarajući utikač prve komponente bude utaknut u
odgovarajuću utičnicu druge komponente. Primjeri takvih složenijih dijagrama pojavit će se
na slikama 6.12 – 6.17.
Iz svega što smo do sada rekli, jasno je da korištenje komponenti donosi bitne promjene u
načinu kako se softver oblikuje, implementira i kasnije pokreće. Da bi neki sustav uspješno
realizirali pomoću komponenti, nužno je da su ispunjeni sljedeći uvjeti.
Sam sustav mora biti oblikovan kao skup komponenti koje međusobno komuniciraju,
dakle njegova građa treba biti prikazana pomoću UML component dijagrama.
Moramo imati dostupne odgovarajuće komponente koje imaju traženu funkcionalnost i
koje se mogu instalirati na naša računala.
Sve odabrane komponente moraju biti kompatibilne u smislu da se pokoravaju istom
modelu, dakle mogu raditi pod kontrolom istog middleware-a.
Na našim računalima moramo imati instaliran middleware koji implementira taj odabrani
model i koji je u stanju integrirati sve odabrane komponente u cjelinu.
Kao konkretan primjer middleware-a mogli bismo navesti bilo koji alat koji implementira
otvoreni standard CORBA. No danas se mnogo više koriste „proprietary” softveri poput
Microsoftovog .NET ili Sunovog Enterprise Java Beans.
Servisi za podršku
Platformski servisi
U donjem dijelu slike 6.8 nalaze se obavezne usluge koje se tiču interoperabilnosti
komponenti u distribuiranoj okolini. Gornji dio slike navodi dodatne usluge koje mogu biti od
koristi komponentama i koje olakšavaju razvoj aplikacija. Na primjer, mnogi middleware-i
pružaju usluge vezane uz sigurnost. Ako neka komponenta zahtijeva autentikaciju korisnika,
ona ne mora sama implementirati postupak autentikacije, već se može osloniti na mehanizam
iz middleware-a.
CBSE za
CBSE uz
ponovnu
ponovnu upotrebu
upotrebu
Nabava
komponenti
Repozitorij
komponenti
Kao što vidimo na slici 6.9, unutar CBSE postoje dva glavna i tri pomoćna procesa. Glavni
procesi su sljedeći.
Razvoj za ponovnu upotrebu. Cilj je stvoriti same komponente koje će se kasnije ponovo
upotrebljavati. Proces se obično sastoji od generalizacije postojećih komponenti.
Razvoj uz ponovnu upotrebu. Cilj je stvoriti novu aplikaciju korištenjem postojećih
komponenti.
Pomoćni procesi su sljedeći.
Nabava komponenti. Riječ je o pronalaženju pogodnih komponenti koje će služiti za
ponovnu upotrebu ili za pretvorbu u ponovno-upotrebljivu komponentu. Može se raditi o
pristupu lokalno razvijenim komponentama ili o pretraživanju komponenti iz nekog
vanjskog izvora.
Upravljanje komponentama. Proces se bavi evidencijom ponovo upotrebljivih
komponenti. Osigurava se da su one ispravno katalogizirane i dostupne za ponovnu
upotrebu.
Certificiranje komponenti. Riječ je o verifikaciji komponente i izdavanju potvrde da ona
zaista zadovoljava svoju specifikaciju.
Komponente koje neka organizacija održava obično su pohranjene u repozitoriju. On uz same
komponente također sprema i informacije o njihovom korištenju.
U nastavku ovog odjeljka, reći ćemo nešto više o CBSE za ponovnu upotrebu. Početkom 20.
stoljeća vjerovalo se da će se CBSE za ponovnu upotrebu brzo razviti u veliku industriju.
Slično kao što u svijetu hardvera postoje kompanije koje proizvode samo hardverske
komponente (procesore, memorijske čipove, matične ploče, ... ), očekivalo se da će se pojaviti
softverske kuće koje žive isključivo od razvoja i prodaje softverskih komponenti. No to se za
sada nije ostvarilo. Umjesto toga, CBSE za ponovnu upotrebu zaživio je unutar velikih
kompanija kao dio njihove unutrašnje racionalizacije poslovanja. Dakle, velike kompanije
bave se pretvorbom komponenti iz svojih starih projekata u komponente koje su pogodne za
ponovnu upotrebu u idućim projektima.
Komponenta razvijena unutar kompanije u sklopu jednog projekta obično nije odmah
ponovno upotrebljiva. Naime, ona često sadrži specifičnosti aplikacije u kojoj je nastala. Da
bi se takva komponenta učinila ponovno upotrebljivom, ona se mora doraditi i proširiti te
postati u većoj mjeri generička. Pitanje je da li se takva prepravka uopće isplati. Pokazuje se
da je prepravka isplativa ukoliko komponenta implementira neku stabilnu apstrakciju dotične
aplikacijske domene, dakle nešto što se sporo mijenja a uvijek iznova koristi (na primjer rad s
bankovnim računima u bankarstvu, katalogizacija knjiga u bibliotekarstvu, ... ).
Kod dodavanja novih operacija u svrhu postizavanja cjelovitosti podrške treba se sjetiti svih
operacija koje nisu bile potrebne u polaznoj aplikaciji a mogle bi postati potrebne u budućim
aplikacijama. Na primjer, ako postojeća komponenta liči na onu sa slike 6.7 i daje podršku za
rad s jednim štampačom, treba joj dodati mogućnost rada s više štampača i operaciju
prebacivanja dokumenta iz reda jednog u red drugog štampača.
Rukovanje iznimkama u pravilu treba riješiti tako da sama komponenta ne obrađuje iznimke
nego ih prosljeđuje aplikaciji. Naime, svaka aplikacija ima svoje zahtjeve u pogledu obrade
iznimki. No takav pristup često rezultira nezgrapnim sučeljima, a koji put je i nemoguć ako
funkcionalnost komponente zahtijeva da se iznimka obradi lokalno u komponenti.
Identificiraj Prilagodi
Skiciraj zahtjeve komponente- zahtjeve u skladu
na sustav kandidate s otkrivenim
komponentama
Opet
identificiraj Komponiraj
Oblikovanje komponente i
arhitekture komponente-
kandidate tako stvori sustav
Neke od aktivnosti na slici 6.10, na primjer polazno otkrivanje korisničkih zahtjeva, odvijaju
se na uobičajeni način. No uočavamo da na slici 6.10 u odnosu na konvencionalne softverske
procese postoje sljedeće razlike.
1. Od korisnika se traži da budu što fleksibilniji kod definiranja zahtjeva, Naime, zahtjevi
koji su jako specifični ograničavaju broj komponenti koje ih mogu zadovoljiti.
2. Zahtjevi se razrađuju i modificiraju u skladu s raspoloživim komponentama, Korisnici će
rado pristati na kompromise ukoliko to povlači jeftiniju i bržu isporuku sustava.
U procesu sa slike 6.10 od presudne važnosti je odabir robusne arhitekture koja će omogućiti
uspješnu ponovnu upotrebu komponenti. Autor Ivar Jacobson o tome opširno raspravlja u
knjizi [33]. Arhitektura sustava mora se oblikovati na način koji je prikaziv UML component
dijagramima. Dakle arhitektura se mora svoditi na skup komponenti s međusobno povezanim
traženim odnosno ponuđenim sučeljima.
U procesu sa slike 6.11 posebnu pažnju treba posvetiti validaciji svake od odabranih
komponenti. Moramo biti sigurni da komponenta zaista pruža svu funkcionalnost koju mi od
nje tražimo te da nam njena dodatna funkcionalnost neće stvarati smetnje.
Kao primjer loše provedene validacije komponente i problema koji odatle slijede u literaturi
se često navodi primjer neuspjelog lansiranja europske rakete Ariane 5. Softver koji je
upravljao s Ariane 5 sadržavao je komponentu naslijeđenu od prethodne rakete Ariane 4.
Unatoč temeljitoj validaciji u simuliranim uvjetima, ta komponenta je zakazala u stvarnim
uvjetima i Ariane 5 se srušila. Do zakazivanja je došlo zbog operacije unutar komponente
koja je kod pretvorbe realnog broja u cijeli broj izazvala overflow. Ta operacija ispravno je
radila u Ariane 4 jer su tamo motori bili manje snažni a brojevi manji. Ista operacija nije
uopće bila potrebna u sklopu Ariane 5, tako da prilikom validacije nije ni bila testirana. No
komponenta je u stvarnom radu tu operaciju ipak pokrenula automatski.
Iz primjera Ariane 5 vidimo koja je osnovna poteškoća kod validacije komponenti. Poteškoća
je u tome što je komponenta bila razvijena unutar jedne okoline, a pokušava se upotrijebiti
unutar drukčije okoline. Pretpostavke polazne okoline obično nisu u potpunosti
dokumentirane, tako da je teško provjeriti da li one vrijede i u novoj okolini.
Rekli smo da se dvije komponente neposredno povezuju tako da se ponuđeno sučelje jedne
spoji na traženo sučelje druge. Na dijagramu to prepoznajemo po tome što je „utikač“ jedne
komponente utaknut u „utičnicu“ druge. U takovoj situaciji podrazumijeva se da su
odgovarajuća sučelja kompatibilna, štoviše sasvim jednaka. Ako komponente koje želimo
spojiti razvijamo sami, ujednačavanje sučelja neće biti problem. No ako koristimo gotove
komponente iz drugih izvora, tada će se vjerojatno pojaviti veće ili manje nekompatibilnosti.
Općenito, postoje tri vrste nekompatibilnosti sučelja.
154 PMF – Matematički odsjek
Softversko inženjerstvo - skripta
A B
Kao što smo također već rekli, manje nekompatibilnosti među sučeljima mogu se riješiti
pisanjem adaptera i njihovim umetanjem između komponenti koje želimo povezati.
Primijetimo da adapter također komunicira s okolinom preko svojih ponuđenih i traženih
sučelja. Dakle adapter se može shvatiti kao još jedna komponenta koja sudjeluje u našoj
kompoziciji.
Kao prvi primjer potrebe za adapterima promatrajmo dvije komponente na slici 6.15 čija
sučelja su nekompatibilna. One bi trebale biti dio sustava koji koristi služba hitne pomoći u
nekom gradu. Prva komponenta addressFinder sadrži podatke o telefonskim pretplatnicima:
za zadani telefonski broj ona pronalazi i vraća adresu na kojoj se nalazi taj telefon, odnosno
prezime i ime pretplatnika, odnosno tip građevinskog objekta. Druga komponenta mapper
generira digitalnu kartu u zadanom mjerilu dijela grada oko zadane ulice i kućnog broja. Karta
se može prikazati na nečijem zaslonu ili štampati.
Sustav hitne pomoći trebao bi funkcionirati ovako. Kad operator primi poziv za hitnu pomoć,
telefonski broj pozivatelja ubacuje se u komponentu addressFinder da bi se odredila adresa.
Nakon toga se koristi komponenta mapper koja na osnovu ulice i kućnog broja iz pronađene
adrese generira kartu oko te adrese u mjerilu 1:10000. Karta se šalje a zaslon vozaču hite
pomoći.
Opisane komponente u principu se mogu komponirati jer adresa sadrži ulicu i kućni broj. No
budući da prva komponenta vraća cijelu adresu kao jedan niz znakova, a druga traži zasebno
ulicu odnosno kućni broj, potrebno je ipak napisati adapter. Taj adapter iz adrese koju je
vratio addressFinder izdvaja ulicu odnosno kućni broj te ih šalje kao zasebne parametre u
mapper. Riječ je o primjeru sekvencijalne kompozicije. Skica programskog koda za adapter
prikazana je na slici 6.16.
address = addressFinder.location(phonenumber);
streetname = addressStripper.getStreetName(address);
streetNo = addressStripper.getStreetNo(address);
mapper.displayMap(streetName, streetNo, 10000);
Slika 6.16: skica programskog koda za adapter koji će povezati komponente sa slike 6.15.
Kao drugi primjer korištenja adaptera promatrajmo sliku 6.17. Riječ je o dijelu mogućeg
rješenja za softver meteorološke stanice koju smo proučavali u odjeljku 3.3.3. Komponenta
DataCollector ugrađuje se u meteorološku stanicu. Ona upravlja skupom senzora ugrađenih
u stanicu (termometri, anemometri, barometri, ...) te skuplja i objedinjuje podatke koji stižu s
tih senzora. Ponuđeno sučelje od DataCollector omogućuje korisniku da na posredan način
pokrene ili zaustavi određeni senzor ili da dobije skupljene podatke od svih senzora. Traženo
sučelje od DataCollector služi za njegovo povezivanje sa samim senzorima i sastoji se od
dijela za upravljanje senzorom i dijela za očitavanje vrijednosti sa senzora. Komponenta
Sensor na slici 6.17 predstavlja jedan od senzora – njegovo ponuđeno sučelje sastoji se
operacija za pokretanje i zaustavljanje senzora te operacije za očitavanje vrijednosti.
addSensor
removeSensor
start sensorManagement startSensor
stop stopSensor
Sensor Adapter Data Collector testSensor
getData
sensorData initialize
report
listAll
Problem kod arhitekture na slici 6.17 je u tome što je DataCollector jedan, a Sensor-a ima
mnogo. Svaki senzor ima malo drukčije ponuđeno sučelje, pa nije moguće traženo sučelje od
DataCollector ujednačiti s ponuđenim sučeljima svih senzora. Rješenje problema postiže se
primjenom adaptera koji posreduje između DataCollector-a i svakog pojedinog Sensor-a.
1. Koja kompozicija je najefikasnija u smislu što brže i što jeftinije isporuke sustava
korisnicima?
2. Koja kompozicija osigurava lagano mijenjanje sustava u budućnosti kad se zahtjevi
promijene?
3. Koja kompozicija daje najbolje performanse sustava?
Nažalost, kriteriji iz ovih pitanja najčešće su u međusobnom konfliktu. U odabiru rješenja
tada je nužno napraviti neku vrstu kompromisa.
Report
Data Data Report
Collection Management Generator
Report
Data Data Base
Collection
Općenito i dugoročno gledajući, princip koji bi trebalo slijediti pri kompoziciji komponenti je
princip razdvajanja odgovornosti. Dakle sustav bi trebalo oblikovati tako da svaka
komponenta ima jasno definiranu ulogu te da se te uloge po mogućnosti ne preklapaju. No
ovo je lakše reći nego ostvariti. Često je jeftinije uzeti jednu gotovu komponentu s mnogo
funkcija nego razviti dvije ili tri komponente s razdvojenim funkcijama. Također, kod ponovo
upotrebljivih komponenti funkcionalnosti se obično preklapaju jer svaka od njih nastoji biti
što samostalnija.
U ovom potpoglavlju bavimo se još jednom aktualnom tehnikom ponovne upotrebe. Ona se
zasniva na takozvanim web servisima. Riječ je o tehnici koja u konceptualnom pogledu ima
sličnosti s razvojem zasnovanim na komponentama, no bitno se razlikuje u pogledu tehničke
realizacije. U prvom odjeljku govorimo općenito o web servisima kao temelju nove
arhitekture distribuiranih sustava. Drugi odjeljak nabraja standardne jezike i protokole koji
omogućuju njihovu upotrebu. Treći odjeljak objašnjava zašto se oni mogu shvatiti kao oblik
ponovne upotrebe te koje su sličnosti i razlike u odnosu na komponente. U četvrtom odjeljku
proučavamo softverske procese koji su vezani uz web servise, dakle proces njihovog razvoja
odnosno proces razvoja aplikacija koje ih koriste.
Web servisi omogućuju novu vrstu arhitekture distribuiranih sustava koja se naziva
arhitektura usmjerena na servise (Service Oriented Architecture – SOA) [23]. Prema SOA,
aplikacija se gradi povezivanjem samostalnih servisa koji su dostupni na Internetu i izvršavaju
se na geografski udaljenim računalima. Ideja SOA ilustrirana je na slici 6.19. Dobavljači
usluga oblikuju i implementiraju servise te definiraju sučelja preko kojih se pristupa tim
servisima. Također, oni objavljuju informacije o svojim servisima u nekom registru. Tražitelji
usluga otkrivaju u registru specifikacije servisa koji ih zanimaju i lociraju dobavljače usluga.
Nakon toga oni mogu povezati svoju aplikaciju s odabranim servisom i komunicirati s njime
preko njegovog sučelja razmjenom poruka u skladu s predviđenim protokolom. Ovisno o
modelu poslovanja, dobavljači svoje servise mogu učiniti dostupnima cijelom svijetu ili samo
pripadnicima neke kompanije, a svoje usluge mogu naplaćivati ili davati besplatno.
Registar
servisa
otkrivanje objavljivanje
Tražitelj Dobavljač
usluga povezivanje (SOAP) Servis
usluga
(WSDL)
Osim SOA, u literaturi se često pojavljuje i srodan pojam Software as a Service – SaaS. Treba
primijetiti da ta dva pojma nisu sinonimi. Naime, SOA se odnosi na razvoj novih aplikacija
kombiniranjem web servisa, a SaaS na mogućnost da korisnici neposredno preko web
preglednika koriste funkcionalnost udaljenog poslužitelja. Obje paradigme doprinose danas
često spominjanoj viziji računanja u oblaku (cloud computing).
Tehnologija web servisa omogućuje kompanijama da jedna drugoj stave na raspolaganje svoje
poslovne funkcije. Na taj način omogućen je razvoj fleksibilnih sustava s intenzivnom
međusobnom razmjenom informacija. U tim sustavima dolazi do integracije i automatizacije
poslovnih procesa gdje sudjeluje više kompanija. Na primjer, aplikacija u jednoj kompaniji
može automatski naručiti robu od servisa u drugoj kompaniji.
Dodatni vid fleksibilnosti korištenja web servisa sastoji se u tome što se veza između
aplikacije i servisa može dinamički mijenjati tijekom izvršavanja. To znači da se u različitim
prilikama mogu pokretati različite no ekvivalentne verzije servisa. Na primjer, aplikacija koja
naručuje robu može svaki put naručiti robu od drugog dobavljača. Također, aplikacija ne
mora biti građena isključivo od web servisa, nego može po potrebi miješati vanjske servise s
lokalno razvijenim komponentama.
Kao ilustraciju fleksibilne upotrebe web servisa i lokalnih modula promatrajmo sljedeći
scenarij. Potrebno je razviti informacijski sustav koji radi unutar automobila i koji vozača
snabdijeva s informacijama o vremenskim prilikama, prometnoj situaciji na cesti, i tako dalje.
Automobil ima ugrađen GPS uređaj s kojeg je moguće očitati trenutne geografske koordinate.
Sustav koristi te koordinate da bi od vanjskih informacijskih servisa dobio relevantne podatke
o vremenu i prometu. Veza s vanjskim servisima ostvaruje se posredstvom mobilnog telefona
u automobilu. Informacije se vozaču dostavljaju u obliku sintetiziranog govora koji se čuje
preko radio aparata u automobilu na posebnom radio kanalu i na jeziku kojeg je vozač sam
odabrao.
Na slici 6.20 prikazana je jedna moguća organizacija traženog sustava. Softver unutar
automobila sastoji se od pet modula. Oni obavljaju komunikaciju s vozačem, GPS uređajem,
telefonom, odnosno radio aparatom. Moduli Slanje podataka i Primanje podataka
obavljaju svu komunikaciju s vanjskim servisima putem mobilne telefonske veze.
Ovaj primjer dobro ilustrira ključne prednosti SOA. U trenutku implementacije sustava ne
moramo odlučiti koji dobavljači usluga će se angažirati ni koje točno usluge će se od njih
tražiti. Dok se automobil kreće, on otkriva dostupne informacijske servise te od njih dobiva
relevantne informacije. Zahvaljujući usluzi prevođenja, automobil može prelaziti granice, a
vozač će i dalje dobivati informacije na svojem jeziku.
Informacije o prometu na
Druge cesti
info
Info o
vremenu Lociranje Info o
GPS koord ceste prometu
GPS koord
GPS koord
Prevoditelj Pronalazi
Jezik, Objedinjuje
dostupne
Informacije informacije
servise
Prevedene
Informacije Naredba,
Jezik,
GPS koord
Radio Lociranje
Pretvara
Otkriva GPS
digitalne
koordinate
informacije u
automobila
radio signal
Softverski sustav
unutar automobila
Razvoj tehnologije web servisa bio je popraćen razvojem odgovarajućih standarda. Sve važne
kompanije prihvatile su te standarde, pa su time osigurale kompatibilnost svojih rješenja. Na
slici 6.21 prikazani su jezici i protokoli koji su od ključne važnosti za funkcioniranje web
servisa. Svi oni zasnivaju se na XML-u. Kao što vidimo, riječ je o sljedećem.
Proces (WS-BPEL)
Na slici 6.21 vidimo također da tehnologija web servisa predstavlja nadogradnju web
tehnologije. Zaista, kao transportni protokol ispod SOAP-a u pravilu se koristi HTTP, a sam
HTTP radi na vrhu stoga protokola TCP/IP. To znači da se komunikacija aplikacije i web
servisa odvija posredstvom web poslužitelja.
U nastavku ćemo reći nešto više o WSDL-u. Rekli smo da jedan dokument u WSDL-u služi
kao opis sučelja jednog web servisa. Struktura takvog dokumenta prikazana je na slici 6.22.
Nakon uvodnog dijela koji sadrži XML-ove deklaracije prostora imena (namespace), slijede
dijelovi u kojima se definiraju tri stvari o web servisu: što on radi, kako on komunicira te gdje
se on može naći. Odgovor na pitanje „što“ svodi se na opis operacija, parametara, tipova
podataka, poruka i iznimki. Odgovor na „kako“, takozvani binding, specificira protokol za
komunikaciju sa servisom - u pravilu to je SOAP no može se odabrati i neki drugi. Odgovor
na „gdje“ određuje adresu na webu gdje je servis instaliran, dakle njegov Uniform Resource
Identifier – URI.
deklaracije tipova,
Apstraktno sučelje deklaracije sučelja,
deklaracije poruka
Očekivalo se da će dobavljači usluga stvarati svoje UDDI registre s opisima servisa koje
nude. Neke od kompanija, na primjer Microsoft, zaista su to učinile u prvim godinama 21.
stoljeća. No danas su svi ti registri ugašeni, a UDDI je pao u zaborav. Razlog za to je taj što se
servisi danas sasvim uspješno mogu pronaći korištenjem standardnih tražilica. Dovoljno je na
web postaviti odgovarajuće WSDL opise.
SOAP, WSDL, WS-BPEL i UDDI zamišljeni su kao glavni standardi za web servise. No
osim njih postoji i niz pomoćnih standarda koji se odnose na neke posebne aspekte. Na
primjer postoje standardi za pouzdanu razmjenu poruka, za sigurnost, za koordinaciju
transakcija i drugi. Neki autori kritizirali su standarde za web servise da su preglomazni,
preopćeniti i neefikasni. Zbog toga su neke kompanije poput Google i Amazon odustale od
standardnih jezika i protokola pa su počele koristiti svoju nestandardnu ali jednostavniju
verziju web servisa koju su nazvale RESTful [24].
Web servisi očito predstavljaju jedan oblik ponovne upotrebe softvera. Zaista, kad veći broj
aplikacija koristi isti servis, tada se ista implementacija dotične usluge upotrebljava mnogo
puta. Štoviše, stječe se dojam da je riječ o vrlo djelotvornoj tehnici ponovne upotrebe. Naime,
kad razvijamo aplikaciju, tada nam u pravilu stoji na raspolaganju obilje servisa diljem
Interneta, pa je za očekivati da ćemo za svaku uslugu koja nam treba uspjeti pronaći
odgovarajuću implementaciju.
Zahvaljujući ovim razlikama, web servisi mogu se pokazati boljim rješenjem od komponenti
u jednoj situaciji no lošijim rješenjem u nekoj drugoj situaciji. Za razliku od komponenti, koje
se danas uglavnom interno koriste unutar velikih kompanija, web servisi su u većoj mjeri
ostvarili ideju globalne softverske industrije, gdje se rješenje stvara na jednom mjestu a
ponovo se upotrebljava bilo gdje drugdje u svijetu. No s druge strane, zbog načina
komuniciranja preko XML-a i internetskih protokola, web servisi su bitno sporiji od
komponenti pa nisu pogodni za aplikacije gdje se traže dobre performanse.
U prvom dijelu ovog odjeljka bavimo se procesom razvoja samih servisa. Taj proces prikazan
je slikom 6.23 i sastoji se od tri faze.
Identifikacija Implementacija
Oblikovanje
kandidata za sučelja servisa i instalacija
servis servisa
Specifikacija Validirani i
Zahtjevi na servis
sučelja servisa instalirani servis
Slično kao kod komponenti, razvoj ponovno upotrebljivog servisa obično počinje
identifikacijom nekog postojećeg softverskog modula koji se pokazao korisnim i koji bi
mogao biti od šireg interesa. Na primjer, može biti riječ o modulu koji preračunava valute ili
dijelu softvera koji obavlja plaćanje PDV-a. U daljnjem postupku razvoja postojeći modul
mora se generalizirati, to jest iz njega treba izbaciti specifičnosti njegove originalne aplikacije
te mu treba dodati novu funkcionalnost koja će ga učiniti cjelovitijim i nezavisnijim.
Specifičnost oblikovanja sučelja web servisa je pisanje teksta u WSDL-u. WSDL je prilično
složen jezik zasnovan na XML-u, a specifikacije u njemu obično su dugačke i detaljne. Zato
se kod u WSDL-u obično ne piše ručno već se dobiva automatski primjenom posebnih alata,
na primjer iz UML dijagrama koji prikazuje sučelje kao klase ili iz ekvivalentnog Java koda.
Primjer opisa sučelja u WSDL-u vidi se na slici 6.24. Riječ je o sučelju za servis koji za
zadani datum i ime grada vraća maksimalnu i minimalnu temperaturu na taj datum u tom
gradu. Prikazan je samo dio teksta: vidimo specifikaciju samo jednog tipa podataka te
specifikaciju samo jedne operacije s pripadnim ulaznom i izlaznom porukom i porukom o
greški.
Define some of the types used. Assume that the namespace prefixes ‘ws’ refers
to the namespace URI for XML schemas and the namespace prefix associated
with this definition is weathns.
<types>
<xs: schema targetNameSpace = “http://.../weathns”
xmlns: weathns = “http://…/weathns” >
<xs:element name = “PlaceAndDate” type = “pdrec” />
<xs:element name = “MaxMinTemp” type = “mmtrec” />
<xs: element name = “InDataFault” type = “errmess” />
<xs: complexType name = “pdrec”
<xs: sequence>
<xs:element name = “town” type = “xs:string”/>
<xs:element name = “country” type = “xs:string”/>
<xs:element name = “day” type = “xs:date” />
</xs:complexType>
</schema>
</types>
Now define the interface and its operations. In this case, there is only a single
operation to return maximum and minimum temperatures.
U preostalom dijelu ovog odjeljka bavimo se procesom razvoja aplikacije koja koristi web
servise. Uobičajeno je da se tijek takve aplikacije opisuje kao radni tok (workflow). Pojam
workflow potječe iz poslovnog svijeta i označava niz aktivnosti koje se moraju izvršiti
vremenski jedna za drugom da bi se postigao neki poslovni cilj. U našem slučaju aktivnosti se
izvršavaju tako da se pozove odgovarajući web servis.
Proces razvoja aplikacije prikazan je na slici 6.25. Vidimo da se taj proces sastoji od šest
koraka.
1. Oblikovanje polaznog workflow-a. Na osnovu zahtjeva na aplikaciju predlažemo idealni
tijek aktivnosti unutar aplikacije.
2. Otkrivanje servisa. Pretražujemo odgovarajuće registre ili kataloge da bi ustanovili koji
nama zanimljivi servisi nam stoje na raspolaganju te tko ih daje i pod kojim uvjetima.
3. Izbor servisa. Iz skupa mogućih kandidata koje smo otkrili biramo one servise koji
najbolje mogu implementirati aktivnosti iz našeg workflow-a.
4. Profinjenje workflow-a. Na osnovu informacija o izabranim servisima profinjujemo
polazni workflow. To znači da dodajemo detalje o operacijama i parametrima te možda
dodajemo ili izbacujemo aktivnosti. Da bi se izabrani servisi što bolje mogli upotrijebiti,
često je potrebno napraviti manje kompromise u funkcionalnosti aplikacije.
5. Stvaranje workflow-programa. Profinjeni workflow pretvaramo u izvršivi program. U tu
svrhu koristimo konvencionalni programski jezik poput Java ili C#, ili specijalizirani jezik
WS-BPEL.
6. Testiranje aplikacije. Provjerava se da li workflow-program stvoren u prethodnom koraku
ispravno radi i da li on zadovoljava uvjete iz specifikacije.
Oblikovanje
polaznog Otkrivanje
servisa Izbor servisa
workflow-a
Aplikaciju koja koristi web servise možemo oblikovati kao obični korisnički program ili kao
novi složeni web servis. Ako je naša aplikacija ustvari novi servis, onda i njoj moramo
definirati odgovarajuće sučelje te ga opisati u WSDL-u.
Slika 6.26 sadrži primjer jednostavnog BPMN dijagrama. Riječ je o workflow-u aplikacije
koja klijentu avionske kompanije omogućuje ne samo kupovinu avionske karte, nego također
i rezervaciju hotelske sobe u odredišnom gradu, narudžbu rent-a-car-a ili taksija te kupovinu
ulaznica za kazalište. Prikazane aktivnosti zapravo su pozivi web servisa – prvi servis pripada
avionskoj kompaniji a preostali su vanjski servisi iz odredišnog grada. Puna strelica na
dijagramu predstavlja tok kontrole, a crtkana strelica tok podataka.
Pokušaj ponovo
Odustani
Nema soba Hoteli
NijeRaspoloživo
Hoteli Hoteli
DajZahtjeve ProvjeriRaspoloživost
Hoteli
Ima soba RezervirajSobe
Hoteli
PotvrdiRezervaciju
Kupac
Dijagram sa slike 6.26 pretpostavljao je da će se nacrtane aktivnosti uvijek moći izvršiti jedna
za drugom. No u stvarnosti su moguće razne komplikacije. Na primjer, nakon što je putnik
kupio avionsku kartu, možda će se kod rezervacije hotela ustanoviti da ne postoji slobodna
hotelska soba u zadanom razdoblju. Dizajner workflow-a mora predvidjeti takvu situaciju te
omogućiti putniku ili promjenu datuma putovanja ili odustajanje od kupovine avionske karte.
Na slici 6.27 prikazan je još jedan BPMN dijagram. Njime se djelomično profinjuje dijagram
s prethodne slike, to jest razrađuje se aktivnost rezervacije sobe u hotelu. Definira se postupak
u slučaju kad nema slobodne sobe. Vidimo još neke grafičke elemente iz BPMN-a, na primjer
rombove koji predstavljaju donošenje odluke.
Literatura
Općeniti udžbenici o softverskom inženjerstvu:
1. Sommerville I.: Software Engineering, 9-th Edition. Pearson Education Inc, Boston MA,
USA, 2010. ISBN 0-13-705346-0.
2. Van Vliet H.: Software Engineering - Principles and Practice, 3-rd Edition. John Wiley
and Sons, Chichester, England UK, 2008. ISBN 0-470-03146-8.
3. Pressman R.S.: Software Engineering - A Practitioner’s Approach, 7-th Edition.
McGraw Hill, New York NY, USA, 2009. ISBN 0-07-337597-7.
4. Schach S.R.: Object Oriented and Classical Software Engineering, 8-th Edition.
McGraw Hill, New York NY, USA, 2010. ISBN 0-07-337618-3.
5. Braude E.J., Bernstein M.E.: Software Engineering – Modern Approaches. John Wiley
and Sons, New York NY, USA, 2010. ISBN 0-471-69208-5.
6. Pfleeger S.L, Atlee J.M.: Software Engineering - Theory and Practice, 4-th Edition.
Prentice Hall, Englewood Cliffs NJ, USA, 2009. ISBN 0-13-606169-9.
7. Tsui F., Karam O., Bernal B.: Essentials of Software Engineering, 3-rd Edition. Jones &
Bartlett Publishers, Sudbury MA, USA, 2013. ISBN 1-4496-9199-4.
20. Pilato C.M., Collins-Sussman B., Fitzpatrick B.W.: Version Control with Subversion. 2-
nd Edition. O’Reilly and Associates, Sebastopol CA, USA, 2008. ISBN: 0596510330.
21. Szyperski, C.: Component Software – Beyond Object-oriented Programming. 2-nd
edition. Addison-Wesley, Harlow UK, 2001. ISBN: 0-201-17888-5.
22. Newcomer E., Lomow G.: Understanding SOA with Web Services. Addison-Wesley,
Boston MA, USA, 2005. ISBN: 0-321-18086-0.
23. Erl T.: Service-Oriented Architecture – Concepts, Technology and Design. Prentice Ha..,
Upper Saddle River NJ, USA, 2005. ISBN: 0-13-185858-0.
24. Richardson L., Ruby S.: RESTful Web Services. O’Reilly media Inc, Sebastopol CA,
USA, 2007. ISBN: 0-596-52926-0.
25. White S.A., Miers D.: BPMN Modeling and Reference Guide – Understanding and Using
BPMN. Future Strategies Inc, Lighthouse Point FL, USA, 2008. ISBN: 0-9777527-2-0.