23
1 Generikus Programszerkezetek KLTE KLTE Nagy István Nagy István <[email protected]> <[email protected]> Vég Csaba Vég Csaba <[email protected]> <[email protected]>

Generikus Programszerkezetek

  • Upload
    umika

  • View
    14

  • Download
    0

Embed Size (px)

DESCRIPTION

Generikus Programszerkezetek. Nagy István Vég Csaba . KLTE. Komponens paradigma. Technológiai szempont: late integration komponens-architektúra (wiring) a használat előtérbe helyeződése (funkcionális-csomópontok) - PowerPoint PPT Presentation

Citation preview

Page 1: Generikus Programszerkezetek

1

Generikus Programszerkezete

k

KLTEKLTE

Nagy István Nagy István <[email protected]><[email protected]> Vég CsabaVég Csaba <[email protected]><[email protected]>

Page 2: Generikus Programszerkezetek

2

Komponens paradigmaKomponens paradigma

Technológiai szempont:Technológiai szempont: late integrationlate integration komponens-architektúra (wiring)komponens-architektúra (wiring)

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)

Komponens: “Szaktudáskonzerv”Komponens: “Szaktudáskonzerv”

Page 3: Generikus Programszerkezetek

3

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 4: Generikus Programszerkezetek

4

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 5: Generikus Programszerkezetek

5

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 6: Generikus Programszerkezetek

6

A „nyelvek túl flexibilisek”A „nyelvek túl flexibilisek”

Feleslegesen sok lehetőséget engednek megFeleslegesen sok lehetőséget engednek meg

A komponens elv egy bevált és jól működő A komponens elv egy bevált és jól működő változatot határoz megváltozatot határoz meg

De: redundancia a forrásban!De: redundancia a forrásban!

Page 7: Generikus Programszerkezetek

7

/** /** The The alpha property */ alpha property */

private int alpha; private int alpha;

/** get method for property alpha */ /** get method for property alpha */

public int getpublic int getAlphaAlpha() { return alpha; } () { return alpha; }

/** /** setset method for property alpha */ method for property alpha */

public void setpublic void setAlphaAlpha(int alpha_) { alpha=alpha_; } (int alpha_) { alpha=alpha_; }

RedundanciaRedundancia

Page 8: Generikus Programszerkezetek

8

RedundanciaRedundancia

/*/*** The alpha (double) property */ The alpha (double) property */private double cacheOfAlpha; private double cacheOfAlpha;

private boolean cacheOfAlphaIsInvalide =true; private boolean cacheOfAlphaIsInvalide =true;

/** get method for property alpha *//** get method for property alpha */public double getAlpha() {public double getAlpha() {

if(cacheOfAlphaIsInvalide) { if(cacheOfAlphaIsInvalide) { ccacheOfAlphaIsInvalide=false; acheOfAlphaIsInvalide=false; cacheOfAlpha=computeAlpha(); cacheOfAlpha=computeAlpha();

} } return cacheOfAlpha; return cacheOfAlpha; } } /** /** computecompute method for property alpha */ method for property alpha */

protected double computeAlpha() { return 5*7; }protected double computeAlpha() { return 5*7; }

Copy & Paste ?

Page 9: Generikus Programszerkezetek

9

RedundanciaRedundancia

Hátrányok:Hátrányok: többletmunkatöbbletmunka Inkonzisztencia veszélyeInkonzisztencia veszélye

„„Az igazi programozó, úgy Az igazi programozó, úgy programozik,programozik, mint a gép”mint a gép” (Vég Cs.)(Vég Cs.)

Automatizálás lehetőségeAutomatizálás lehetősége

Page 10: Generikus Programszerkezetek

10

ForrásgenerálásForrásgenerálás

Automatikus forrásgenerálás: generikus szerkezetek Automatikus forrásgenerálás: generikus szerkezetek segítségévelsegítségével

SourceSource

Result TextResult Text

PreprocessorPreprocessor

LibraryLibrary

Page 11: Generikus Programszerkezetek

11

Generikus szerkezetGenerikus szerkezetekek Makro eszközMakro eszköz

PreprocesszorPreprocesszor–DefinDefinícók - definíciós könyvtárakícók - definíciós könyvtárak–HívásHívás

Definition 1Definition 1Definition 2Definition 2......

