3. Komponentit ja rajapinnat 3.1 Komponenttien idea: ohjelmistotuotannon rationalisointi 3.2 Mikä on ohjelmistokomponentti? 3.3 Komponentit ohjelmistoyksikköinä 3.4 Rajapinnat 3.5 Rajapintojen sopimuspohjainen määrittely 3.6 Komponenttien räätälöinti 1
3.1 Komponenttien idea: ohjelmistotuotannon rationalisointi Tuotteiden rakentaminen komponenteista tuotteista tulee luotettavampia tuotteita on nopeampi rakentaa rakentajia on helpompi kouluttaa komponenttimarkkinat ja kilpailu alentavat hintoja Sovelletaan lähes kaikilla tekniikan aloilla 2
Harjoitus: Anna 5 ominaisuutta, jotka ovat hyväll llä ohjelmistokomponentilla 3
Sovellusten koostaminen komponenteista Tavoite: sovellus kootaan olemassaolevista komponenteista Työkaluja: skriptit, XML, visuaaliset koostamistyökalut 4
Esimerkki: BeanBox (Sun) 5
3.2 Mikä on ohjelmistokomponentti? Komponentti = itsenäinen ohjelmistoyksikkö, joka tarjoaa palveluja hyvin määritellyn rajapinnan kautta Szyperski: A software component is a unit of composition with contractually specified interfaces and explicit context dependencies only. A software component can be deployed independently and is subject to composition by third parties. 6
Komponenttien ominaisuuksia Itsenäisyyden aste Käyttöönottotapa Koko Standardointi Teknologia-spesifit ominaisuudet 7
3.3 Komponentit ohjelmistoyksikköin inä Arkkitehtuurin yksikkö: Toiminnallisuuden yksikkö mikä osa vastaa tietystä toiminnallisuudesta? Uudelleenkäytön yksikkö mikä osat ovat yhteisiä eri tuotteissa? Tuotekonfiguraation yksikkö mitä osia kuuluu tuotteeseen? Käyttöönoton yksikkö mitkä osat voidaan ottaa erikseen käyttöön? Muuntelun yksikkö mitkä osat voidaan vaihtaa toisiksi? Ulkopuolisen kehityksen yksikkö mitkä osat voidaan saada muualta? Työnjaon yksikkö mitkä osat tuotetaan tietyillä henkilöillä/yksiköillä? 8
Historia: A M 3.4 Rajapinnat rajapinta Abstrakti luokka X tyhjä toteutus B C tietorakenteet A Y Z aliohjelmia B tietorakenteet tietorakenteet Aliohjelmakirjasto C A A Palvelun kutsumuoto (signature) Palvelun toteutus moduuli Moduulikirjasto B C luokka B C Luokkakirjasto 9
Rajapinnat itsenäisin isinä ohjelmayksikköin inä Komponentti A Rajapinta 1 Rajapinta 2 Komponentti B Rajapinta 3 Rajapinta 4 10
Tarjotut ja vaaditut rajapinnat UML 2.0:ssa PowerSource tarjottu rajapinta Car Engine PowerSource vaadittu rajapinta Car PowerSource Engine 11
Toteutus Javalla interface PowerSource { void start(); int temperature(); void stop(); class Engine implements PowerSource... {... public void start() {... public int temperature() {... public void stop() {... class Car... {... private PowerSource eng;... public void seteng(powersource e) { eng = e; public void run() {... eng.start();... eng.stop();... 12
Portit UML 2.0:ssa Vuorovaikutuksen mahdolllistava kontaktipiste komponentin ja sen ympäristön välillä PowerSource PowerSource Portti Engine host Engine Warnings Warnings 13
3.5 Rajapintojen sopimuspohjainen määm äärittely design-by-contract (Eiffel) tuloehto: täytyy päteä kun palvelua kutsutaan Palvelun pyytäjä palvelun rajapinta Palvelun tarjoaja Tulo- ja jättöehdot määrittelevät palvelun merkityksen sallivat osapuolten vaihtamisen, kunhan tulo- ja jättöehdot pysyvät voimassa määräävät tarkistusvastuun osapuolten välillä jättöehto: täytyy päteä kun palvelu on suoritettu, olettaen että tuloehdot olivat voimassa kun palvelu aloitettiin 14
Luokka/komponentti invariantit Person age: int toberetired: int op1(...) op2(...) op3(...) invariant age > 0 & age < toberetired 15
Periytyminen & tulo- ja jättj ttöehdot pre' post' pre post A public oper(...) pre post pre' pre post' post B public oper(...) pre' post' pre pre' post' post C pre post' Mikä on oikea vaihtoehto (A,B,C,D)? pre' post D 16
Esimerkki Oletetaan, että teet sopimuksen verhoilijan kanssa: sinä toimitat kankaan, tuolin, maksun ja viinapullon, ja verhoilija toimittaa kuukauden kuluessa verhoillun tuolin tietyin laatukriteerein. Verhoilija sairastuu ja hän ehdottaa että työn tekee toinen verhoilija. Tällä on kuitenkin erilaiset toimintatavat. Millaisia voivat olla uuden verhoilijan toimintatavat, jotta verhoilijan vaihto olisi sinulle merkityksetön? 17
Esimerkki (jatkuu) Esimerkiksi: Onko ok, että uusi verhoilija haluaa tuolin, kankaan ja maksun, ja toimittaa verhoillun tuolin viikon sisään? Onko ok, että uusi verhoilija haluaa tuolin, kankaan, maksun viinapullon ja lipun Tapparan matsiin, ja toimittaa verhoillun tuolin kahden kuukauden kuluttua? 18
Design by contract: esimerkki (1) class Stack { private Object [] storage; private int top; public Stack(int size) { storage = new Object[size]; top = -1; public int size() {return top+1 public boolean full() {return top == storage.length; public void push(object x) { if (top < storage.length-1) { storage[++top] = x; else { System.out.println("Overflow"); 19
Design by contract: esimerkki (2) public Object pop() { // don t worry about memory leaks here if (top >= 0) { return storage[top--]; else { System.out.println("Underflow"); return null; client:... if s.size() > 0 then {s.pop(); else {... error handling...... Ongelmia? 20
Design by contract: esimerkki (3) Tulo- ja jättöehtoja käyttämällä: interface Stack { Object pop() // pre size() > 0; // post size = old size 1; class ArrayStack implements Stack { public Object pop() { return storage[top--]; Todista, että tuo- ja jättöehdot ovat aina voimassa (?) Generoi koodi, joka tarkistaa että tulo- ja jättöehdot ovat aina voimassa (?) 21
Käytännöllinen ratkaisu: poikkeukset poikkeus = palvelun tarjoaja ei pysty täyttämään sopimusta palvelumetodi joko täyttää sopimuksen tai aiheuttaa poikkeuksen edellyttää, että palvelun tarjoaja pystyy havaitsemaan kyvyttömyytensä poikkeuksista tulee osa rajapintaa ei edellytä formaaleja tulo- ja jättöehtoja public Object pop() throws Underflow { // pre: stack non-empty // post: stack size reduced by one // Underflow: stack is empty upon entry if (top >= 0) { return storage[top--]; else { throw new Underflow(this); 22
3.6 Komponenttien räär äätälöinti komponentin (alku)tilan muuttaminen vaadittujen rajapintojen toteutuksen antaminen tai muuttaminen aliluokittaminen 23
Komponentin alkutilan muuttaminen Client :Comp ServicesI setproperty(...) Comp create setproperty(...) use 24
Javalla: class Button extends Component... {... String label; public Button() {... public Button(String arg) { label = arg;... public setlabel(string arg) { label = arg;... 25
Vaadittujen rajapintojen toteutuksen antaminen tai muuttaminen ActionListener Button AppLogic ActionListener XLogic 26
Aliluokittaminen Button CompanyButton 27
Javalla: class CompanyButton extends Button { public CompanyButton(String arg) { super(arg); label = arg.touppercase(); public void setlabel(string arg) { label = arg.touppercase(); 28
Särkyvän n yliluokan ongelma Kirjasto komponentti Comp Viaton" muutos alkuperäiseen komponenttiin voi tehdä räätälöidystä komponentista toimimattoman Räätälöity komponentti Custom 29
Esimerkki (1) <<interface>> Container addelement(object) addcontainer(container) List addcontainer: {...addelement(...);... <<interface>> CountedContainer getcount() CountedList addelement: { super.addelement(...); counter++; 30
Esimerkki (2) addelement:iä ei enää kutsuta! <<interface>> Container addelement(object) addcontainer(container) List addcontainer: {... <<interface>> CountedContainer getcount() CountedList addelement: { super.addelement(...); counter++; 31