Projektowanie obiektowe wst p
ę
Ad a m migielski
Ś
a d a m. s migiels ki@g m ail.co m
Cel:
Cele m a r ty k u u je s t ag o d n e w p r o wa d z e nie d o p r o je k t ow a nia o biek t o weg o,
ł
ł
p r z e d s t awie nie z a s a d nic zyc h idei i wr a z z z a s t o s o w a nie m w d w óc h w z o rc ac h.
Wymagania:
Zak a d a m z n a j o m o
C + + , n a p o zio mie p o z w alaj cy m n a z r o z u mie nie c z e m u
ł
ść
ą
d e s t r u k t o r p o wi nie n by wir t u al ny.
ć
Oc zywi cie nie c hc z n iec h ca nik og o. Tylko p a mi t ajcie, t o nie je s t k u r s j zy k a,
ś
ę
ę ć
ę
ę
wi c nie z n a j d ziecie t u in t e r p r e t acji k o d u. Zak a d a m, e k a d y r o z u m ie co pi s z .
ę
ł
ż
ż
ę
Sa meg o k o d u nie b d zie z r e s z t z a d u o. I b d zie t o b a r d ziej p s e u d o k o d C + + ,
ę
ą
ż
ę
ni r e al nie d zi a aj cy.
ż
ł ą
Pojawi si t e Java. Je d n a k tylk o jak o p r zy k a d d o b ryc h p o m y s ów.
ę
ż
ł
ł
Interfejs:
Co to ?
In te rfej s t o w s zy s t kie p u blic z n e p ola i m e t o d y n a s z ej kla sy. Czyli t o jak
k o m u ni k u je my si z ni .
ę
ą
Na idee in t e rfejs u n a t k n
e m si p o r a z pie rw s z y d aw n o d aw n o t e m u, z a la s a mi i
ął
ę
g ó r a mi, w biblio tece DirectX 7. Oc zywi cie wi n a pi nie je s t z b y t o biek t o we, wi c
ś
ę
t a k n a p r a w d b a r d ziej p o s u giwa o si ni m nic zy m u c h wy t e m.
ę
ł
ł
ę
Na in te rfej sy z p r a w d ziweg o z d a r z e nia p r zy s z o m i p o c z e k a je s z c z e ja ki c z a s,
ł
ć
ś
Java. Nie t o, e by Javy j u w te dy nie by o, p o p r o s t u jej nie z n a e m.
ż
ż
ł
ł
In te rfej sy s m oi m z d a nie m n ajwa niej s zy m ele m e n t e m p oli m o rfi z m u. Bez nic h
ą
ż
ca y m e c h a ni z m w z a s a d zie by by d o nic z eg o.
ł
ł
int e rf ace Zega r {
flo a t Up y ni tyC z a s();
ł
ę
}
W C + + nie m a t a kiego p o j cia. S je d n a k kla sy c zy s t o wir t u al n e, k t ó r e ideal nie
ę
ą
z a s t p u j in te rfej sy. Ty m k t ó r zy nie wie d z wy mie ni cec hy Java in te rf ace is t o t n e
ę
ą
ą
ę
d la n a s z e g o a r ty k u u:
ł
–
m e t o d y in te rf ej s u s p u blic z n e.
ą
–
m e t o d y in te rf ej s u s a b s t r a kcyj n e. a d nyc h d efi nicji.
ą
Ż
–
in te rfej s nie m a k o n s t r u k t o r a.
–
in te rfej s m o e m i e tylk o p ola p u blic z n e.
ż
ć
Klasy a b s t r a kcyj n e s nieco m n iej o g r a nic z o n e. Cz s t o p r o w a d zi t o d o sy t u acji
ą
ę
g dy kla s a a b s t r a kcyj n a je s t tylk o c z
ciowo wir t u al n a. No b o c z e m u pi s a jak
ęś
ć
ąś
f u n k cje d la w s zy s t kic h i m ple m e n t acji, je eli w s z d zie je s t ideal nie t a k a s a m a?
ż
ę
Po niew a k t o z a jaki c z a s, m o e c hcie n a pi s a t a k we r sj , k t ó r a b d zie si
ż
ś
ś
ż
ć
ć
ą
ę
ę
ę
wyr ó nia :)
ż
ć
Po co nam to ?
Ka d a gr a p o t r z e b u je zlic z a c z a s. Mier zy my c z a s ge n e r acji kla t ki, c z a s p o mi d zy
ż
ć
ę
k olej ny mi tick'a mi d o o blic z e fi zyc z nyc h, n a j r ó niej s z e in n e c z a sy d l a celów
ń
ż
s t a ty s tyc z n yc h it d. Po niewa je s t d o sy c z s t o wyk o r zy s tyw a n e tw o r zy my s o bie
ż
ć
ę
kla s Zegar, a by nie m u sie k a d o r a z o w o pi s a t eg o s a m e g o.
ę
ć
ż
ć
cla s s Zega r {
p u blic:
Zegar();
~ Z eg a r();
voi d Star t();
voi d Sto p();
flo a t Up y ni tyC z a s();
ł
ę
p riva te:
lo n g lo ng o s t a t niC z a s;
}
Nie t r u d n o wyo b r a zi s o bie sy t u acj w k t ó r ej o d k rywa my, e je d n a kla s a Zega r t o
ć
ę
ż
t r o c h m a o n a n a s z e p o t r z e by. Je li p r z y k a d o w o k t o r z u ci gr a n a t, k t ó ry m a
ę
ł
ś
ł
ś
wy b uc h n
p o 5 s e k u n d ac h, t o c hcieliby my m i e z e g a r, k t ó ry s t a r t u je r a z, i
ąć
ś
ć
z w r aca c z a s o d s t a r t u. A d o m ie r z e nia c z a s u r e n d e r o w a nia kla t ki, faj nie by o by
ł
m i e z e g a r, k t ó ry p o d aje c z a s nie o d s t a r t u, lec z o d p o p r z e d nieg o p y t a nia.
ć
cla s s Zega rSt a t {
...
}
cla s s Zega rSt o p e r {
...
}
it d.
Prowa d zi t o d o p o w s t a nia kilk u kla s Zega r... . No i faj nie. W z ale n o ci o d p o t r z e b
ż
ś
tw o r z y my s o bie o d p o wie d ni o biek t i w s zy s t k o d zi a a. Tr z e b a s o bie je d n a k
ł
z d a w a s p r aw , e t a ki k o d je s t r ac z ej t r u d n y w z a r z d z a ni u. Dowol n a z mi a n a w
ć
ę ż
ą
n a s zyc h kla s ac h b d zie p o ci ga z a s o b k o niec z n o
w p r o w a d z e nia z mi a n we
ę
ą ć
ą
ść
w s zy s t kic h o d w o a niac h. Po n a d t o z k a d eg o Zega r a k o r z y s t a si in ac z ej. Z
ł
ż
ę
p o m o c p r zyc h o d zi n a m p oli m o rfi z m. Os t a t ec z nie ws zy s t k o t o s z e g a ry.
ą
ą
Wyci ga my, wi c c z e
ws p ól n p r z e d n a wia s, n a z ywa my j Zegar, a n a s z e kla sy
ą
ę
ść
ą
ą
p o niej d zie d zic z . Klas a Zegar jes t in te r fejs e m, a p o t o m n e s jego
ą
ą
i m ple m e n t acja mi.
cla s s Zega r {
p u blic:
vir t u al ~ Z e ga r() { ; };
vir t u al floa t Up yni tyC z a s() = 0;
ł
ę
}
cla s s Zega rI m pl 1 : p u blic Zega r {
}
cla s s Zega rI m pl 2 : p u blic Zega r {
}
Jak pisa interfejsy ?
ć
Tak ja k w Javie. Ko m ple t nie p u blic z n e i a b s t r a kcyj n e. W t e n s p o s ó b n a r z u c a my
kla s o m, tylk o t o co m a j r o bi , a nie jak. Daje t o le p s z za r z d z al n o
k o d u.
ą
ć
ą
ą
ść
Kiedy pisa interfejsy ?
ć
Os t a t ni mi c z a s u fa ni Te s t Drive n Develo p m e n t r o s n w si
. Sa m d o nic h n ale
.
ą
łę
żę
In te rfej sy t w o r z y my pi s z c t e s ty, a t e s ty pi s z e m y jes zc z e z a ni m n a pi s z e m y t o co
ą
b d zie my t e s t ow a . To co r o bi my je s t wa niej s z e o d t eg o jak t o r o bi my.
ę
ć
ż
Obiekt funkcyjny:
Co to ?
Obiek t f u n kcyj ny t o n aj p r o ciej m ó wi c o biek t kla sy z p r z e d e fi niowa ny m
ś
ą
o p e r a t o r e m (). Po niewa o p e r a t o r t e n m o e p r zyj m o w a d o w ol n ilo
ż
ż
ć
ą
ść
a rg u m e n t ó w i z w r ac a d o w ol ny m ty p, o biek t z a c zy n a z a c h o wywa si jak
ć
ć ę
f u n k cja.
Po z a ty m t o ty p o wy o biek t.
Po co nam to ?
Do s t aje my d o n a pi s a nia f u n kcj voi d go t oxy(u n sig n e d in t x, u n sig n e d in t y) d la
ę
k o n s oli Win d ow s. Jes t je d n a k m a y h ac zy k, a plik acja w k t ó r ej m a t o by u y te m a
ł
ć ż
kilka w t k ów, a k a d y w te k m a w a s n k o n s ol . Dla tyc h co nie wie d z
ą
ż
ą
ł
ą
ę
ą
p r z e s u ni cie k u r s o r a n a k o n s oli Win d ow s wy m ag a u c h wy t u d o s t r u k t u ry
ę
Scree nBufe r t ej k o n s oli. Jak wi d a m a m y p r o ble m, p o niewa nie m a jak p r z e k a z a
ć
ż
ć
t eg o u c h wy t u. Naj p r o ciej by o by s tw o r zy z m ie n n a glo b al n , ale s a mi nie wie my
ś
ł
ć
ą
ile tyc h w t k ów z k o n s ola mi b d zie.
ą
ę
cla s s GotoXY {
p u blic:
Go t oXY(co n s t Scree nBufe r &arg) : s c re e n(a rg) {
;
}
voi d o p e r a t o r () (u n sig ne d in t x, u n sig n e d in t y);
}
Ter a z wy s t a rc zy w k a d y m w t k u u t w o r zy o biek t:
ż
ą
ć
Got oXY g o t oxy(ActiveScree nBufer);
I j u m a m y d zia aj c f u n kcj go t oxy(50,1 0 0); :)
ż
ł ą ą
ę
Delegacja:
Co to ?
Delegacja t o z r z u ce nie o d p o wie d zial n o ci z a wyk o n a nie jakiej f u n kcjo n al n o ci
ś
ś
ś
n a in n kla s . Deleg u je my p r o ble m :)
ą
ę
Po co nam to ?
C za s a mi kie dy pi s z e my jak
kla s wie my, e b d zie co r o bi , tylko nie wie my co
ąś
ę
ż
ę
ś
ć
t o d o k a d nie b d zie. Pr zyk a d e m m o e by o b r a z e k wek t o r owy. Na o b r a z k u
ł
ę
ł
ż
ć
m a m y ele m e n ty. Je d n a k nie wie my co t o z a ele m e n ty. Chce my a by t a d ecy zj a
z o s t a a p o d j t a j u p o d c z a s d zia a nia p r o g r a m u. Two r zy my, wi c co n a t e n
ł
ę
ż
ł
ę
ś
w z ó r:
cla s s Ele m e n t {
p u blic:
Ele m e n t(co n s t Rys owal ny & a rg) : o bie k tF u n k cyj ny(arg) {
;
}
voi d ry s uj(in t x, in t y) {
o biek tFu n kcyj ny(x,y);
}
}
Ele m e n ty o b r a z k a d eleg u j ry s ow a nie, d o in nyc h kla s.
ą
Czemu obiekt funkcyjny ?
Nie je s t t o k o niec z n e. Rów nie d o b r a, jak o p e r a t o r (), b d zie k a d a in n a m e t o d a.
ę
ż
Ist o t n e jes t tylk o a by by a w in te rfej sie z n a ny m kla sie d eleg uj cej.
ł
ą
To ju jest koniec ?
ż
W z a s a d zie t u t aj m o n a by o by p r z e r w a t e n a r ty k u , a z ai n t e r e s o wa nyc h o d e s a
ż
ł
ć
ł
ł ć
d o k si g ar ni, alb o p o d ga r
lin k ów.
ę
ść
Pr z e d s t a wi e m d w a n ajwa niej s z e ele m e n ty p r oj ek t o wa nia o biek t ow eg o. Res z t a
ł
ż
je s t j u tylk o ich u miej t ny m
c z e nie m.
ż
ę
łą
My l je d n a k, e p o k a z a nie kilk u w z o rc ów wr a z z wyja nie nie m jak z o s t a y
ś ę
ż
ś
ł
z b u d o w a n e, m o e by b a r d z o r o z wijaj ce. St d je s z c z e o pi s d w óc h w z o rc ów.
ż
ć
ą
ą
Prototyp:
Opis
Jes t t o w z o r z ec k r eacyj ny. O z n ac z a t o, e jego cele m je s t tw o r z e nie in s t a n cji.
ż
G ów n p r z e s a n k a by go z a s t o s o w a je s t nie z n aj o m o
k o n k r e t n eg o ty p u w
ł
ą
ł
ą
ć
ść
m o m e n cie k o m pilacji. Two r zy my wi c in te rfej sy Pro t o ty p ó w:
ę
cla s s Pro t o ty p {
vir t u al Pro t o ty p * Klo n uj() = 0;
vir t u al ~ P r o t o ty p() {;};
}
A n a s t p nie ich i m ple m e n t acje. Oc zywi cie i m ple m e n t acji m o e by wi cej ni
ę
ś
ż
ć
ę
ż
je d n a.
cla s s Klas aI m plPro t o ty p : p u blic Prot o ty p {
vir t u al Klas aI m plPr o t o ty p * Klo n uj();
vir t u al ~ Klas aI m plPr o t o ty p();
}
Meto d a Klo n u j() m a z a z a d a nie z w r óci k o pi o biek t u. Mo n a p o p r o s t u z w r óci
ć
ę
ż
ć
n o wy o biek t k o n s t r u k t o r e m k o pi u j cy m *this.
ą
Ter a z tw o r zy my s o bie kla s Fab ry k aI m plPr o t o ty p ó w
ę
cla s s Fab ry k aI m plPro t o ty p ów {
Fab ryk aI m plPro t o ty p ó (Im plPro t o ty p u 1 *, Im plPr o t o ty p u 2 *);
ł
Pro t o ty p 1 * Zro bI m plPro t o ty p u 1();
Pro t o ty p 2 * Zro bI m plPro t o ty p u 2();
}
Jak to dzia a ?
ł
Powie d z m y, e c hce my z r o bi a plikacj w k t ó r ej b d zie m o n a z m ie ni s tyl
ż
ć
ę
ę
ż
ć
in te rfej s u. Nie c hce my tylk o z m ie ni o b r a z k ó w. Chce my m ie m o liwo
wy mia ny
ć
ć
ż
ść
ca ej logiki ry s u j cej jego ele m e n ty.
ł
ą
Po u r u c h o mie ni u a plik acji jak o u s t ala m y, k t ó r wer sj UI n ale y wyk o r zy s t a .
ś
ą
ę
ż
ć
Two r zy my s o bie o biek t kla sy Fab ryk aEle m e n t ó wUI. W k o n s t r u k t o r z e
p r z e k a z u je my jej o d p o wie d nie o biek ty. O d t e r a z pi s z e m y s o bie n a p r z y k a d:
ł
Ok n o *ok n o = Fab ryk aEle m e n t ó wUI.Zro bOk n o();
I d o s t aje m y o d p o wie d ni o biek t i m ple m e n t u j cy in te rfej s o k n o.
ą
Ma my in t e rfej s i jego i m ple m e n t acje. Meto d a Klo n u j b d zie wywo ywa n a
ę
ł
p oli m o rfic z nie. D zi ki c z e m u z w r aca ny b d zie z a w s z e w a ciwy o biek t.
ę
ę
ł ś
Ma my t e d eleg acje. Meto dy Zro bI m plPr o t o ty p u wywo uj m e t o d Klo n u j i
ż
ł ą
ę
z w r acaj t e n s a m wy nik.
ą
Py ek:
ł
Opis
Jes t t o w z o r z ec s t r u k t u r al ny. Jego cele m je s t, wi c s t r u k t u ry z acj a o biek t ów.
ę
Ko n k r e t niej, jes t w z o r z ec jak n a we t b a r d z o d u a ilo
o biek t ó w m a w s p ó d zieli
ż
ść
ł
ć
p ew n ilo
o biek t ów.
ą
ść
Pr zyk a dy growe . Ma my b a r d z o d u o m o d eli k o r zy s t aj cyc h z tyc h s a m yc h
ł
ż
ą
t e k s t u r. Nawe t c hy b a le p s z y m a m y b a r d z o d u o o biek t ów k o r zy s t aj cyc h z tyc h
ż
ą
s a m yc h m o d eli. Powie d z m y, e r o bi my siecioweg o f p p. Fab u a ty p o w a d o b ól u:
ż
ł
Wojn a w ca y m ws z ec h wiecie . Grac z e (d u o, s e t ki, ty si ce) d ziel si n a d wie
ł
ś
ż
ą
ą ę
g r u p y, a p o t e m z ac zy n a si r eg ula r n a bi tw a o ja ki p u n k t n a m a pie. W g r z e
ę
ś
wy s t p u j e kilka n a cie ty p ó w b r o ni. I jakie z o n a s p o d k u si o d o wy wietla nia
ę
ś
ś ł
ł
ś
lec cyc h p o cis k ó w ;) Ma my s e t ki ty si cy o biek t ó w n a s ce nie. Ale m o d eli b d zie
ą
ę
ę
d u o m niej. Oc zywis te je s t, e m o d ele n ale y w s p ó d zieli .
ż
ż
ż
ł
ć
Jak to dzia a ?
ł
W z a s a d zie, s p r a wa wy d aje si oc zywis t a. Two r zy m y s o bie z a r z d c e m o d eli.
ę
ą
clas s Fab ryk aPylkow {
Pylek Zwr ocPylek( kl uc z )
}
Meto d a Zwr ocMo d el n a p o d s t awie kl uc z a s twie r d z a c zy t a ki m o d el je s t
z a a d o w a ny, a d u je m o d el, je li je s z c z e nie by z a a d o w a ny, i z w r ac a ja k
ł
ł
ś
ł
ł
ąś
r efe r e ncj d o nieg o. Sa m m o d el p o t r afi si n a ry s ow a n a p o d s t a wie inf o r m acji
ę
ę
ć
p r z e k a z a nyc h p r z e z o biek t z e w n t r z n y.
ę
clas s Pylek {
O p e r acja( s t a nO biek t uZew n e t r z n eg o );
}
Gd zie t u p oli m o rfi z m ? Klas m o d eli m o e by s p o r o. Mog by m o d ele 3 d, m o g
ż
ć
ą
ć
ą
by 2 d, m o g by a ni m o w a n e, lu b nie.
ć
ą
ć
A co z m o d ela mi, k t ó r e m o g by z m ie nia n e w c z a sie ? Na p r z y k a d c hce my m ó c
ą
ć
ł
o d s t r z eli r k p r z eciw nik owi, ale t a k, e by ist o t ny by p u n k t t r afie nia. Po p r o s t u
ć ę ę
ż
ł
tw o r z y my Im ple m e n t acjePylk u, k t ó r a nie je s t w s p ó d zielo n a.
ł
Gd zie w ty m d eleg acja ? W z a s a d zie t o nie m a. Nie m niej tw o r zy my Py ki w in n ej
ł
kla sie. C zyli t a k jak by d eleg uje my s t w o r z e nie Py k u d o Fab ryki.
ł
Tym razem to koniec.
Nie m a m a m bicji o pi s a w s zy s t kic h w z o rc ów, b o t o m a t e ria n a p o w a n a
ć
ł
ż
p u blik acj , alb o r ac z ej kilka t a kic h p u blik acji.
ę
O pis ó w w z o r ców je s t s p o r o. O d siebie m o g p oleci Desig n Pat te r n s: Ele m e n t s of
ę
ć
Reu s a ble Object - Orie n t e d Softwa r e c zyli p o p ol s k u Wzo rce p r o je k t o we
a u t o r s tw a Erich Ga m m a, Rich a r d Hel m, Ral p h Jo h n s o n, Jo h n Vlissi d e s.
Ko n s t r u k tyw n a k ry tyk a mile wid zia n a.