Original text..Original text..{Call 1}{Call 1}Original text..Original text..{Call 2}{Call 2}......

Original text..Original text..Modified textModified textOriginal text..Original text..New textNew text......

++

definition filesdefinition files original fileoriginal file result fileresult file

Page 12: Generikus Programszerkezetek

12

Generikus szerkezet alkalmazásaGenerikus szerkezet alkalmazása

HHíívás = tulajdonsvás = tulajdonságlistaáglista általános szintaktikaáltalános szintaktika

–alapértelmezett tulajdonságokalapértelmezett tulajdonságok–UML-szerű megszoríUML-szerű megszoríttásokások

{property} {name=alpha} {type=int} {property} {name=alpha} {type=int} {readable}{readable} {writeable} {writeable}

{property} {name=alpha{property} {name=alpha11} {type=int} {} {type=int} {!!readable} {writeable}readable} {writeable}

{property} {name=alpha} {type=double} {cached=5*7}{property} {name=alpha} {type=double} {cached=5*7}

Page 13: Generikus Programszerkezetek

13

/** /** The The alphaalpha (int) (int) property */ property */

private int alpha; private int alpha;

/** get method for property alpha */ /** get method for property alpha */

public int getpublic int getAlphaAlpha() { return alpha; } () { return alpha; }

/** /** setset method for property alpha */ method for property alpha */

public void setpublic void setAlphaAlpha(int alpha_) { alpha=alpha_; } (int alpha_) { alpha=alpha_; }

GenerálásGenerálás

{property} {name=alpha} {type=int} {property} {name=alpha} {type=int} {readable}{readable} {writeable} {writeable}

Page 14: Generikus Programszerkezetek

14

Definíció (egyszerűsített)Definíció (egyszerűsített)

{property}: {<property-description}{property}: {<property-description}

/**T/**The %name% (%type%) propertyhe %name% (%type%) property*/*/

{property} {!derived}:{<attribute}private %type% %name%;{property} {!derived}:{<attribute}private %type% %name%;

{property} {readable}:{property} {readable}:

{<read-method{<read-method}}

%%visibility% %type% get_%name%() { return %name%; }visibility% %type% get_%name%() { return %name%; }

{property} {writeable}:{property} {writeable}:

{<write-method}%visibility% void set_%name%(%type% %name%_) {<write-method}%visibility% void set_%name%(%type% %name%_) {{ %name%=%name%_; }%name%=%name%_; }

{property} {derived}:{property} {derived}:

{<read-method}{<read-method}

%visibility% %type% get_%name%() {return compute_%name%();}%visibility% %type% get_%name%() {return compute_%name%();}

{<compute-method}{<compute-method}

protected %type% compute_%name%() { return %derived%; }protected %type% compute_%name%() { return %derived%; }

/** The alpha (int) property */

public int getAlpha() { return alpha; }

Page 15: Generikus Programszerkezetek

15

Definíció Definíció {cached}{cached}

{property} {cached}:{property} {cached}:

{<cache}private %type% cacheOf_%name%;{<cache}private %type% cacheOf_%name%;

{<cacheFlag}{<cacheFlag}

private boolean cacheOf_%name%IsInvalide =true;private boolean cacheOf_%name%IsInvalide =true;

{<read-method} %visibility% %type% get_%name%() {{<read-method} %visibility% %type% get_%name%() {

if(cacheOf_%name%IsInvalide) { if(cacheOf_%name%IsInvalide) {

cacheOf_%name%IsInvalide=false; cacheOf_%name%IsInvalide=false;

cacheOf_%name%=compute_%name%(); cacheOf_%name%=compute_%name%();

}}

return cacheOf_%name%;return cacheOf_%name%;

}}

Page 16: Generikus Programszerkezetek

16

ForrásForrásmódosításmódosítás

HHívások sívások speciális megjegyzéskpeciális megjegyzéskéntént AA makroeszköz makroeszköz módosítja a programforrástmódosítja a programforrást

SourceSource

Result TextResult Text

PreprocessorPreprocessor

LibraryLibrary

IDEIDE

!!

IDEIDE

Page 17: Generikus Programszerkezetek

17

ForrásForrásmódosításmódosítás

