GRASP – 2 – High cohesion

V druhém díle o návrhových principech GRASP (General Responsibility Assignment Software Patterns) se budeme zabývat principem High cohesion –  Vysoká soudržnost. Jde o hodnotící princip sloužící k porovnávání kvality různých zvažovaných možností návrhu.

Seriál: Principy objektově orientovaného návrhu (12 dílů)

  1. Návrhové principy: SOLID 9.5.2012
  2. Návrhové principy: Deméteřin zákon 18.5.2012
  3. Návrhové principy: DRY 30.5.2012
  4. GRASP – 1 – Úvod a Protected variations 20.6.2012
  5. GRASP – 2 – High cohesion 2.7.2012
  6. GRASP – 3 – Low coupling 16.7.2012
  7. GRASP – 4 – Polymorphism, Pure fabrication a Indirection 30.7.2012
  8. GRASP – 5 – Information expert a Creator 15.8.2012
  9. GRASP – 6 – Controller a jak GRASP používat 17.9.2012
  10. GRASP – 7– Modelové příklady 15.10.2012
  11. Návrhové principy: Tvorba balíčků (1/2) – Soudržnost 14.11.2012
  12. Návrhové principy: Tvorba balíčků (2/2) – Závislosti a provázanost 14.1.2013

Principy High cohesion –  Vysoká soudržnost a Low coupling – Slabá provázanost jsou další dva poměrně abstraktní principy z GRASP, jejichž účelem je především fungovat jako hodnotící principy při zvažování variant řešení vyplývajících z ostatních principů. Neslouží tedy k tomu, aby doporučovaly nějaké konkrétní řešení, ale pro jejich porovnávání.

Tyto principy jsou velice staré. Vznikly dávno před vznikem objektově-orientovaného paradigma. Myšlenka modulárního návrhu v klasických programovacích jazycích, jako je například jazyk C, využívá právě tyto dva principy.

Craig Larmann nazývá low coupling a high cohesion „jin a yang softwarového inženýrství“.

V tomto díle rozebereme první z principů z této dvojice, a to princip High cohesion. Princip Low coupling bude probrán v následujícím díle.

High cohesion – Vysoká soudržnost

Soudržnost (cohesion) – je míra toho, jak moc jsou navzájem zodpovědnosti jednoho prvku  souvisejí. Prvky s vysokou soudržností mají pouze několik málo vzájemně souvisejících zodpovědností menšího rozsahu. Naopak prvky s nízkou soudržností dělají velké množství nesouvisejících věcí nebo samy dělají velké množství práce velkého rozsahu. Grady Booch (tvůrce UML) popisuje vysokou kohezi jako případ, kdy „vše pracuje společně kvůli poskytnutí nějaké jasné ohraničené služby“.

Princip High cohesion nám tedy říká:

Přiřazujte zodpovědnosti tak, aby zůstala zachována vysoká soudržnost.

Pokud náš návrh obsahuje prvky s nízkou soudržností, nelze se vyhnout řadě problémů. Jednotlivé prvky jsou těžko pochopitelné, protože jsou v nich smíchány nesouvisející věci, a to, co nás zajímá, musíme hledat mezi nimi. Jejich znovu-použitelnost je obtížná, protože pokud chceme použít nějakou část funkčnosti třídy, musíme ji vzít celou se všemi jejími funkcemi a závislostmi, které nepotřebujeme.

Málo soudržné prvky jsou také mnohem méně stabilní. Protože zodpovídají za řadu různých věcí je nutné je měnit mnohem častěji, kdykoliv se mění některé z těchto věcí. Důsledkem toho je i jejich složitější údržba, protože při každé změně musíme zkontrolovat, zda jsme neúmyslně neovlivnili nějakou jinou zodpovědnost prvku.

