PV168/Úvod do objektového návrhu v Javě

Z FI WIKI
Verze z 2. 4. 2011, 21:05; Peter Tomov (diskuse | příspěvky)

(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Přejít na: navigace, hledání

Zpět na PV168

Co bychom měli znát

Dekompozice

Základem objektového návrhu je vhodná dekompozice. Co je to dekompozice?

Dekompozice je rozklad problému na dílčí podproblémy, které se pak řeší samostatně. V případě programování se jedná zejména o rozdělení programu do modulů, objektů a metod.

Základní principy dekompozice v objektově orientovaném prostředí

  • Snažíme se identifikovat jednotlivé části problému, které je vhodné modelovat pomocí tříd. Obvykled narazíme na třídy s charakterem entit (Student, Car, Course, apod.) a na třídy reprezentující spíše operace či sady operací (StudentCatalog, QueryParser, StorageManager).
  • Každá komponenta (balíky, třídy a metody) dekomponovaného systému by měla řešit právě jeden konkrétní problém.
  • Granularita jednotlivých komponent (balíků, tříd a metod) by měla být příměřená.
    • Třídy by měly řešit jeden konkrétní problém.
    • Pokud je třída složitá, je lepší ji rozdělit do několika tříd.
    • Velmi užitečným pomocníkem jsou vnořené třídy.
    • Metoda by měla mít pouze několik málo řádek (limit je jedna obrazovka)
    • Pokud je granularita nevhodná, použijeme refaktorování.

Jak se pozná dobrá dekompozice

  • Je jednoduchá (vyhýbáme se zbytečně komplikovaným návrhům a neřešíme problémy, které řešit nemusíme).
  • Každá komponenta (třída nebo metoda) je co nejjednodušší (ale aby dávala smysl).
  • Mezi komponentami je co nejméně závislostí.
  • Využívá výhody zapouzdření (skrývání složitosti).
  • Neobsahuje duplicitní kód
  • Pokud je to možné, používá neměnitelné třídy.
  • Používání rozhraní
  • Hierarchie výjimek
  • Omezit užití dědičnosti (nahradit kompozici nebo agregací a delegováním)
  • Znovupoužitelnost (nevynalézat znova kolo, znát knihovny, Java Core API, jakarta-commons)
  • Frameworky
  • KISS

Závislosti

  • Komponenta A závisí na komponentě B pokud:
    • Metody třídy A používají třídu nebo rozhraní B
    • Třída A rozšiřuje třídu B
    • Třída A implementuje třídu B
  • Potom komponentu A nelze použít bez komponenty B
  • Závislosti
    • komplikují údržbu kódu (změny jsou složité);
    • brání znovupoužitelnosti kódu;
    • indikují chybu v dekompozici (pokud je jich moc).
  • Zásadní chybou jsou cyklické závisloti
    • Nikdy se nesmí objevit
    • Vždy jsou důsledkem špatné dekompozice
    • Dají se vždy odstranit.

Další zásady, aspekty, nástroje