16. unora ´ 2015, Brno ´ Pˇripravil: David Prochazka
´ ı implementace Skryv ´ an´ ´ ´ ´ Zaklady objektoveho navrhu
´ Pˇripomenut´ı navrhu pouˇzitelnych ´ tˇr´ıd
ˇ Obsah pˇredna´ sky 1
´ Pˇripomenut´ı navrhu pouˇziteln´ych tˇr´ıd
2
Jak skr´yt implementaci tˇr´ıdy
3
´ Pˇr´ıklady na modifikatory viditelnosti
4
Shrnut´ı
Strana 2 / 17
´ Pˇripomenut´ı navrhu pouˇzitelnych ´ tˇr´ıd
Strana 3 / 17
Black-box ˇ fungovat jako cˇ erne´ Tˇr´ıdy (resp. jejich instance) by mely ˇ skˇr´ınky. ˇ byt ´ Pro pouˇzit´ı tˇr´ıdy by nemelo ´ nutne´ chapat, jak pracuje. ˇ by staˇcit pod´ıvat se, jake´ operace mohu s tˇr´ıdou Melo ´ et. ˇ provad ˇ byt Zbytek by mel ´ skryt.
Jak skryt ´ implementaci tˇr´ıdy
ˇ Obsah pˇredna´ sky 1
´ Pˇripomenut´ı navrhu pouˇziteln´ych tˇr´ıd
2
Jak skr´yt implementaci tˇr´ıdy
3
´ Pˇr´ıklady na modifikatory viditelnosti
4
Shrnut´ı
Strana 4 / 17
Jak skryt ´ implementaci tˇr´ıdy
Strana 5 / 17
´ Modifikatory viditelnosti Jak´ykoliv atribut nebo metoda muˇ ˚ ze m´ıt pˇred sv´ym ´ nazvem kl´ıcˇ ove´ slovo public, protected nebo private. Pokud je atribut oznaˇcen public, muˇ ˚ ze ho kdokoli cˇ ´ıst a ˇ ´ modifikovat. R´ıkame, zˇ e je veˇrejny. ´ Pokud je oznaˇcen private, lze pˇristupovat jen z metod objektu˚ dane´ tˇr´ıdy a oznaˇcujeme jej soukrom´y. (Protected prozat´ım ignorujeme.)
Rozhran´ı Skupinu metod (v´yjimeˇcneˇ atributu), ˚ ktere´ jsou veˇrejne´ oznaˇcujeme jako rozhran´ı – interface.
Jak skryt ´ implementaci tˇr´ıdy
Strana 6 / 17
´ u˚ Platnost modifikator ´ Modifikatory viditelnosti maj´ı v´yznam pouze pˇri komunikaci v´ıce objektu˚ ruzn ˚ ych ´ tˇr´ıd. Metody objektu˚ stejne´ tˇr´ıdy maj´ı vˇzdy pˇr´ıstup ke vˇsem ´ atributum ˚ dane´ tˇr´ıdy. Bez ohledu na modifikatory viditelnosti.
´ Pˇr´ıklady na modifikatory viditelnosti
ˇ Obsah pˇredna´ sky 1
´ Pˇripomenut´ı navrhu pouˇziteln´ych tˇr´ıd
2
Jak skr´yt implementaci tˇr´ıdy
3
´ Pˇr´ıklady na modifikatory viditelnosti
4
Shrnut´ı
Strana 7 / 17
´ Pˇr´ıklady na modifikatory viditelnosti
Strana 8 / 17
Pˇr´ıklad Hrdina Pˇr´ıklad Hrdina ˇ ´ Na poˇcatku ´ Mejme hru, kde jsou hrdinove. ma´ hrdina s´ılu i obratnost rovnu n. Pokud bojuje, zv´ysˇ ´ı se mu po urˇcite´ dobeˇ s´ıla. S´ıla vˇsak souvis´ı s obratnost´ı. Pokud se zv´ysˇ ´ı s´ıla, mus´ı se sn´ızˇ it obratnost. Jak doc´ıl´ıte toho, aby vˇzdy, kdyˇz se zv´ysˇ ´ı s´ıla, zmenˇsila se obratnost?
´ Pˇr´ıklady na modifikatory viditelnosti
Pˇr´ıklad Hrdina: model Hrdina - sila : int - obratnost : int + Hrdina(pocatecniSilaAObratnost : int) + zvysUrovenSily() : void + getSila() : int + getObratnost() : int
Strana 9 / 17
´ Pˇr´ıklady na modifikatory viditelnosti
Strana 10 / 17
´ Pˇr´ıklad Hrdina: kod 1 2 3 4 5 6 7 8 9
class Hrdina { private : int m_sila ; int m_obratnost ; public : Hrdina ( int po c a t e c n i S i l a A O b r a t n o s t ){ m_sila = po c a t e c n i S i l a A O b r a t n o s t ; m_obratnost = p o c a t e c n i S i l a A O b r a t n o s t ; }
10 11 12 13 14 15
void zvysUrovenSily (){ m_sila ++; m_obratnost - -; } ...
´ Pˇr´ıklady na modifikatory viditelnosti
Strana 11 / 17
Pˇr´ıklad Hrdina: pouˇzit´ı 1 2 3 4 5
int main (){ Hrdina * artus = new Hrdina (10); // vypise vzdy 10 cout << " Sila : " << artus - > getSila () << endl ; cout << " Obr .: " << artus - > getObratnost () << en
6
artus - > zvysUrovenSily (); // vypise 11 a 9 cout << " Sila : " << artus - > getSila () << endl ; cout << " Obr .: " << artus - > getObratnost () << en
7 8 9 10 11
delete artus ; return 0;
12 13 14
}
´ Pˇr´ıklady na modifikatory viditelnosti
Strana 12 / 17
Pˇr´ıklad Student Pˇr´ıklad Student ˇ ´ Mejme univerzitn´ı informaˇcn´ı system. Ten eviduje studenty. ´ ´ Kaˇzd´y student ma´ evidovano jmeno, semestr studia, studijn´ı ˇ a souˇcet vyplacen´ych stipendi´ı. Vˇsechny tyto vlastnosti prum ˚ er ´ konstruktorem mimo vyplacen´ych stipendi´ı. Ta budou zadany ´ budou 0. Implementuje pro objekt nasleduj´ ıc´ı metody: Mus´ı existovat metoda, ktera´ umoˇzn´ı vypsat na obrazovku ´ cˇ astku, ktera´ byla doposud studentovi vyplacena a take´ ´ cˇ astku, ktera´ ma´ b´yt studentovi vyplacena jako stipendium ´ ım obdob´ı. Stipendium se spoˇc´ıta´ nasleduj´ ´ v aktualn´ ıc´ım ˇ + (semestr studia * 100). zpusobem: (1000 * prum ˚ ˚ er) ´ mus´ı existovat metoda, ktera´ umoˇzn´ı pˇriˇc´ıst Dale ´ ı v´ysˇ i stipendia k jeho vyplacen´ym studentovi aktualn´ stipendi´ım.
´ Pˇr´ıklady na modifikatory viditelnosti
Strana 13 / 17
Pˇr´ıklad Student: prvn´ı analyza ´ Student -
jmeno : string semestr : int studijniPrumer : float vyplacenoStipendii : float
+ Student(jmeno:string, semestr:int, prumer:float) + vypisStipendia() : void + prictiStipendia() : void ... Zamysleme se: ˇ ´ neco ˇ opakovat? Nebude se v nekter´ ych metodach
´ Pˇr´ıklady na modifikatory viditelnosti
ˇ ı analyza Pˇr´ıklad Student: hlubs´ ´ Student -
jmeno : string semestr : int studijniPrumer : float vyplacenoStipendii : float
+ Student(jmeno:string, semestr:int, prumer:float) + vypisStipendia() : void + prictiStipendia() : void - spocitejAktualniStipendium() : float ... To je lepˇs´ı! Jedna metoda – jeden ukol. ´
Strana 14 / 17
Shrnut´ı
ˇ Obsah pˇredna´ sky 1
´ Pˇripomenut´ı navrhu pouˇziteln´ych tˇr´ıd
2
Jak skr´yt implementaci tˇr´ıdy
3
´ Pˇr´ıklady na modifikatory viditelnosti
4
Shrnut´ı
Strana 15 / 17
Shrnut´ı
Strana 16 / 17
Shrnut´ı ˇ b´yt Atributy, ktere´ charakterizuj´ı stav objektu by mely ´ skryte. Lze k nim pˇristupovat pomoc´ı metod — ty tvoˇr´ı rozhran´ı pro pˇr´ıstup. ˇ b´yt skryte´ metody, ktere´ nen´ı Stejneˇ tak by mely ´ smysluplne volat z venku“. ” ´ ´ strukturu objektu, C´ılem je, aby programator nemusel znat ´ et. ˇ ale jen operace, ktere´ sm´ı provad ˇ ˇ ´ Aplikace techto principu˚ umoˇznuje snaˇzsˇ ´ı spolupraci, ´ bezpeˇcnost, modularnost a znovupouˇzitelnost.
Shrnut´ı
Strana 17 / 17
ˇ ı Pˇr´ıklady k procvicen´ ˇ Pˇr´ıklad Autopuj ˚ covna ´ autopujˇ Pro informaˇcn´ı system ˚ covny vytvoˇrte tˇr´ıdu Auto. Tato ´ tˇr´ıda ma´ nasleduj´ ıc´ı vlastnosti: najeto km, cena za pujˇ ˚ cen´ı na ˇ den a kolik celkem auto vydelalo. Vˇsechny tyto vlastnosti ´ poˇcet vynut’te v konstruktoru. Vytvoˇrte metodu, ktere´ pˇredate ´ ı cenu za pujˇ dn´ı na ktere´ chcete auto pujˇ ˚ cit a ona vrat´ ˚ cen´ı. ´ vytvoˇrte metodu, ktera´ umoˇzn´ı pˇridat zaznam ´ Dale o zapujˇ ˚ cen´ı ´ auta na pˇredan´y poˇcet dn´ı (tj. metoda pˇriˇcte pˇr´ısluˇsnou cˇ astku ´ ˇ ych penez ˇ a pujˇ do atributu se souˇctem vydelan´ ˚ covneho ´ vytvoˇrte metodu, ktera´ zaznamena´ poˇcet ujet´ych km). Dale ˇ Zaˇrid’te umoˇzn´ı vypsat na obrazovku veˇskere´ informace o aute. aby se vˇzdy kdyˇz se zv´ysˇ ´ı poˇcet najet´ych km o 10000 km sn´ızˇ ila cena za zapujˇ ˚ cen´ı auta o 10 %.