16. února 2015, Brno Připravil: David Procházka Skrývání implementace Základy objektového návrhu
Připomenutí návrhu použitelných tříd Strana 2 / 17 Obsah přednášky 1 Připomenutí návrhu použitelných tříd 2 Jak skrýt implementaci třídy 3 Příklady na modifikátory viditelnosti 4 Shrnutí
Připomenutí návrhu použitelných tříd Strana 3 / 17 Black-box Třídy (resp. jejich instance) by měly fungovat jako černé skříňky. Pro použití třídy by nemělo být nutné chápat, jak pracuje. Mělo by stačit podívat se, jaké operace mohu s třídou provádět. Zbytek by měl být skryt.
Jak skrýt implementaci třídy Strana 4 / 17 Obsah přednášky 1 Připomenutí návrhu použitelných tříd 2 Jak skrýt implementaci třídy 3 Příklady na modifikátory viditelnosti 4 Shrnutí
Jak skrýt implementaci třídy Strana 5 / 17 Modifikátory viditelnosti Jakýkoliv atribut nebo metoda může mít před svým názvem klíčové slovo public, protected nebo private. Pokud je atribut označen public, může ho kdokoli číst a modifikovat. Říkáme, že je veřejný. Pokud je označen private, lze přistupovat jen z metod objektů dané třídy a označujeme jej soukromý. (Protected prozatím ignorujeme.) Rozhraní Skupinu metod (výjimečně atributů), které jsou veřejné označujeme jako rozhraní interface.
Jak skrýt implementaci třídy Strana 6 / 17 Platnost modifikátorů Modifikátory viditelnosti mají význam pouze při komunikaci více objektů různých tříd. Metody objektů stejné třídy mají vždy přístup ke všem atributům dané třídy. Bez ohledu na modifikátory viditelnosti.
Příklady na modifikátory viditelnosti Strana 7 / 17 Obsah přednášky 1 Připomenutí návrhu použitelných tříd 2 Jak skrýt implementaci třídy 3 Příklady na modifikátory viditelnosti 4 Shrnutí
Příklady na modifikátory viditelnosti Strana 8 / 17 Příklad Hrdina Příklad Hrdina Mějme hru, kde jsou hrdinové. Na počátku má hrdina sílu i obratnost rovnu n. Pokud bojuje, zvýší se mu po určité době síla. Síla však souvisí s obratností. Pokud se zvýší síla, musí se snížit obratnost. Jak docílíte toho, aby vždy, když se zvýší síla, zmenšila se obratnost?
Příklady na modifikátory viditelnosti Strana 9 / 17 Příklad Hrdina: model - sila : int - obratnost : int Hrdina + Hrdina(pocatecniSilaAObratnost : int) + zvysurovensily() : void + getsila() : int + getobratnost() : int
Příklady na modifikátory viditelnosti Strana 10 / 17 Příklad Hrdina: kód 1 class Hrdina { 2 private : 3 int m_ sila ; 4 int m_obratnost ; 5 public : 6 Hrdina ( int pocatecnisilaaobratnost ){ 7 m_sila = pocatecnisilaaobratnost ; 8 m_obratnost = pocatecnisilaaobratnost ; 9 } 10 11 void zvysurovensily (){ 12 m_ sila ++; 13 m_ obratnost - -; 14 } 15...
Příklady na modifikátory viditelnosti Strana 11 / 17 Příklad Hrdina: použití 1 int main (){ 2 Hrdina * artus = new Hrdina ( 10); 3 // vypise vzdy 10 4 cout << " Sila : " << artus - > getsila () << endl ; 5 cout << " Obr.: " << artus - > getobratnost () << en 6 7 artus -> zvysurovensily (); 8 // vypise 11 a 9 9 cout << " Sila : " << artus - > getsila () << endl ; 10 cout << " Obr.: " << artus - > getobratnost () << en 11 12 delete artus ; 13 return 0; 14 }
Příklady na modifikátory viditelnosti Strana 12 / 17 Příklad Student Příklad Student Mějme univerzitní informační systém. Ten eviduje studenty. Každý student má evidováno jméno, semestr studia, studijní průměr a součet vyplacených stipendií. Všechny tyto vlastnosti budou zadány konstruktorem mimo vyplacených stipendií. Ta budou 0. Implementuje pro objekt následující metody: Musí existovat metoda, která umožní vypsat na obrazovku částku, která byla doposud studentovi vyplacena a také částku, která má být studentovi vyplacena jako stipendium v aktuálním období. Stipendium se spočítá následujícím způsobem: (1000 * průměr) + (semestr studia * 100). Dále musí existovat metoda, která umožní přičíst studentovi aktuální výši stipendia k jeho vyplaceným stipendiím.
Příklady na modifikátory viditelnosti Strana 13 / 17 Příklad Student: první analýza Student - jmeno : string - semestr : int - studijniprumer : float - vyplacenostipendii : float + Student(jmeno:string, semestr:int, prumer:float) + vypisstipendia() : void + prictistipendia() : void... Zamysleme se: Nebude se v některých metodách něco opakovat?
Příklady na modifikátory viditelnosti Strana 14 / 17 Příklad Student: hlubší analýza 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ší! Jedna metoda jeden úkol.
Shrnutí Strana 15 / 17 Obsah přednášky 1 Připomenutí návrhu použitelných tříd 2 Jak skrýt implementaci třídy 3 Příklady na modifikátory viditelnosti 4 Shrnutí
Shrnutí Strana 16 / 17 Shrnutí Atributy, které charakterizují stav objektu by měly být skryté. Lze k nim přistupovat pomocí metod ty tvoří rozhraní pro přístup. Stejně tak by měly být skryté metody, které není smysluplné volat z venku. Cílem je, aby programátor nemusel znát strukturu objektu, ale jen operace, které smí provádět. Aplikace těchto principů umožňuje snažší spolupráci, bezpečnost, modulárnost a znovupoužitelnost.
Shrnutí Strana 17 / 17 Příklady k procvičení Příklad Autopůjčovna Pro informační systém autopůjčovny vytvořte třídu Auto. Tato třída má následující vlastnosti: najeto km, cena za půjčení na den a kolik celkem auto vydělalo. Všechny tyto vlastnosti vynut te v konstruktoru. Vytvořte metodu, které předáte počet dní na které chcete auto půjčit a ona vrátí cenu za půjčení. Dále vytvořte metodu, která umožní přidat záznam o zapůjčení auta na předaný počet dní (tj. metoda přičte příslušnou částku půjčovného do atributu se součtem vydělaných peněz a zaznamená počet ujetých km). Dále vytvořte metodu, která umožní vypsat na obrazovku veškeré informace o autě. Zařid te aby se vždy když se zvýší počet najetých km o 10000 km snížila cena za zapůjčení auta o 10 %.