30
1 Komponens-elvű alkalmazásfejleszt és KLTE KLTE Vég Csaba Vég Csaba <[email protected]> <[email protected]>

Komponens-elvű alkalmazásfejlesztés

  • Upload
    hye

  • View
    35

  • Download
    0

Embed Size (px)

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

Page 1: Komponens-elvű alkalmazásfejlesztés

1

Komponens-elvű alkalmazásfejleszté

s

KLTEKLTE

Vég CsabaVég Csaba <[email protected]><[email protected]>

Page 2: Komponens-elvű alkalmazásfejlesztés

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

Page 3: Komponens-elvű alkalmazásfejlesztés

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

Page 4: Komponens-elvű alkalmazásfejlesztés

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”

Page 5: Komponens-elvű alkalmazásfejlesztés

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”

Page 6: Komponens-elvű alkalmazásfejlesztés

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”

Page 7: Komponens-elvű alkalmazásfejlesztés

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)

Page 8: Komponens-elvű alkalmazásfejlesztés

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ó

Page 9: Komponens-elvű alkalmazásfejlesztés

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)

Page 10: Komponens-elvű alkalmazásfejlesztés

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); }

Page 11: Komponens-elvű alkalmazásfejlesztés

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()

Page 12: Komponens-elvű alkalmazásfejlesztés

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; }

Page 13: Komponens-elvű alkalmazásfejlesztés

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()); }

Page 14: Komponens-elvű alkalmazásfejlesztés

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()

Page 15: Komponens-elvű alkalmazásfejlesztés

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()

Page 16: Komponens-elvű alkalmazásfejlesztés

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)

Page 17: Komponens-elvű alkalmazásfejlesztés

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)

Page 18: Komponens-elvű alkalmazásfejlesztés

18

UMLUML Unified Modeling LanguageUnified Modeling Language

szabványosszabványos objektumorientáltobjektumorientált vizuálisvizuális modellező nyelvmodellező nyelv

Page 19: Komponens-elvű alkalmazásfejlesztés

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

Page 20: Komponens-elvű alkalmazásfejlesztés

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}

Page 21: Komponens-elvű alkalmazásfejlesztés

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; }

Page 22: Komponens-elvű alkalmazásfejlesztés

22

Kör+sugár: double+/kerület: double {2*sugár*}+/terület: double {sugár2*}

Page 23: Komponens-elvű alkalmazásfejlesztés

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

Page 24: Komponens-elvű alkalmazásfejlesztés

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; } }

Page 25: Komponens-elvű alkalmazásfejlesztés

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

Page 26: Komponens-elvű alkalmazásfejleszté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>

Page 27: Komponens-elvű alkalmazásfejlesztés

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

Page 28: Komponens-elvű alkalmazásfejlesztés

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

Page 29: Komponens-elvű alkalmazásfejleszté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

Page 30: Komponens-elvű alkalmazásfejlesztés

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>