Download - 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]>
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”
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ó
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()
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()
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!
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
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 ?
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
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
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
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}
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}
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; }
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%;
}}
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
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
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;
......
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%;
}}
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}
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()}
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
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>