Oddělení příkazů a dotazů - Command–query separation
![]() | tento článek potřebuje další citace pro ověření.Února 2008) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
Oddělení příkazů a dotazů (CQS) je princip rozkazovací způsob programování. Byl navržen Bertrand Meyer v rámci jeho průkopnické práce na Eiffelovský programovací jazyk.
Uvádí se v něm, že každý metoda by měl být buď příkaz který provádí akci, nebo a dotaz který vrátí data volajícímu, ale ne obojí. Jinými slovy, Položení otázky by nemělo změnit odpověď.[1] Formálně by metody měly vrátit hodnotu, pouze pokud jsou referenční transparentní a proto mají ne vedlejší efekty.
Souvislost s designem na základě smlouvy
Oddělení příkazů a dotazů je zvláště vhodné pro a design podle smlouvy (DbC) metodologie, ve které návrh a program je vyjádřena jako tvrzení vložený do zdrojový kód, popisující Stát programu v určitých kritických dobách. V DbC jsou tvrzení považována za anotace návrhu - nikoli za logiku programu - a jako taková by jejich provedení nemělo ovlivnit stav programu. CQS je pro DbC přínosné, protože jakoukoli metodu vracející hodnotu (jakýkoli dotaz) lze volat libovolným tvrzením bez obav z úpravy stavu programu.
Teoreticky to stanoví míru rozumu, pomocí níž lze uvažovat o stavu programu, aniž byste tento stav současně upravovali. Z praktického hlediska umožňuje CQS obejít všechny kontroly tvrzení v pracovním systému, aby se zlepšil jeho výkon bez neúmyslné úpravy jeho chování. CQS může také zabránit výskytu určitých druhů heisenbugs.
Širší dopad na softwarové inženýrství
I přes spojení s designem na základě smlouvy je CQS považována svými přívrženci za zjednodušující účinek na program, díky kterému jsou jeho stavy (prostřednictvím dotazů) a změny stavu (pomocí příkazů) srozumitelnější.[Citace je zapotřebí ]
CQS je vhodný pro objektově orientovaný metodologie, ale lze jej použít i mimo objektově orientované programování. Vzhledem k tomu, že oddělení vedlejších účinků a návratových hodnot není ve své podstatě objektově orientované, lze CQS výhodně použít na jakékoli paradigma programování, které vyžaduje uvažování o vedlejších účincích.[Citace je zapotřebí ]
Oddělení odpovědnosti za příkazové dotazy
Oddělení odpovědnosti za příkazové dotazy (CQRS) aplikuje princip CQS pomocí samostatného Dotaz a Příkaz předměty načíst a upravit data, resp.[2][3]
Jiné architektonické vzory
- Když se vzdalujeme od jediné reprezentace, se kterou komunikujeme prostřednictvím CRUD, můžeme se snadno přesunout do uživatelského rozhraní založeného na úkolech.
- CQRS dobře zapadá do programovacích modelů založených na událostech. Je běžné vidět systém CQRS rozdělený na samostatné služby komunikující s Event Collaboration. To umožňuje těmto službám snadno využívat výhody Architektura řízená událostmi.
- Mít samostatné modely vyvolává otázky o tom, jak těžké je udržovat tyto modely konzistentní, což zvyšuje pravděpodobnost použití případné konzistence.
- U mnoha domén je při aktualizaci nutná velká část logiky, takže může mít smysl použít Eager Read Derivation ke zjednodušení vašich modelů na straně dotazu.
- Pokud model zápisu generuje události pro všechny aktualizace, můžete číst modely strukturovat jako plakáty událostí, což jim umožňuje být paměťovými obrázky a vyhnout se tak mnoha interakcím s databázemi.
- CQRS je vhodný pro složité domény, z nichž také těží Design založený na doméně. [4]
Omezení
CQS může zavést složitost implementace reentrant a vícevláknové software správně. K tomu obvykle dochází, když se k implementaci oddělení příkaz-dotaz použije vzor, který není bezpečný pro vlákna.
Zde je jednoduchý příklad, který nenasleduje CQS, ale je užitečný pro vícevláknový software, protože řeší složitost zamykání pro všechny ostatní části programu, ale tím nesleduje CQS, protože funkce oba mutuje stav a vrátí jej:
soukromé int X;veřejnost int incrementAndReturnX() { zámek X; // nějakým mechanismem X = X + 1; int x_copy = X; odemknout X; // nějakým mechanismem vrátit se x_copy;}
Zde je verze kompatibilní s CQS. Všimněte si, že je bezpečně použitelný pouze v aplikacích s jedním vláknem. Ve vícevláknovém programu je ve volajícím podmínka závodu, mezi kde přírůstek()
a hodnota()
bude nazýván:
soukromé int X;veřejnost int hodnota() { vrátit se X;}prázdnota přírůstek() { X = X + 1;}
Dokonce i v programech s jedním vláknem je někdy pravděpodobně mnohem pohodlnější mít metodu, která je kombinovaným dotazem a příkazem. Martin Fowler cituje pop ()
metoda a zásobník jako příklad.[5]
Viz také
Reference
- ^ Meyer, Bertrand. „Eiffel: jazyk pro softwarové inženýrství“ (PDF). str. 22. Citováno 16. prosince 2014.
- ^ Mladý, Gregu. "Dokumenty CQRS" (PDF). Citováno 2012-12-28.
- ^ Fowler, Martin. „CQRS“. Citováno 2011-07-14.
- ^ „Co je CQRS“. Co je CQRS. Citováno 2019-06-27.
- ^ Fowler, Martin. „CommandQuerySeparation“. Citováno 5. prosince 2005.
Další čtení
- Meyer, Bertrand (Září 1994) [1988]. Objektově orientovaná konstrukce softwaru. Prentice Hall. ISBN 0-13-629049-3.