Soudržnost (Cohesion) ve vývoji mobilních aplikací: základy, úrovně a jak ji zvýšit

Autor: IT Sectr Publikováno: 2026-05-13 Doba čtení: 9 min

Cohesion (soudržnost) je metrika, která ukazuje, jak těsně jsou propojeny prvky uvnitř jednoho modulu nebo třídy. Podle Wikipedia je vysoká soudržnost znakem dobře navrženého modulu, kde všechny metody a pole pracují na jednom úkolu. Cohesion přímo ovlivňuje udržovatelnost kódu a stojí v protikladu k coupling — provázanosti mezi moduly.

Hlavní body

  • Cohesion — míra toho, jak jsou prvky uvnitř modulu spojeny společným cílem
  • Vysoká soudržnost usnadňuje porozumění kódu, testování a provádění změn
  • Nízká soudržnost znamená, že modul vykonává několik nesouvisejících úkolů
  • Cohesion a coupling — vzájemně propojené metriky: čím vyšší soudržnost, tím nižší provázanost
  • Funkční soudržnost — nejvyšší úroveň, ke které je třeba směřovat

Co je to Cohesion

Cohesion (soudržnost) — metrika, která hodnotí, jak logicky jsou propojeny metody, pole a vlastnosti uvnitř jedné třídy nebo modulu. Modul s vysokou soudržností vykonává jeden úkol a obsahuje pouze ty prvky, které jsou pro jeho splnění nezbytné. Modul s nízkou soudržností se snaží dělat několik věcí najednou — metody jsou významově slabě propojeny.

V kontextu objektově orientovaného programování soudržnost úzce souvisí s principem Single Responsibility (S). Pokud má třída jednu jasnou odpovědnost, její soudržnost je obvykle vysoká. Pokud se třída zabývá UI, business logikou i prací se sítí — soudržnost je nízká a takovou třídu je vhodné rozdělit na několik samostatných tříd s užší odpovědností.

Porozumění cohesion pomáhá vývojáři rozhodovat se o refaktoringu. Když vidíte, že ve třídě existuje metoda, která nepoužívá pole třídy, je to signál nízké soudržnosti. Taková metoda je buď ve třídě zbytečná, nebo je třída nesprávně navržena. Usilování o vysokou soudržnost je neustálá práce na zlepšování architektury na každé úrovni kódu.

Typy a úrovně soudržnosti

V softwarovém inženýrství rozlišujeme sedm úrovní soudržnosti, od nejhorší po nejlepší. Porozumění této škále umožňuje objektivně posoudit kvalitu modulu a pochopit, jakým směrem se ubírat při refaktoringu. Čím vyšší úroveň, tím udržovatelnější a srozumitelnější kód bude.

Nízká soudržnost: náhodná, logická a časová

Náhodná (coincidental) — nejhorší úroveň, kdy jsou prvky v modulu seskupeny náhodně, bez jakékoli logické souvislosti. Příklad: třída Utilities, ve které jsou shromážděny metody formátování data, odesílání e-mailu a výpočtu slevy. Takovou třídu nelze pochopit bez přečtení všech metod a změna jedné metody může rozbít jiné jen proto, že jsou vedle sebe.

Logická (logical) soudržnost — prvky vykonávají logicky související, ale svou podstatou různé úkoly. Třída s metodami parseJSON, parseXML a parseCSV je logicky spojena tématem „parsování“, ale každá metoda dělá zásadně odlišnou práci. Problém: při přidání nového formátu (YAML) třída roste a její rozhraní se nafukuje.

Časová (temporal) soudržnost — prvky jsou seskupeny podle času provedení. Třída AppInitializer, která nastavuje databázi, načítá konfiguraci, inicializuje analytiku — vše se děje při spuštění aplikace, ale samotné úkoly spolu nesouvisí. Lepší je rozdělit je na samostatné Initializery pro každou oblast odpovědnosti.

Střední soudržnost: procedurální a komunikační

Procedurální (procedural) soudržnost vzniká, když jsou prvky spojeny posloupností provádění. Modul „Zpracování objednávky“ obsahuje metody validateCart, processPayment, sendConfirmation — každá metoda je volána striktně po předchozí. To je lepší než náhodná nebo logická soudržnost, ale stále to není ideál: každý krok může být vyčleněn do samostatného modulu.

