300 likes | 312 Views
Komponens-elvű alkalmazásfejlesztés. Vég Csaba <vega@dragon.klte.hu>. KLTE. A kezdetek. ‘60-as évek vége szoftver-krízis McIlroy (‘68): “mass produced components would end the sw. crisis” sw. komponensek: “sw. IC-k” (McIlroy ) Modul: adott követelmények, architektúra,
E N D
Komponens-elvű alkalmazásfejlesztés Vég Csaba<vega@dragon.klte.hu> KLTE
A kezdetek • ‘60-as évek végeszoftver-krízis • McIlroy (‘68): “mass produced components would end the sw. crisis” • sw. komponensek: “sw. IC-k” (McIlroy ) • Modul: • adott követelmények, • architektúra, • tervezési és implementációs mód
OO fejlesztés • OO előnyök: • flexibilitás • áttekinthetőség • módosíthatóság • OO fejlesztés kockázata: • nagyobb szaktudás • kevesebb tapasztalat • nincs elméleti háttere
OO vs. components • Sikeres OO fejlesztés: • komponens-elv alkalmazása • „Object orientation has failed but component software is succeeding.” (Udell, ‘94) • sw. komponens a rendszer izolálható része • Objektum: állapot és viselkedés egységbezárása, polimorfizmus és öröklés • nincs: függetlenség (independence) és későikompozíció (late composition) • “The OO techniques are too flexible, they allow too much dependencies”
„de működik...” • OO fejlesztés: • példák • „kevés elmélet sok gyakorlattal” • Stratégia: architektúrális és tervezési tapasztalat • Kipróbált tervezési módszerek újrafelhasználása • Komponens: „szaktudás-konzerv”
Sw. komponens “A software component is a unit of composition with contractually specified interfaces and explicit context dependencies only. A sw. component can be deployed independently and is subject to compositionby third parties”(‘96 ECOOP workshop) Nomen est omen: “components are for composition”
Szempontok • Technológiai szempont: • late integration • komponens-architektúra (wiring) • Komponens-elv: • a használat előtérbe helyeződése(funkcionális-csomópontok) • az elemek funkciókon keresztül kezelhetők (nem pedig közvetlenül)
Komponens-elv (absztrakció) • Komponens-elv a tervezésben és programozásban • adott (nem tetszőleges) módon programozunk • attribútumok helyett tulajdonságok (property)(olvasó/író metódusok) • elnevezések • elemek elrendezése • „szabvány” szerinti forma, tapasztalat közvetlen megszerzése • könnyebben értelmezhető, struktúrája könnyebben azonosítható • könnyebben módosítható
Könnyen tanítható... (KLTE: Java + OO szemlélet +komponens-szemlélet) • Egy másodpercekben megadott időtartam alapján írjuk ki, hogy az hány óra, hány perc és hány másodperc! Időtartam: getÓra():int getPerc():int getMásodperc():int getÖsszesMásodperc():int setÖsszesMásodperc(mp: int)
abstract class Text private char[] text = new char[100]; private int used = 0; private int caret = 0; // maximum length of text int max() { return text.length; } // current length of text int length() { return used; } // read character at position pos char read(int pos) { return text[pos]; } // insert or append ch at position pos void write(int pos, char ch) { for (int i=used; i>pos; i--) text[i] = text[i - 1]; used++; if (caretPos()>=pos) setCaret(caret+1); text[pos] = ch; } // current caret position int caretPos() { return caret; } // set caret position void setCaret(int pos) { caret = pos; } // delete character at position pos void delete(int pos) { used--; for (int i=pos; i<used; i++) //shift trailing text[i] = text[i + 1]; //characters left if (caretPos() >= pos) setCaret(caret - 1); } // insert character at current caret pos void type(char ch) { int pos = caretPos(); write(pos, ch); setCaret(pos + 1); } // rubout char before current caret pos void rubout() { int pos = caretPos(); delete(pos - 1); setCaret(pos - 1); }
abstract class Text max(): int length(): int read(pos:int) write(pos: int, ch: char) caretPos(): int setCaret(pos:int) delete(pos:int) type(ch:char) rubout()
abstract class Text private char[] text = new char[100]; private int used = 0; private int caret = 0; // maximum length of text int max() { return text.length; } // current length of text int length() { return used; } // read character at position pos char read(int pos) { return text[pos]; } // insert or append ch at position pos void write(int pos, char ch) { for (int i=used; i>pos; i--) text[i] = text[i - 1]; used++; if(caretPos()>=pos) setCaret(caret+1); text[pos] = ch; } // current caret position int caretPos() { return caret; } private char[] character = new char[100]; private int length = 0; private int caretPos = 0; int getMaximumLength() { return character.length;} int getLength() { return length; } char getCharacter(int p) { return character[p];} void insertCharacter(int p, char c) { for (int i=length; i>p; i--) character[i]= character[i-1]; length++; if (getCaretPos()>=p) setCaretPos(caretPos+1); text[p] = ch; } int getCaretPos() { return caretPos; }
abstract class Text // set caret position void setCaret(int pos) { caret = pos; } // delete character at position pos void delete(int pos) { used--; for (int i=pos; i<used; i++) text[i] = text[i + 1]; if(caretPos()>=pos) setCaret(caret-1); } //insert character at current caret pos void type(char ch) { int pos = caretPos(); write(pos, ch); setCaret(pos + 1); } //rubout char before current caret pos void rubout() { int pos = caretPos(); delete(pos - 1); setCaret(pos - 1); } void setCaretPos(int pos) {caretPos = pos;} void removeCharacter(int p) { length--; for (int i=p; i<length; i++) character[i] = character[i + 1]; if (getCaretPos()>=p) setCaretPos(caretPos-1); } void insertCharacter(char c) { insertCharacter(getCaretPos(), c); } void ruboutCharacter() { setCaretPos(getCaretPos()-1); removeCharacter(getCaretPos()); }
abstract class Text max(): int length(): int read(pos:int) write(pos: int, ch: char) caretPos(): int setCaret(pos:int) delete(pos:int) type(ch:char) rubout() getMaximumLength(): int getLength(): int getCharacter(pos:int): char insertCharacter(pos:int, ch:char) getCaretPos(): int setCaretPos(pos:int) removeCharacter(pos:int) insertCharacter(ch:char) ruboutCharacter()
abstract class Text getMaximumLength(): int getLength(): int getCharacter(pos:int): char insertCharacter(p:int, c:char) getCaretPos(): int setCaretPos(pos:int) removeCharacter(pos:int) insertCharacter(ch:char) ruboutCharacter() getCaretPos(): int setCaretPos(pos:int) getMaximumLength(): int getLength(): int setLength(l:int) getCharacter(pos:int): char getCharacter(): char setCharacter(pos:int, ch: char) setCharacter(ch: char) insertCharacter(pos:int, ch:char) insertCharacter(ch:char) removeCharacter(pos:int) removeCharacter() ruboutCharacter()
Text +caret position: int {rw} +maximum length: (...) +length: int +character: Buffer<100,char> {rw} +get character(pos:int= caret position): char +insert character(pos:int= caret position, ch:char) +remove character(pos:int= caret position) +rubout character() Buffer<n, element:T> +get element(position:int): T +set element(position :int, element: T) +insert element(position:int, element:T) +remove element(position :int)
+caret position: int +character: Buffer<100,char, position=caret position> {rw} +rubout character() Buffer<n, element:T> +maximum length: (n) +length: int +get element(position: int): T +set element(position: int, element: T) +insert element(position: int, element:T) +remove element(position:int)
UML • Unified Modeling Language • szabványos • objektumorientált • vizuális • modellező nyelv
UML komponens-elvű kiterjesztése • Tulajdonságok • /d: double // számított • x: double // lekérdezhető, de nem beállítható • y: double // lekérdezhető és beállítható • z: double // beállítható, de nem lekérdezhető
+xx: double private double xx; // ha nem származtatott public double getXx() {return xx;} // ha olvasható public void setXx(double xx_) {xx=xx_;} // ha írható
public class Téglalap private double a; public double getA() { return a; } public void setA(double a_) { a=a_; } private double b; public double getB() { return b; } public void setB(double b_) { b=b_; } public double getKerület() { return 2*(a+b); } public double getTerület() { return a*b; }
Tárolt származtatott attribútum +/size: Size {cached} -size: Size -validSize: Bool +computeSize(): Size +invalidSize() { validSize=false; } +getSize(): Size { if(!validSize) { size=computeSize(); validSize=true; } return size; }
Asszociáció (1 és 0..1) -alkalmazó: Cég -- ha nem származtatott +getAlkalmazó(): Cég -- ha olvasható +setAlkalmazó(alkalmazó_: Cég) -- ha írható +hasAlkalmazó()? -- ha olvasható +removeAlkalmazó() -- ha törölhető
Asszociáció ( * ) -alkalmazott :Set<Személy> +hasAlkalmazott()? +hasAlkalmazott(alkalmazott_: Személy)? +everyAlkalmazott(): Every<Személy> +addAlkalmazott(alkalmazott_: Személy) +removeAlkalmazott(alkalmazott_: Személy) +removeAllAlkalmazott() alkalmazott: Set< Személy>
Minősítő könyv[ISBN: Int]: Könyv +hasKönyv(ISBN: Int)? -- ha olvasható +getKönyv(ISBN: Int): Könyv -- ha olvasható +setKönyv(ISBN: Int, könyv_: Könyv) -- ha új felvihető +removeKönyv(ISBN: Int) -- ha törölhető +everyKönyvISBN(): Every<Int> -- ha olvasható
Strukturális terhelés • A generikus szerkezet csak lehetőségeket ad meg • Automatikus választás a szerkezetek közül • A tényleges funkciók a használat („terhelés”) alapján lesznek összeválogatva • teszt/példa • Optimalizálás • Jövő („a konzerv felnyitása”): • Dinamikus terhelés • közvetlenül újrafelhasználható szaktudás
Komponens-elvű alkalmazásfejlesztés • Komponens elv alkalmazása az analízisben • a használat előtérbe helyezése • használati esetek • felhasználó követelményei • felhasználói felületek • belső szerkezet felderítése • belső architektúrával kapcsolatos követelmények • CRC kártyák • komponensek • RDD
Irodalom • C. Szyperski.Component Software. Beyond Object-oriented programming.Addison-Wesley.(elméleti áttekintés, alapelvek, technológiák áttekintése) • Vég Cs., dr. Juhász I.Java - start!Logos 2000., 1999. nov.(alapfokú Java és programozás-tankönyv; OO és kompo-nens-elv alapismeretei, vázlat vizuális jelölésekkel) • Vég Cs. Alkalmazásfejlesztés a Unified Modeling Language szabványos jelöléseivel.Logos 2000., 1999. máj.(UML ismertetése, OO szemlélet, UML komponens-elvű kiterjesztése, RDD alkalmazásfejlesztési módszer) <www.logos2000.hu>