Vyřešené teoretické otázky do OOP (16. 1. 2013)
1) Vyjmenujte v historickém pořadí hlavní programovací paradigmata a stručně charakterizujte každé paradigma. a) Naivní – chaotičnost, špatná syntaxe a sémantika b) Sekvenční – sériové řazení příkazů, příkaz GO TO, nepřehledný a nečitelný zápis. (ASSEMBLER, Fortran, Basic). 1. Styl programování, c) Strukturované – posloupnost příkazů, struktury tvoří bloky, kde jsou příkazy. Bloky lze přeskakovat, opakovat. Bloky->grafické stromy, ALGOL, Pascal, Jazyk C d) Objektové – množina objektů, které si posílají zprávy. Pracují se třídami a instancemi objektů. Objekt (stav, chování, komunikace) 2) Proč dáváme přednost skládání před dědičnosti U dědičnosti je nebezpečí odkrytí implementace kódu. Dědí vlastnosti a mohou k nim přidávat vlastní rozšíření. 3) Co je to jedináček? (K čemu se využívá návrhového vzoru jedináček, angl. Singleton)? Zabezpečuje vytvoření nejvýše jedné instance (Používá se, když chceme v celém programu zajistit jednu instanci třídy) 4) Proč není dobré, při programování, hledat vždy nejoptimálnější řešení? a) Kvůli budoucím možným úpravám b) Změnám požadavků c) Může docházet k znepřehlednění kódu. 5) Jak předcházíme chybným reakcím v našem programovém kódu? Včasným (průběžným) testováním. 6) Proč programujeme proti rozhraní? Lze měnit/doplnit instanční třídy bez ohrožení tříd, kterou takovou třídu používají, 7) Vyjmenujte základní koncepty objektového přístupu. a) b) c) d) e) f) g) h) i) j) k) l) m) n)
Abstrakce Třída Dědičnost Polymorfismus Zapouzdření Asociace Vazba Agregace Synergie a objektová struktura Zprávy Zachování stavu Skrývání implementací Genericita Identita objektů.
8) Popište zásadu o maximalizaci soudržnosti: O čem je, v čem je problém a jak ho řešíme. Každá část řeší jednu problematiku, pokud je činnost jednoduchá, zůstáváme u dané metody. a) b) c) d)
Zásada: každá entita by měla řešit jeden konkrétní úkol O čem to je: žádná entita by neměla mít na starosti několik věcí najednou V čem je problém: předčasné zkoumání detailů Řešení: požádat o pomoc jiný objekt
9) K čemu je dobrá genericita? K omezování duplicit ve zdrojovém kódu 10) V čem si myslíte, že je dědičnost nebezpečná. Je to příliš silná zbraň, proto je i nebezpečná. 11) Popište, jak lze odstranit dědičnost. Implementací rozhraní. (v2 - Nahradit skládáním) 12) Co je to iterátor? Prostředek zajišťující sekvenční přístup k datům. 13) K čemu slouží iterátor? Umožňuje procházet kolekcí bez znalosti implementace. 14) Jakého principu využívá iterátor? Zřetězeného seznamu. 15) V čem je testovací program výhodnější než ověření vyvíjených tříd běžnou aplikací? Oddělení testu od kódu. (v2 – Je přesnější) 16) Co je to jednoduchá tovární metoda? Účel je vytvořit novou instanci nějakého objektu. 17) V čem je výhodnější vypočítat výstupní hodnoty při změně atributů oproti výpočtu při převzetí výstupní hodnoty. 18) V čem je testovací program výhodnější než ověření vyvíjených tříd běžnou aplikací? Pouze jedna instance třídy 19) Kde v Java se výhodně využívá návrhový, vzor dekorátor? U genericity. (v2 - Knihovny proudu a knihovny GUI) 20) Jak objekty zachovávají stav? Stav je množina hodnot, kterou si objekt zachovává. Zachování stavu je jádrem práce s objekty. 21) Co je to defenzivní programování? je forma návrhu softwaru, která se snaží zaručit jeho nepřetržitou funkčnost i za podmínek použití, ke kterým nebyl původně navržen.
22) V čem se liší asociace a kompozice. Kompozice je relace mezi třídami. Asociace je základní vazba mezi třídami. Je to předpis, jak budoucí objekty mohou mezi sebou navazovat spojení. (v2 - Asociace je základní vazba mezi třídami, předpis, jak spolu budou objekty komunikovat. Kompozice je proti tomu nejsilnější vazbou, součásti kompozice nemohou existovat samostatně, jen jako celek.) 23) Jaké jsou výhody programování proti rozhraní? Proměnné by neměly být deklarovány jako instance vnořené třídy, ale jako instance. Musí se myslet na uživatele. Použitím interface se skrývá implementace našeho kódu. 24) K čemu s výhodou používáme genericitu? K odstranění duplicity v kódu. 25) Proč je dobré řídit vývoj softwaru testy? Znáte nějaké metody výběru testovacích příkladů? ???? 26) K čemu jsou výjimky? Vysvětlete princip. K zachytávání a ošetření chybových stavů. 27) Popište principy zásady zapouzdření a odpoutání kódu. a) Zapouzdřený kód nám umožní se snáze odpoutat od zbytku, takže libovolně měníme, aniž ovlivníme zbytek. b) Odpoutáním se myslí odstranění přímých vazeb. Například tím, že se nebudeme obracet přímo na instance dané třídy, ale na rozhraní, které daná třída implementuje. 28) V čem si myslíte, že je dědičnost nebezpečná? Může dědit chyby, odkrývat implementaci, je to příliš silná vazba, při více násobné dědičnosti může vznikat duplicita 29) Vyjmenujte koncepty objektové orientace (OO) a) b) c) d) e) f) g) h) i) j) k) l)
Zapouzdření Skrývání implementace Zachování stavu Identita objektu Komunikace Struktura zprávy Argumenty zprávy Role objektu Typ zprávy Třídy dědičnost Polymorfismus Genericita
30) Vyjmenujte zásady správného návrhu OOP Skrývání implementace, zapouzdření, soudržnost, programování proti rozhraní, návrh řízený odpovědností, minimální provázanost, vyhýbání se duplicitě, skládání před dědičností, nepodřizovat návrh efektivitě, odpoutání
31) Popište zásadu programování proti rozhraní. Proměnné nedeklarovat jako instanci konkrétní třídy, ale jako instance nějakého datového typu, který není vázán na implementaci a) Lze měnit instanční třídy bez ohrožení tříd, kterou takovou třídu používají b) Lze doplnit instanční třídy bez ohrožení tříd, kterou takovou třídu používají 32) Jakými programovacími metodami vytvoříme bezpečnější software. a) b) c) d)
Skrývání implementace Skládání Vyhýbání se dědičnosti Programovat proti rozhraní
33) V čem je dědičnost nebezpečná? Proč bychom se ji měli vyhýbat. Může dědit chyby, odkrývat implementaci, je to příliš silná vazba, při více násobné dědičnosti může vznikat duplicita 34) Jak vznikají duplicity v kódu a jak se odstraňují. a) Vznik: kopírování (copy-paste) z jiných programů b) Odstranění: pomocí metod s parametry pomocí parametru třídy 35) Primitivní konstruktor. Neobsahuje žádné parametry. 36) Co je to identita? Jaká jsou pravidla? Identita představuje jedinečnou existenci objektu v čase a prostoru, která jej odlišuje od jiných objektů 37) Jaký princip si představujete pod pojmem Anonymita klienta? Nevíme, kdo použije program a jaký s ním bude mít záměr. 38) V čem se liší asociace a agregace v implementaci v programovacím jazyce java? Asociace je obecnější vazba než agregace. Agregace je určitá forma asociace, která specifikuje vztah mezi celkem a jeho částí. 39) Popište co je to skrývání implementace. Spolupracující programy nesmí v žádném případě zjistit co náš objekt dělá, že umí to, co umí a jakkoliv negativně ovlivnit náš objekt. A proto je nutné zveřejnit jenom potřebné metody, ostatní metody (pomocné) by měly být soukromé. 40) Jaké známe vnořené třídy a jaký je mezi nimi rozdíl. a) Staticky vnořené třídy - Jedná se o třídy, které byly pouze vnořeny do vnější třídy z důvodu, že spolu souvisí významově. Lze vytvořit její instanci nezávisle na instanci vnější třídy. b) Vnitřní třída - Vnitřní třída je daleko víc provázána se svojí vnější třídou, protože se stává členem vnější třídy. Její instance je možná pouze v instanci vnější třídy. 41) Co je to anonymita klienta?
Anonymitou klienta se rozumí to, že se neví při návrhu nějaké třídy kdo ji a jak bude užívat.