Komunikační (communicational) soudržnost — prvky pracují se stejnými daty. Třída UserService s metodami getUser, updateUser, deleteUser je spojena společnou entitou User. To je podstatně lepší než procedurální soudržnost: třída má jasnou věcnou oblast. Většina Repository tříd v mobilních projektech má komunikační soudržnost.

Vysoká soudržnost: funkční

Funkční (functional) soudržnost — nejvyšší úroveň, kdy se každý prvek modulu podílí na vykonávání jednoho úkolu. Třída PasswordValidator s jedinou metodou validate, která kontroluje délku, přítomnost znaků a složitost hesla — příklad funkční soudržnosti. Pokud se taková třída mění, pak jen proto, že se změnila pravidla pro validaci hesel.

Dosažení funkční soudržnosti je hlavním cílem architektonického refaktoringu. Každá třída by měla mít přesně jeden důvod ke změně. V mobilním vývoji se funkční soudržnosti dosahuje vyčleněním samostatných Use Cases, vlastních View, formátovačů a validátorů. Každá taková třída je hotový stavební blok s jasnou oblastí odpovědnosti.

Cohesion vs Coupling

Cohesion a coupling — dvě strany jedné kvality. Čím vyšší je soudržnost uvnitř modulu, tím nižší je obvykle provázanost mezi moduly. Dobře navržený systém současně usiluje o vysokou soudržnost uvnitř a slabou provázanost navenek. Toto pravidlo je považováno za zásadní v softwarovém inženýrství od 70. let 20. století.

Vztah cohesion-coupling lze představit jako rovnováhu. Pokud vývojář obětuje soudržnost, spojením několika úkolů do jedné třídy, sousední moduly získají více závislostí — musí se obracet na tuto přetíženou třídu pro různé účely, což zvyšuje provázanost. A naopak, rozdělení na malé třídy s vysokou soudržností snižuje počet bodů interakce mezi moduly.

V praxi to znamená: když vyčleňujete novou třídu s funkční soudržností, zároveň zbavujete ostatní moduly nutnosti znát detaily její implementace. Například vyčleněním EncryptionManager do samostatné třídy s funkční soudržností poskytujete ostatním modulům jednoduché rozhraní encrypt/decrypt bez nutnosti rozumět detailům šifrovacího algoritmu.

kotlin
// Nízká soudržnost — třída dělá všechno najednou
class UserManager {
    fun fetchAndSaveUser(id: String) { }
    fun parseUserJson(json: String): User { }
    fun displayUserName(user: User): String { }
    fun validateEmail(email: String): Boolean { }
}

// Vysoká soudržnost — každá třída řeší jeden úkol
class UserRepository {
    fun fetchUser(id: String): User { }
}

class UserJsonParser {
    fun parse(json: String): User { }
}

class UserNameFormatter {
    fun format(user: User): String { }
}

class EmailValidator {
    fun isValid(email: String): Boolean { }
}

Příklad ukazuje rozdíl: UserManager má logickou soudržnost — všechny metody jsou o uživatelích, ale každá dělá zásadně odlišnou práci. Po refaktoringu má každá třída funkční soudržnost a provázanost se snižuje, protože ostatní moduly závisí pouze na třídě, kterou potřebují, a ne na celém UserManager.

Jak měřit soudržnost v kódu

LCOM (Lack of Cohesion of Methods) — nejznámější metrika pro měření soudržnosti třídy. LCOM vypočítává, kolik párů metod nepoužívá společná pole. Hodnota 0 znamená ideální soudržnost (všechny metody pracují se stejnými poli), vysoká hodnota znamená nízkou soudržnost. LCOM4 (vylepšená verze) zohledňuje tranzitivní vazby přes jiné metody.

V Android vývoji lze metriky soudržnosti získat pomocí Detekt s pravidlem TooManyFunctions. Třídy s desítkou metod používajících různé skupiny polí mají pravděpodobně nízkou soudržnost. V iOS má SwiftLint pravidla file_length a function_body_length — nepřímé indikátory: dlouhé soubory a metody často signalizují nízkou soudržnost.

Ruční způsob hodnocení: položte si otázku „Změní se tato třída z jednoho důvodu nebo z několika?“ Pokud dokážete uvést více než jeden nezávislý důvod — třída má nízkou soudržnost. Druhý test: „Lze tuto třídu rozdělit na dvě nezávislé třídy?“ Pokud ano — udělejte to. Pravidelná kontrola soudržnosti při code review zabraňuje vzniku God tříd a snižuje technický dluh.