Z dodržování principu vysoké soudržnosti tedy plynou tyto výhody:

  • Třídy s vysokou soudržností se snadněji chápou
  • Lze je snadno udržovat
  • Jsou stabilnější a méně často se mění
  • Je podpořena znovu-použitelnost

Důvodem nízké soudržnosti bývá často příliš hrubá granularita zodpovědností – vznikají pak příliš rozsáhlé prvky, které musejí pokrýt celý rozsah této příliš obecně definované zodpovědnosti. Druhou častou příčinou je, že prvek sám zpracovává zodpovědnosti, které by měl správně delegovat na jiné specializovanější prvky.

Častým způsobem, jak vznikají třídy s nízkou soudržností, je postupné přidávání zodpovědností, které souvisejí s danou třídou. Přidání jedné zodpovědnosti navíc není samo o sobě velkým problém, pokud tato zodpovědnost má souvislost s dalšími zodpovědnostmi dané třídy. Postupně však může vzniknout přerostlý (bloated) objekt, který již ztrácí soudržnost. Vzniklá třída pak obsahuje velké množství zodpovědností, z nichž každá souvisí pouze s několika dalšími. V takovémto případě je obvykle nejlepším řešením třídu rozdělit na více menších soudržných částí.

Pro posuzování úrovně soudržnosti můžeme použít několik pomůcek.

Základním pravidlem pro posuzování soudržnosti je, že třída obsahuje pouze malé množství metod, které poskytují související funkce.

Robert „Uncle Bob“ C. Martin doporučuje jako další hrubou metriku soudržnosti třídy, podívat se na to kolik každá její metody používá instančních proměnných. Pokud mnoho metod používá pouze malou část instančních proměnných, je to známka toho, že třída je málo soudržná.

Podle Craiga Larmana soudržnost můžeme rámcově rozdělit na několik úrovní:

  • Velmi nízká soudržnost – třída je zodpovědná za dvě nebo více nesouvisejících funkčních oblastí (například zajišťuje business logiku i práci s databází).
  • Nízká soudržnost – třída je zodpovědná za mnoho funkcí v jedné funkční oblasti. Obsahuje velké množství metod a pomocného kódu (příkladem je třída, která sama zodpovídá za všechny operace s databází). Takovéto třídy by měly být rozděleny na více menších vzájemně spolupracujících tříd.
  • Vysoká soudržnost – Třída má přiměřené množství zodpovědností v jedné funkční oblasti a na provedení úkolů spolupracuje s dalšími třídami.
  • Přiměřená soudržnost – Třída má několik zodpovědností menšího rozsahu, které všechny souvisejí s účelem třídy, ale ne spolu navzájem. Toto je typický případ Controllerů a objektů na vyšších úrovních abstrakce (objektů představujících celý subsystém).

Princip jedné odpovědnosti (SRP) popsaný v díle o SOLID principech říká, že každá třída by měla mít právě jednu zodpovědnost/důvod ke změně. Jde tedy pouze o poněkud přísnější vyjádření principu vysoké soudržnosti.

Princip oddělení rozhraní  (ISP) popsaný v díle o SOLID principech doporučuje vytvářet  více soudržných rozhraní je lepší než jedno univerzální rozhraní. Je tedy také založen na myšlence vysoké soudržnosti rozhraní.

Závěr

Zvažování dopadů na soudržnost je důležitý prvek při zvažování různých variant návrhu, bez ohledu na to, jaké bude výsledné rozhodnutí. Tento princip bychom měli mít na mysli během každého návrhového rozhodování.

Pokračování příště

V příštím díle probereme druhou část této jin a jang dvojice tedy princip Low coupling – Slabá provázanost.

Zdroje a další informace

Martin Jonáš pracuje jako projektový manažer v GrowJOB institute. Vystudoval Informační systémy na Fakultě informačních technologií VUT.

Komentáře: 2

Přehled komentářů

Jan Machala Pochvala
Podbi Re: Pochvala
Zdroj: https://www.zdrojak.cz/?p=3674