Command and Query Responsibility Segregation (CQRS) - princip či paradigma CQRS odděluje účel dotazů (např. při čtení dat) a příkazy pro zpracování dat. Implementace CQRS v aplikaci může maximalizovat její výkon, škálovatelnost a zabezpečení. Flexibilita vytvořená přechodem na CQRS umožňuje systému, aby se v průběhu času lépe vyvíjel, a zabraňuje aktualizačním příkazům způsobovat konflikty při slučování na úrovni domény. [jeden]
Vzor CQRS používá imperativní programování separace příkazů a dotazů ( CQS ) , přičemž k získávání a úpravě dat používá samostatné objekty dotazu a příkazu [2] [3] . CQRS zavedl Bertrand Meyer při práci na programovacím jazyku Eiffel . Princip říká, že metoda musí být buď příkaz , který provede nějakou akci, nebo dotaz , který vrátí data, ale ne obojí. Jinými slovy, položení otázky by nemělo změnit odpověď . Formálněji může vrátit hodnotu pouze čistá (tj . deterministická a bez vedlejších efektů ) metoda . Přísné dodržování této zásady znemožňuje sledování počtu dotazů.
CQRS se obzvláště dobře hodí k metodice smluvního programování , která používá aserce , vložená do zdrojového kódu, k popisu stavu programu v určitých důležitých bodech. Ve smluvním programování jsou aserce o návrhu, nikoli o logice provádění, takže jejich provedení by nemělo ovlivnit stav programu. CQRS je přínosné pro smluvní programování, protože jakákoli metoda vracení hodnoty (jakýkoli dotaz) může být volána v příkazech bez obav z možných změn stavu programu.
Teoreticky to umožňuje znát stav programu bez jeho změny. V praxi CQRS umožňuje přeskočit všechny kontroly asercí v živém systému za účelem zlepšení jeho výkonu bez obav, že to změní jeho chování. CQRS také zabraňuje výskytu některých Heisenbugů .
Dokonce i mimo smluvní programování je používání CQRS jeho přívrženci vnímáno jako zjednodušující účinek na program, díky kterému je přístup k jeho stavu (prostřednictvím dotazů) a změna jeho stavu (prostřednictvím příkazů) srozumitelnější, stejně jako vyhýbání se použití goto . usnadňuje pochopení toku provádění programu.
CQRS se dobře hodí pro metodologii objektově orientovaného programování, ale lze jej použít i mimo OOP, protože oddělení vedlejších efektů a návratových hodnot nevyžaduje OOP, takže CQRS lze užitečně použít v jakémkoli programovacím paradigmatu , vyžaduje obavy z vedlejších účinků.
CQRS může ztížit vytváření reentrantního a vícevláknového softwaru. K tomuto problému obvykle dochází při použití vzoru, který není bezpečný pro vlákna pro implementaci CQRS.
Jednoduchý příklad vzoru, který porušuje CQRS, ale je užitečný ve vícevláknovém softwaru:
private int x ; public int increment_and_return_x () { zámek x ; // nějaký uzamykací mechanismus x = x + 1 ; int x_kopie = x ; odemknout x ; // nějaký druh zamykacího mechanismu return x_copy ; }Společný vzor CQRS použitelný pouze v jednovláknových aplikacích:
private int x ; veřejná hodnota ( ) { návrat x ; } void increment_x () { x = x + 1 _ }I v případě jednovláknových programů lze někdy namítnout, že je mnohem pohodlnější mít metodu, která kombinuje požadavek a příkaz. Martin Fowler uvádí jako příklad metodu zásobníku . [čtyři]pop()