1 Komponens-elvű alkalmazásfejleszt és KLTE KLTE Vég Csaba Vég Csaba <[email protected]> <[email protected]>
Mar 17, 2016
1
Komponens-elvű alkalmazásfejleszté
s
KLTEKLTE
Vég CsabaVég Csaba <[email protected]><[email protected]>
2
A kezdetekA kezdetek ‘‘60-as évek vége60-as évek vége
szoftver-krízisszoftver-krízis
McIlroy (‘68): “mass produced components would end the McIlroy (‘68): “mass produced components would end the sw. crisis”sw. crisis” sw. komponensek: “sw. IC-k” (McIlroy )sw. komponensek: “sw. IC-k” (McIlroy )
Modul: Modul: adott követelmények, adott követelmények, architektúra, architektúra, tervezési és implementációs módtervezési és implementációs mód
3
OO fejlesztésOO fejlesztés OO előnyök:OO előnyök:
flexibilitásflexibilitás áttekinthetőségáttekinthetőség módosíthatóságmódosíthatóság
OO fejlesztés kockázata:OO fejlesztés kockázata: nagyobb szaktudásnagyobb szaktudás kevesebb tapasztalatkevesebb tapasztalat nincs elméleti hátterenincs elméleti háttere
4
OO vs. componentsOO vs. components Sikeres OO fejlesztés:Sikeres OO fejlesztés:
komponens-elv alkalmazásakomponens-elv alkalmazása „„Object orientation has failed but component Object orientation has failed but component
software is succeeding.” (Udell, ‘94)software is succeeding.” (Udell, ‘94) sw. komponenssw. komponens a rendszer izolálható része a rendszer izolálható része ObjektumObjektum: állapot és viselkedés egységbezárása, : állapot és viselkedés egységbezárása,
polimorfizmus és örökléspolimorfizmus és öröklés nincs: nincs: függetlenségfüggetlenség (independence) és (independence) és
későikésői kompozíciókompozíció (late composition) (late composition) ““The OO techniques are too flexible, they allow too The OO techniques are too flexible, they allow too
much dependencies”much dependencies”
5
„„de működik...”de működik...” OO fejlesztés:OO fejlesztés:
példákpéldák „„kevés elmélet sok gyakorlattal”kevés elmélet sok gyakorlattal”
Stratégia: architektúrális és tervezési tapasztalatStratégia: architektúrális és tervezési tapasztalat Kipróbált tervezési módszerek újrafelhasználásaKipróbált tervezési módszerek újrafelhasználása
Komponens: „szaktudás-konzerv”Komponens: „szaktudás-konzerv”
6
Sw. komponensSw. komponens
““A A software component software component is is a unit of composition with a unit of composition with contractually specified contractually specified interfaces and explicit interfaces and explicit context dependencies context dependencies only. A sw. component only. A sw. component can be deployed can be deployed independentlyindependently and is and is subject to compositionsubject to composition by third parties”by third parties” (‘96 ECOOP workshop)(‘96 ECOOP workshop)
Nomen est omen: “components are for composition”
7
SzempontokSzempontok Technológiai szempont:Technológiai szempont:
late integrationlate integration komponens-architektúra (wiring)komponens-architektúra (wiring)
Komponens-elv:Komponens-elv: a használat előtérbe helyeződésea használat előtérbe helyeződése
(funkcionális-csomópontok)(funkcionális-csomópontok) az elemek funkciókon keresztül kezelhetők az elemek funkciókon keresztül kezelhetők
(nem pedig közvetlenül)(nem pedig közvetlenül)
8
Komponens-elv (absztrakció)Komponens-elv (absztrakció) Komponens-elv a tervezésben és programozásbanKomponens-elv a tervezésben és programozásban
adott (nem tetszőleges) módon programozunkadott (nem tetszőleges) módon programozunk–attribútumok helyett tulajdonságok attribútumok helyett tulajdonságok (property)(property)
(olvasó/író metódusok)(olvasó/író metódusok)–elnevezésekelnevezések–elemek elrendezéseelemek elrendezése
„„szabvány” szerinti forma, szabvány” szerinti forma, tapasztalat közvetlen megszerzésetapasztalat közvetlen megszerzése
könnyebben értelmezhető, könnyebben értelmezhető, struktúrája könnyebben azonosíthatóstruktúrája könnyebben azonosítható
könnyebben módosíthatókönnyebben módosítható
9
Könnyen taní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():intgetMásodperc():intgetÖsszesMásodperc():intsetÖsszesMásodperc(mp: int)
10
abstract class Text 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 textint length() { return used; }// read character at position poschar read(int pos) { return text[pos]; } // insert or append ch at position posvoid 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 positionint caretPos() { return caret; } // set caret positionvoid setCaret(int pos) { caret = pos; } // delete character at position posvoid 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 posvoid type(char ch) { int pos = caretPos(); write(pos, ch); setCaret(pos + 1); }// rubout char before current caret posvoid rubout() { int pos = caretPos(); delete(pos - 1); setCaret(pos - 1); }
11
abstract class Text abstract class Text max(): intlength(): intread(pos:int)write(pos: int, ch: char) caretPos(): intsetCaret(pos:int)delete(pos:int)type(ch:char)rubout()
12
abstract class Text 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 textint length() { return used; }// read character at position poschar read(int pos) { return text[pos]; } // insert or append ch at position posvoid 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 positionint 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; }
13
abstract class Text abstract class Text // set caret positionvoid setCaret(int pos) { caret = pos; } // delete character at position posvoid 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 posvoid type(char ch) { int pos = caretPos(); write(pos, ch); setCaret(pos + 1); }//rubout char before current caret posvoid 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()); }
14
abstract class Text abstract class Text
max(): intlength(): intread(pos:int)write(pos: int, ch: char) caretPos(): intsetCaret(pos:int)delete(pos:int)type(ch:char)rubout()
getMaximumLength(): intgetLength(): intgetCharacter(pos:int): charinsertCharacter(pos:int, ch:char) getCaretPos(): int setCaretPos(pos:int) removeCharacter(pos:int) insertCharacter(ch:char)ruboutCharacter()
15
abstract class Text abstract class Text
getMaximumLength(): intgetLength(): intgetCharacter(pos:int): charinsertCharacter(p:int, c:char) getCaretPos(): int setCaretPos(pos:int) removeCharacter(pos:int) insertCharacter(ch:char)ruboutCharacter()
getCaretPos(): int setCaretPos(pos:int) getMaximumLength(): intgetLength(): intsetLengthsetLength(l:int)(l:int)getCharacter(pos:int): chargetCharactergetCharacter(): char(): charsetCharactersetCharacter(pos:int, ch: char)(pos:int, ch: char)setCharactersetCharacter(ch: char)(ch: char)insertCharacter(pos:int, ch:char) insertCharacter(ch:char) removeCharacter(pos:int) removeCharacterremoveCharacter()()ruboutCharacter()
16
TextText+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)
17
+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)
18
UMLUML Unified Modeling LanguageUnified Modeling Language
szabványosszabványos objektumorientáltobjektumorientált vizuálisvizuális modellező nyelvmodellező nyelv
19
UML komponens-elvű kiterjesztéseUML komponens-elvű kiterjesztése TulajdonságokTulajdonságok
/d: double // számított/d: double // számított x: double // lekérdezhető, de nem beállíthatóx: double // lekérdezhető, de nem beállítható y: doubley: double // lekérdezhető és beállítható // lekérdezhető és beállítható z: doublez: double // beállítható, de nem lekérdezhető // beállítható, de nem lekérdezhető
Időtartam+/óra: int+/perc: int+/másodperc: int+összesMásodperc: int
20
+xx: double+xx: double
private double xx; // ha nem származtatottprivate double xx; // ha nem származtatottpublic double getXx() {return xx;} // ha olvashatópublic double getXx() {return xx;} // ha olvashatópublic void setXx(double xx_) {xx=xx_;} // ha írhatópublic void setXx(double xx_) {xx=xx_;} // ha írható
Téglalap+a: double+b: double+/kerület: double {2*(a+b)}+/terület: double {a*b}
21
public class Téglalappublic class Téglalap
private double a; private double a; public double getA() { return a; }public double getA() { return a; } public void setA(double a_) { a=a_; } public void setA(double a_) { a=a_; } private double b; private double b; public double getB() { return b; }public double getB() { return b; } public void setB(double b_) { b=b_; }public void setB(double b_) { b=b_; } public double getKerület() { return 2*(a+b); }public double getKerület() { return 2*(a+b); } public double getTerület() { return a*b; }public double getTerület() { return a*b; }
22
Kör+sugár: double+/kerület: double {2*sugár*}+/terület: double {sugár2*}
23
TulajdonságokTulajdonságok
Könyv példány
+raktári szám: Int-státusz: Int+/kölcsönözhető?+/kölcsönzött?+/előjegyzett? +/polcon?+visszahozzák()
Könyv példány
-raktári szám: Int-státusz: Int-kölcsönözhető: Bool
+setKölcsönzött()+setElőjegyzett()+setPolcon()+visszahozzák()+isKölcsönzött(): Bool+isElőjegyzett(): Bool+isPolcon(): Bool+isKölcsönözhető(): Bool+getRktSzám(): Int
24
Tárolt származtatott attribútumTárolt származtatott attribútum
+/size: Size {cached}+/size: Size {cached}
-size: Size-size: Size-validSize: Bool-validSize: Bool+computeSize(): Size +computeSize(): Size +invalidSize() { validSize=false; }+invalidSize() { validSize=false; }+getSize(): Size {+getSize(): Size { if(!validSize) { size=computeSize(); validSize=true; }if(!validSize) { size=computeSize(); validSize=true; } return size;return size; } }
25
Asszociáció (1 és 0..1)Asszociáció (1 és 0..1)
-alkalmazó: Cég -- ha nem származtatott -alkalmazó: Cég -- ha nem származtatott +getAlkalmazó(): Cég -- ha olvasható+getAlkalmazó(): Cég -- ha olvasható+setAlkalmazó(alkalmazó_: Cég) -- ha írható+setAlkalmazó(alkalmazó_: Cég) -- ha írható
+hasAlkalmazó()? -- ha olvasható+hasAlkalmazó()? -- ha olvasható+removeAlkalmazó() -- ha törölhető+removeAlkalmazó() -- ha törölhető
Cég Személy*alkalmazottalkalmazóAlkalmazás
26
Asszociáció ( * )Asszociáció ( * )
-alkalmazott :Set<Személy> -alkalmazott :Set<Személy> +hasAlkalmazott()?+hasAlkalmazott()?+hasAlkalmazott(alkalmazott_: Személy)?+hasAlkalmazott(alkalmazott_: Személy)?+everyAlkalmazott(): Every<Személy> +everyAlkalmazott(): Every<Személy> +addAlkalmazott(alkalmazott_: Személy)+addAlkalmazott(alkalmazott_: Személy)+removeAlkalmazott(alkalmazott_: Személy)+removeAlkalmazott(alkalmazott_: Személy)+removeAllAlkalmazott()+removeAllAlkalmazott()
Cég Személy*alkalmazottalkalmazóAlkalmazás
alkalmazott: Set< Személy>
27
MinősítőMinősítő
könyv[ISBN: Int]: Könyvkönyv[ISBN: Int]: Könyv
+hasKönyv(ISBN: Int)? -- ha olvasható+hasKönyv(ISBN: Int)? -- ha olvasható+getKönyv(ISBN: Int): Könyv -- ha olvasható+getKönyv(ISBN: Int): Könyv -- ha olvasható+setKönyv(ISBN: Int, könyv_: Könyv) -- ha új felvihető+setKönyv(ISBN: Int, könyv_: Könyv) -- ha új felvihető+removeKönyv(ISBN: Int) +removeKönyv(ISBN: Int) -- ha törölhető -- ha törölhető+everyKönyvISBN(): Every<Int> -- ha olvasható+everyKönyvISBN(): Every<Int> -- ha olvasható
KönyvtárKönyv*
0ISBN: Code
28
Strukturális terhelésStrukturális terhelés A generikus szerkezet csak lehetőségeket ad megA generikus szerkezet csak lehetőségeket ad meg
Automatikus választás a szerkezetek közülAutomatikus választás a szerkezetek közül A tényleges funkciók a használat („terhelés”) alapján A tényleges funkciók a használat („terhelés”) alapján
lesznek összeválogatvalesznek összeválogatva teszt/példateszt/példa
OptimalizálásOptimalizálás
Jövő („a konzerv felnyitása”):Jövő („a konzerv felnyitása”): Dinamikus terhelésDinamikus terhelés közvetlenül újrafelhasználható szaktudásközvetlenül újrafelhasználható szaktudás
29
Komponens-elvű alkalmazásfejlesztésKomponens-elvű alkalmazásfejlesztés Komponens elv alkalmazása az analízisbenKomponens elv alkalmazása az analízisben
a használat előtérbe helyezésea használat előtérbe helyezése–használati esetekhasználati esetek– felhasználó követelményeifelhasználó követelményei– felhasználói felületekfelhasználói felületek
belső szerkezet felderítésebelső szerkezet felderítése–belső architektúrával kapcsolatos követelményekbelső architektúrával kapcsolatos követelmények–CRC kártyákCRC kártyák–komponensekkomponensek
RDDRDD
30
IrodalomIrodalom C. Szyperski.C. Szyperski. Component Software. Beyond Object-Component Software. Beyond Object-
oriented programming.oriented programming. Addison-Wesley.Addison-Wesley.(elméleti áttekintés, alapelvek, technológiák áttekintése)(elméleti áttekintés, alapelvek, technológiák áttekintése)
Vég Cs., dr. Juhász I.Vég Cs., dr. Juhász I. Java - Java - start!start! Logos 2000., 1999. Logos 2000., 1999. nov.nov.(alapfokú Java és programozás-tankönyv; OO és kompo-nens-elv (alapfokú Java és programozás-tankönyv; OO és kompo-nens-elv alapismeretei, vázlat vizuális jelölésekkel) alapismeretei, vázlat vizuális jelölésekkel)
Vég Cs. Vég Cs. Alkalmazásfejlesztés Alkalmazásfejlesztés a Unified Modeling Language szabványos a Unified Modeling Language szabványos jelöléseivel.jelöléseivel. Logos 2000., 1999. máj.Logos 2000., 1999. máj.(UML ismertetése, OO szemlélet, UML komponens-elvű (UML ismertetése, OO szemlélet, UML komponens-elvű kiterjesztése, RDD alkalmazásfejlesztési módszer)kiterjesztése, RDD alkalmazásfejlesztési módszer)
<www.logos2000.hu><www.logos2000.hu>