Jak zvýšit Cohesion v mobilním projektu

První krok — aplikujte princip Single Responsibility. Každá třída by měla mít jednu jasnou odpovědnost. Pokud je ve třídě metoda, která nepatří k jejímu hlavnímu úkolu, přeneste ji do samostatné třídy. Technika Extract Class nebo Extract Delegate v IDE tento proces automatizuje. Po vyčlenění zkontrolujte, zda se původní třída stala více zaměřenou.

Druhý krok — použijte vzor Facade pro zjednodušení rozhraní. Pokud třída poskytuje 20 metod, z nichž klienti používají jen 3-4, má třída pravděpodobně nízkou soudržnost — poskytuje příliš mnoho různé funkcionality. Seskupte metody podle témat a vyčleňte samostatné třídy pro každou skupinu, původní třídu pak udělejte fasádou nebo ji odstraňte.

Třetí krok — věnujte pozornost skupinám polí. Pokud má třída pole, která jsou používána pouze částí metod — je to indikátor nízké soudržnosti. Rozdělte třídu podle skupin polí. Například pokud třída obsahuje pole userRepository, networkClient a analyticsTracker, ale metody první skupiny používají pouze userRepository, zatímco druhé skupiny pouze networkClient — jedná se o dvě různé třídy.

Čtvrtý krok — vyhýbejte se vytváření „pomocných“ tříd s libovolnými static metodami. Každá static metoda nacházející se ve třídě Utils nebo Helpers je kandidátem na vyčlenění do specializované třídy. FormatUtils.dateToString je lepší přesunout do DateFormatter a ValidationUtils.isValidEmail do EmailValidator. To zvyšuje soudržnost každé třídy a činí kód samodokumentujícím.

Často kladené otázky

Je vysoká soudržnost vždy dobrá?

Téměř vždy. Funkční soudržnost činí kód srozumitelným a předvídatelným. Nicméně dovedení do extrému může vést k nadměrné fragmentaci: když je pro každou operaci vytvořena samostatná třída a architektura se stává zbytečně složitou. Rovnováha — několik tříd na jednu funkci, každá s funkční soudržností.

Čím se cohesion liší od modularity?

Cohesion — metrika vnitřní konzistence jednoho modulu nebo třídy. Modularity — architektonický princip, při kterém je aplikace rozdělena na fyzické moduly. Vysoká soudržnost je cílem při návrhu jak jednotlivých tříd, tak celých modulů.

Jak nástroje pro analýzu kódu pomáhají se soudržností?

Detekt pro Android a Xcode Analyzer pro iOS zvýrazňují třídy s podezřele velkým počtem metod nebo polí. IntelliJ IDEA a AppCode mají vizualizaci závislostí — můžete vidět graf vazeb a odhalit třídy s nízkou soudržností. SonarQube počítá metriky LCOM automaticky.

Může mít rozhraní vysokou soudržnost?

Ano. Rozhraní s metodami connect, disconnect a isConnected má vysokou soudržnost — všechny metody se týkají správy připojení. Rozhraní s metodami connect, parseData a renderUI má nízkou soudržnost. Princip segregace rozhraní (Interface Segregation — SOLID) vyžaduje vytvářet úzce specializovaná rozhraní s vysokou soudržností.

Jak zkontrolovat soudržnost při code review?

Položte tři otázky: lze popsat účel třídy jednou větou? Podporují všechny metody tento účel? Existují ve třídě pole, která nejsou používána částí metod? Pokud je odpověď na některou otázku záporná — soudržnost je nízká a třídu je vhodné rozdělit.

Shrnutí

  • Cohesion — metrika vnitřní konzistence modulu, ukazující, jak jsou jeho prvky spojeny společným cílem
  • Funkční soudržnost — nejvyšší úroveň, kdy všechny prvky modulu pracují na jeden úkol
  • Náhodná a logická soudržnost — nejhorší úrovně, signalizující potřebu refaktoringu
  • Cohesion a coupling jsou nepřímo úměrné: čím vyšší soudržnost uvnitř, tím slabší provázanost navenek
  • LCOM — metrika pro numerické hodnocení soudržnosti, dostupná ve statických analyzátorech
  • Princip Single Responsibility — praktický nástroj pro dosažení vysoké soudržnosti
  • Vyhýbejte se pomocným třídám Utils — každá metoda takové třídy by se měla stát samostatnou specializovanou třídou

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také