Komponens-elvű alkalmazásfejlesztés

Preview:

DESCRIPTION

Komponens-elvű alkalmazásfejlesztés. Vég Csaba . 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, - PowerPoint PPT Presentation

Citation preview

1

Komponens-elvű alkalmazásfejleszté

s

KLTEKLTE

Vég CsabaVég Csaba <vega@dragon.klte.hu><vega@dragon.klte.hu>

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>

Recommended