U ovoj lekciji obrađivaćemo:
Apstrakcija i sakrivanje informacija omogućavaju da se ispitaju načini na koje su komponente međusobno povezane u sveukupni dizajn. U većini projekata se trudimo da komponente budu što nezavisnije jedna od druge. Komponentu koja nije na složen način vezana sa drugima nije samo lakše shvatiti već se nezavisne komponente takođe mnogo lakše menjaju. Kada se analizom koda utvrdi da greška u sistemu potiče iz dizajna, razlog će se lakše izolovati i ispraviti ako su komponente nezavisne.
Za prepoznavanje i merenje stepena nezavisnosti komponenti u dizajnu koriste se dva koncepta:
Jaka spregnutost: Dve komponente su jako spregnute ako između njih postoji velika zavisnost.
Slaba spregnutost: Komponente imaju neku međuzavisnost, ali je njihova međusobna spregnutost slaba.
Nespregnute komponente nemaju nikakve međusobne veze, one su potpuno nezavisne.
Primeri su dati na slici:
Slika 1.
Komponente mogu da zavise jedna od druge na mnogo načina, pa međusobna spregnutost zavisi od nekoliko stvari:
Slika 2.
Realno je malo verovatno napraviti sistem od potpuno nespregnutih komponenti. Naizgled nespregnute komponente može indirektno da povezuje kontekst u kome se koriste (npr. stolice). Cilj nije obavezno potpuna nespregnutost, već da sprega bude što slabija, tj. želimo što manju zavisnost među komponentama. Ako neka sistemska aktivnost utiče na jedan element, uvek želimo da znamo koja je komponenta sistema proizvela taj uticaj u datom trenutku. To nam dozvoljava da promenom jednog dela dizajna sistema izazovemo što manje poremećaja. Idealno bi bilo kad bismo prosto mogli jednu komponentu da zamenimo drugom. Ako imamo modularan dizajn sa slabim vezivanjem među komponentama, mogao bi da se primeni scenario izvadi - stavi. Ako je vezivanje slabo, promenom će biti pogođeno samo nekoliko drugih komponenti koje će morati da se promene ili zamene. Ako je vezivanje jako, tada promena može da utiče na veliki deo sistema. Prema tome, slabo vezivanje pomaže da broj komponenti koje treba prepraviti ostane minimalan.
Sprega preko sadržaja
Neki tipovi međuzavisnosti su manje poželjni od drugih. Najnepoželjniji slučaj je kada jedna komponenta sasvim menja drugu komponentu. Tada promenjena komponenta potpuno zavisi od komponente koja je menja. Ovo se naziva spregnutost preko sadržaja. Spregnutost preko sadržaja nastupa kada jedna komponenta menja interni podatak u drugoj komponenti.
Sprega preko zajedničkih delova
Moguće je donekle smanjiti stepen međuzavisnosti ako dizajn organizujemo na takav način da podaci budu dostupni iz zajedničkog skladišta podataka. Međutim, sprega i dalje postoji zato što prilikom promene zajedničkih podataka moramo da ispitamo sve komponente koje tim podacima pristupaju da bi se procenio efekat promene. Ova vrsta zavisnosti naziva se sprega preko zajedničkih delova. Kod spregnutosti preko zajedničkih delova ponekad je teško odrediti koja komponenta je dodelila promenljivoj određenu vrednost. Na slici je prikazano je kako funkcioniše ovaj vid međuzavisnosti:
Slika 3.
Sprega preko kontrole
Kada jedna komponenta predaje parametre za kontrolisanje rada druge komponente, kažemo da između te dve komponente postoji sprega preko kontrole. Kontrolisana komponenta ne može da funkcioniše bez uputstva iz komponente koja vrši kontrolu. U dizajnu koji sadrži ovaj vid međuzavisnosti bilo bi bolje da svaka komponenta izvršava samo jednu funkciju ili jedan proces. Tako se smanjuje količina kontrolnih informacija koja se prenosi iz jedne komponente u drugu i kontrola se ograničava na fiksiran i prepoznatljiv skup parametara koji obrazuje dobro definisan interfejs.
Sprega preko markera i sprega preko podataka
Kada se za prenos informacija iz jedne komponente u drugu koristi struktura podataka, pa se prenosi cela struktura podataka, kažemo da među komponentama postoji sprega preko markera. Ako se predaju samo podaci, kažemo da postoji sprega preko podataka. Ako postoji sprega preko markera, u komponentama moraju da postoje identičan format i organizacija. Prema tome, sprega preko podataka je jednostavnija i daje manju verovatnoću greške. Ako između komponenti mora da postoji veza, najpoželjnija je sprega preko podataka, jer se podaci najlakše prate kada treba uneti promene.
Komponente u objektno orijentisanom dizajnu obično su slabo spregnute, pošto svaka definicija objekta komponente sadrži definicije akcije koje ona izvršava i koje se vrše nad njom. Shodno tome, kada se izabere objektno orijentisani pristup, automatski se dobija slaba spregnutost.
Za razliku od merenja međusobne zavisnosti komponenti, kohezija se odnosi na unutrašnji „lepak" kojim je komponenta izgrađena. Ako komponenta ima veliku koheziju, njeni unutrašnji delovi su jače vezani jedni za druge i za njenu osnovnu svrhu. Drugim rečima, komponenta je kohezivna ako svi njeni elementi služe izvršavanju istog zadatka i bitni su za to izvršavanje. Na slici su prikazane vrste kohezija.
Slika 4.
Zajednički cilj dizajna bio je da svaka komponenta bude što kohezivnija tako da svi delovi obrade u komponenti budu usmereni na njenu jedinstvenu funkciju. Ovu definiciju možemo promeniti da bi bila primenjiva na sve vrste dekompozicije, tj. možemo da pravimo nivoe kohezije za komponente bez obzira na način kojim je izvršena dekompozicija. Na slici je prikazano nekoliko vrsti kohezija.
Nekad koristimo jednu komponentu za inicijalizovanje sistema ili skupa promenljivih. Takva komponenta izvršava nekoliko funkcija u nizu, ali su funkcije povezane jedino po vremenu izvršavanja - vremenska kohezija. Komponente sa vremenskom i logičkom kohezijom teško se menjaju. Npr. pretpostavimo da se menja dizajn sistemske funkcije X. Pošto logički ili vremenski kohezivne komponente izvršavaju više različitih funkcija, promenom funkcije X, moraju se pretražiti sve komponente u cilju pronalaženja delova koji utiču na funkciju X.
Često neke funkcije moraju da se izvršavaju u određenom redosledu. Npr. podatke treba prvo uneti da bi mogli da se provere a zatim sa njima manipulisati: tri funkcije u zadatom redosledu.
Kada se funkcije grupišu u jednu komponentu samo da bi se obezbedio taj redosled, kažemo da je komponenta proceduralno kohezivna. Drugi način je da udružimo neke funkcije zato što se izvršavaju nad istim podacima. Npr. ponekad se istovremeno preuzimaju nepovezani podaci zato što se preuzimanje može izvršiti jednim pristupom disku ili traci. Komponente koje su sastavljene na ovaj način su komunikaciono kohezivne. Komunikaciona kohezija često remeti modularnost i funkcionalnu nezavisnost dizajna.
Ako se izlaz iz jednog dela neke komponente koristi kao ulaz u sledeći njen deo, kažemo da komponenta ima sekvencijalnu koheziju. Pošto ni takva komponenta nije napravljena na osnovu funkcionalnih relacija, mogućno je da ta komponenta ne obuhvata svu obradu jedne funkcije. Ideal kome težimo jeste funkcionalna kohezija, u kojoj je svaki element obrade bitan za izvršavanje samo jedne funkcije i u kojem se svi bitni elementi nalaze u jednoj komponenti.
Funkcionalno kohezivna komponenta izvršava samo funkciju za koju je projektovana, samo tu funkciju i ništa više.
Na slici su dati primeri kohezija:
Slika 5.
Kohezija kod OO dizajna
Pojam kohezije može se proširiti na objektno orijentisane i druge vrste dizajna u kojima se komponente zasnivaju na podacima ili na događajima. Objektno orijentisani sistemi često imaju veoma kohezivan dizajn pošto ih postupak izgradnje primorava da postave akcije uz objekat nad kojim se izvršavaju. Npr. kažemo da je komponenta objektno orijentisanog dizajna kohezivna ako su svi njeni atributi, metodi ili akcije bitni za objekat.