/// /// {property} {name=alpha} {type=double} {cached=5*7}{property} {name=alpha} {type=double} {cached=5*7}/*/*** The alpha (double) property */ The alpha (double) property */

private double cacheOfAlpha; private double cacheOfAlpha;

private boolean cacheOfAlphaIsInvalide =true; private boolean cacheOfAlphaIsInvalide =true;

/** get method for property alpha *//** get method for property alpha */

public double getAlpha() {public double getAlpha() {

if(cacheOfAlphaIsInvalide) { if(cacheOfAlphaIsInvalide) { ccacheOfAlphaIsInvalide=false; acheOfAlphaIsInvalide=false; cacheOfAlpha=computeAlpha(); cacheOfAlpha=computeAlpha();

} }

return cacheOfAlpha; return cacheOfAlpha;

} }

/** /** computecompute method for property alpha */ method for property alpha */

protected double computeAlpha() { return 5*7; }protected double computeAlpha() { return 5*7; }

Less tangled, smaller codeEasier maintanceMore Reusable

Common Code Localization

Page 18: Generikus Programszerkezetek

18

ForrásForrásmódosításmódosítás előnyei előnyei

A generA generált eredmény azonnal felhasználhatóált eredmény azonnal felhasználható eredeti állomány a fejlesztőeszközben szerkeztés eredeti állomány a fejlesztőeszközben szerkeztés

alatt állalatt áll Az esetleges hibAz esetleges hibák könnyen megtalálhatóak és ák könnyen megtalálhatóak és

javíthatóakjavíthatóak

/// /// {property} {name=alpha} {type=doubl{property} {name=alpha} {type=doublww} {cached=5*7}} {cached=5*7}/*/*** The alpha (doubl The alpha (doublww) property */) property */

private doublprivate doublww cacheOfAlpha; cacheOfAlpha;

......

Page 19: Generikus Programszerkezetek

19

Generikus szerkezetek előnyei II.Generikus szerkezetek előnyei II.

TestreszabásTestreszabás:: Korábbi definíciók felüldefiniálása lehetségesKorábbi definíciók felüldefiniálása lehetséges felüldefiniálás közvetlenül akfelüldefiniálás közvetlenül akár az ár az eredményeredmény--

szöveggelszöveggel is is

{property} {readable}:{property} {readable}:

{{~~read-methodread-method}}

%%visibility% %type% get_%name%() { visibility% %type% get_%name%() {

System.out.println(“get_%name%() method”); System.out.println(“get_%name%() method”);

return %name%; return %name%;

}}

Page 20: Generikus Programszerkezetek

20

ElemzőElemző Külön elemző definiálásának lehetőségeKülön elemző definiálásának lehetősége

Rövidebb hivatkozásokRövidebb hivatkozások Speciális körülményekhez igazítható Speciális körülményekhez igazítható

Alapértelmezett elemzőAlapértelmezett elemző : :

++alphaalpha: int <: int < {property} {name=alpha} {type=int} {property} {name=alpha} {type=int} {readable}{readable} {writeable} {writeable}

Page 21: Generikus Programszerkezetek

21

ElemzőElemző

További megszorítások (UML): További megszorítások (UML): +alpha: double {cached=5*7}+alpha: double {cached=5*7}

{property} {name={property} {name=alphaalpha} {type=} {type=doubledouble} {} {cached=5*7cached=5*7}}

Specifikus elemző: Specifikus elemző: {ui-elem} @ 23,41 JLabel(„Név”){ui-elem} @ 23,41 JLabel(„Név”)

{ui-elem} @ 78,41 JTextField() {from=person.getName()} {ui-elem} @ 78,41 JTextField() {from=person.getName()}

Page 22: Generikus Programszerkezetek

22

Generikus szerkezetekGenerikus szerkezetek

Generikus szerkezetek:Generikus szerkezetek: közvetlenül újrafelhasználható szaktudásközvetlenül újrafelhasználható szaktudás

Alkalmazási területek:Alkalmazási területek: KomponensekKomponensek Felhasználói felületekFelhasználói felületek Adatbázis-illesztésAdatbázis-illesztés

Page 23: Generikus Programszerkezetek

23

IrodalomIrodalom

C. Szyperski.C. Szyperski. Component Software. Beyond Component Software. Beyond Object-oriented programming.Object-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. 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>