Oddělení zodpovědností
V programování se proces oddělení zodpovědností (Separation of Concerns - SoC) rozumí rozdělení počítačového programu na různé části tak, aby se z hlediska funkcionality tyto části co možná nejméně překrývaly. To znamená, aby určitou funkcionalitu vykonávala pouze část programu k tomu určená. Další část programu by pak neměla kopírovat v sobě stejnou funkcionalitu.
Zodpovědnost je typicky synonymem pro jakoukoliv funkcionalitu nebo chování programu. Kvalitní dodržení zásady oddělení zodpovědností bývá často dosahováno za pomoci dalších zásad programování, jako je například modularita, zapouzdření a ukrývání implementace. Vrstvená architektura je také důsledkem oddělení zodpovědností (když máme například třívrstvou architekturu, kdy jsou odděleny části, které se starají o práci s daty, samotnou aplikační logiku a zobrazení výsledků zpracování uživateli).
Architektura orientovaná na služby (Service Oriented Architecture – SOA) vychází rovněž z principu oddělení zodpovědností, kdy jednotlivé služby pokrývají řešení určitého problému a poskytují ho za pomocí rozhraní ostatním službám. Každá služba by se měla starat pouze o jí přidělenou funkcionalitu a neměla by překrývat funkcionalitu služby druhé. Druhá služba jí poskytne potřebnou funkcionalitu skrze rozhraní.
Pojem oddělení zodpovědností se může vyskytnout ve více oborech. Může se jednat například o obory, které mají něco společného s architekturou, jako jsou územní plánování nebo architektura samo o sobě. Cílem tohoto přístupu je navrhnout dané systémy, ať už se jedná o dům nebo program, tak, aby se dali co nejjednodušeji spravovat a upravovat za doby jejich využití. Jednotlivé funkce systému je nutné navrhnout tak, aby mohly být průběžně optimalizovány, a aby tato optimalizace nezasáhla další funkce a části systému, jak se většinou stává a potom následuje kaskádové rozšíření problémů po celém systému. Dalším důležitým aspektem oddělení odpovědností je fakt, že složitý systém je potřeba vždy určitým způsobem pochopit. Oddělení odpovědností nás vede k návrhu systému tak, aby byl co nejlépe pochopitelný a upravovatelný, což je dnes jeden z hlavních požadavků na veškeré systémy, jelikož požadavky zákazníků se v dnešní době mění neustále. Běžným příkladem může být vedení elektrického proudu v domě pro jednotlivé pokoje a dnes už i pro jednotlivé spotřebiče zvlášť místo například napojení obývacího pokoje na kuchyň, kde je velké množství spotřebičů. Při závadě nebo vyřazení elektrického proudu v kuchyni dojde k vyřazení i obývacího pokoje. Takto se snaží oddělení odpovědností přistoupit i k návrhu programových systémů.
Původ pojmu
Samotný vznik pojmu oddělení odpovědností (Separation of Concerns) je přiřazován nizozemskému profesoru Edsger W. Dijkstra, který ho použil ve své práci nazvané – „On the role of scientific thought“ (O úloze vědeckého myšlení). [1]
Let me try to explain to you, what to my taste is characteristic for all intelligent thinking. It is, that one is willing to study in depth an aspect of one's subject matter in isolation for the sake of its own consistency, all the time knowing that one is occupying oneself only with one of the aspects. We know that a program must be correct and we can study it from that viewpoint only; we also know that it should be efficient and we can study its efficiency on another day, so to speak. In another mood we may ask ourselves whether, and if so: why, the program is desirable. But nothing is gained --on the contrary!-- by tackling these various aspects simultaneously. It is what I sometimes have called "the separation of concerns", which, even if not perfectly possible, is yet the only available technique for effective ordering of one's thoughts, that I know of. This is what I mean by "focusing one's attention upon some aspect": it does not mean ignoring the other aspects, it is just doing justice to the fact that from this aspect's point of view, the other is irrelevant. It is being one- and multiple-track minded simultaneously.
Příklady
Jelikož vede oddělení odpovědností k lepšímu přehledu nad systémy a k jednodušší správě vytvářených systémů, pak velké množství známých a používaných systémů je založeno na tomto principu. Abychom zůstali s příklady u programování, pak samotné technologie, které jsou používány na internetu jsou založeny na tomto principu.
Sada internetových protokolů
Můžeme jmenovat například sadu protokolů, které se využívají na internetu ke komunikaci. Tyto sady jsou rozděleny do několika vrstev, kdy každá vrstva má jednoznačně definované své úkoly a odpovědnosti. Jmenujme například sadu TCP/IP, která vychází z modelu RM-OSI.
Technologie používané na webu
Dalším příkladem je World Wide Web. Technologie pro vytváření obsahu na webu jsou po delším vývoji nakonec také rozdělené podle funkcionality, a tak aby se daly jednodušeji spravovat. K definování sémantiky na webu slouží jazyk HTML. Definice vzhledu webové stránky jsou odděleny do technologie CSS a mohou být odděleny do samostatného souboru. Stejně tak jednoduché interaktivní chování na straně klienta je odděleno dnes nejčastěji do jazyka Javascript a taktéž může být v samostatném souboru.
Programovací paradigmata
Veškerá známá paradigmata programování mají nástroje, které mohou vést vývojáře programů ke zvyšování oddělení zodpovědností. Objektově orientovaný přístup (Object Oriented Programing - OOP) pomáhá oddělit zodpovědnosti na základě implementace jednotlivých tříd. Servisně orientovaný přístup odděluje stejně jako objektový do tříd zodpovědnosti do jednotlivých služeb. Procedurální programování nabízí pro oddělení zodpovědností systém funkcí. Přístup, který je jednoznačně založen na oddělení zodpovědností je Aspektově orientované programování (Aspect-oriented programming - AOP). Aspektově orientované programování jde ještě dál než ostatní přístupy a snaží se řešit problematiku tzv. průřezových zodpovědností. Průřezové zodpovědnosti jsou takové zodpovědnosti, které se nedají jednoduše zapouzdřit a vyskytují se na více místech programu. Jedná se například o prověření autority nebo o logování průběhu programu. AOP se snaží řešit zapouzdření těchto průřezových zodpovědností a zároveň rozdělit program na jednotlivé moduly. Snaží se tedy princip oddělení odpovědností zabudovat přímo do sebe.
Návrhové vzory
V objektově orientovaném programování stojí za zmínku návrhové vzory Observer a MVC, které zvyšují oddělení odpovědností v programu.
Návrhový vzor MVC, kde se odděluje zobrazení (view) od aplikační logiky (model) a požadavky od uživatele jsou zpracovány přes řídící controller, je dnes velmi využívám jako základ pro implementaci veškerých frameworků, které se požívají pro vývoj webových aplikací (Zend, Symfony, Nette), právě pro to, že aplikace na něm založené jsou jednoduše upravovatelné a udržovatelné díky tomu, že odděluje jednotlivé odpovědnosti aplikace.
Návrhový vzor Observer řeší problém závislosti jednotlivých objektů na sobě. Pakliže potřebuje několik objektů znát stav jiného objektu a na základě tohoto stavu dále pracovat, pak je vhodné použít návrhový vzor Observer. Objekty by měli být tzv. volně vázané, kdy změna stavu jednoho objektu by neměla být závislá na implementaci jiného objektu. Navíc objekty, které budou závislé na změně jiného objektu, nemusí být známy dopředu. Toto oddělení závislostí řeší Observer tak, že každý, kdo chce změnu pozorovat, se musí u daného subjektu zaregistrovat a musí mít implementovanou metodu pro update daného pozorovatele, která je volána v metodě upozornění daného subjektu a kde je implementováno, co se má stát po změně subjektu s daným pozorovatelem.
Reference
V tomto článku byl použit překlad textu z článku Separation of concerns na anglické Wikipedii.
- DIJKSTRA, Edsger W. Selected writings on Computing: A Personal Perspective. Redakce Dijkstra Edsger W.. New York, NY, USA: Springer-Verlag New York, Inc., 1982. Dostupné online. ISBN 0-387-90652-5. Kapitola On the role of scientific thought, s. 60–66. (anglicky)