Ця стаття потребує додаткових для поліпшення її . (червень 2015) |
Command-query separation (CQS) або англ. command-query responsibility segregation (CQRS) — це принцип імперативного програмування, винайдений під час роботи над мовою програмування Eiffel.
Принцип вказує, що метод повинен бути або командою, яка виконує якусь дію, або запитом, що повертає дані, але не одночасно і тим, і іншим. Інакше кажучи, задавання питання не повинно змінювати відповідь. Більш формально, повертати значення можна тільки чистими методами, тобто такими, які не мають побічних ефектів. Слід зазначити, що неухильне дотримання цього принципу унеможливлює відстеження кількості викликів запитів.
Застосування у контрактному програмуванні
CQRS особливо добре вписується в методологію контрактного програмування, в якій використовуються твердження, що описують стан програми в певні важливі моменти. У контрактному програмуванні твердження відносяться до проєктування, а не до логіки виконання, тому їх виконання не повинно впливати на стан програми. CQRS вигідний для контрактного програмування через те, що будь-який метод, який повертає значення можна викликати з тверджень, не турбуючись про можливу зміну стану програми.
Теоретично, це дає можливість дізнаватися стан програми не змінюючи його. На практиці, CQRS дає можливість пропустити всі перевірки тверджень в діючій системі, щоб підвищити її продуктивність, не боячись того, що це змінить її поведінку. CQRS також запобігає виникненню деяких гейзенбаґів.
Інші застосування
Навіть за межами контрактного програмування, застосування CQRS розглядається його прихильниками як спосіб спрощення програми, роблячи доступ до її стану (через запити) і зміну її стану (через команди) більш зрозумілими, аналогічно тому як уникнення використання команди goto спрощує розуміння того, як програма виконується.
CQRS добре підходить для методології об'єктно-орієнтованого програмування, але може бути застосований і поза ООП, адже поділ всіх операцій на команди і запити не вимагає ООП. CQRS може бути застосований в будь-якій парадигмі програмування, де потрібно турбуватись про побічні ефекти.
Недоліки
CQRS може ускладнити створення багатопотокового ПЗ. Ця проблема зазвичай виникає при використанні потокобезпечного шаблону для реалізації CQRS.
Простий приклад шаблону, який порушує CQRS, але, тим не менше корисний в багатопотоковому ПЗ:
private int x; public int increment_and_return_x() { lock x; // який-небудь механізм блокування x = x + 1; int x_copy = x; unlock x; // який-небудь механізм блокування return x_copy; }
Поширений CQRS шаблон, який можна застосовувати тільки в однопотокових програмах:
private int x; public int value() { return x; } void increment_x() { x = x + 1; }
Навіть у випадку однопотокових програм іноді зручніше мати метод, який об'єднує запит і команду. Мартін Фаулер наводить як приклад метод стека pop()
.
Див. також
Примітки
- . Архів оригіналу за 28 червня 2015. Процитовано 28 червня 2015.
Література
- (1988). Object-oriented Software Construction. Prentice Hall. ISBN .(англ.)
Посилання
- Explanation on Martin Fowler's Bliki [ 28 червня 2015 у Wayback Machine.](англ.)
- Command Query Responsibility Segregation [ 29 червня 2015 у Wayback Machine.](англ.)
- Why Command Query Separation is needed for SOA [ 16 травня 2015 у Wayback Machine.](англ.)
- The CQRS Frequently Asked Questions [ 23 січня 2022 у Wayback Machine.](англ.)
- Command and Query Responsibility Segregation (CQRS) на практике [ 30 червня 2015 у Wayback Machine.](рос.)
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno cherven 2015 Command query separation CQS abo angl command query responsibility segregation CQRS ce princip imperativnogo programuvannya vinajdenij pid chas roboti nad movoyu programuvannya Eiffel Princip vkazuye sho metod povinen buti abo komandoyu yaka vikonuye yakus diyu abo zapitom sho povertaye dani ale ne odnochasno i tim i inshim Inakshe kazhuchi zadavannya pitannya ne povinno zminyuvati vidpovid Bilsh formalno povertati znachennya mozhna tilki chistimi metodami tobto takimi yaki ne mayut pobichnih efektiv Slid zaznachiti sho neuhilne dotrimannya cogo principu unemozhlivlyuye vidstezhennya kilkosti viklikiv zapitiv Zastosuvannya u kontraktnomu programuvanniCQRS osoblivo dobre vpisuyetsya v metodologiyu kontraktnogo programuvannya v yakij vikoristovuyutsya tverdzhennya sho opisuyut stan programi v pevni vazhlivi momenti U kontraktnomu programuvanni tverdzhennya vidnosyatsya do proyektuvannya a ne do logiki vikonannya tomu yih vikonannya ne povinno vplivati na stan programi CQRS vigidnij dlya kontraktnogo programuvannya cherez te sho bud yakij metod yakij povertaye znachennya mozhna viklikati z tverdzhen ne turbuyuchis pro mozhlivu zminu stanu programi Teoretichno ce daye mozhlivist diznavatisya stan programi ne zminyuyuchi jogo Na praktici CQRS daye mozhlivist propustiti vsi perevirki tverdzhen v diyuchij sistemi shob pidvishiti yiyi produktivnist ne boyachis togo sho ce zminit yiyi povedinku CQRS takozh zapobigaye viniknennyu deyakih gejzenbagiv Inshi zastosuvannyaNavit za mezhami kontraktnogo programuvannya zastosuvannya CQRS rozglyadayetsya jogo prihilnikami yak sposib sproshennya programi roblyachi dostup do yiyi stanu cherez zapiti i zminu yiyi stanu cherez komandi bilsh zrozumilimi analogichno tomu yak uniknennya vikoristannya komandi goto sproshuye rozuminnya togo yak programa vikonuyetsya CQRS dobre pidhodit dlya metodologiyi ob yektno oriyentovanogo programuvannya ale mozhe buti zastosovanij i poza OOP adzhe podil vsih operacij na komandi i zapiti ne vimagaye OOP CQRS mozhe buti zastosovanij v bud yakij paradigmi programuvannya de potribno turbuvatis pro pobichni efekti NedolikiCQRS mozhe uskladniti stvorennya bagatopotokovogo PZ Cya problema zazvichaj vinikaye pri vikoristanni potokobezpechnogo shablonu dlya realizaciyi CQRS Prostij priklad shablonu yakij porushuye CQRS ale tim ne menshe korisnij v bagatopotokovomu PZ private int x public int increment and return x lock x yakij nebud mehanizm blokuvannya x x 1 int x copy x unlock x yakij nebud mehanizm blokuvannya return x copy Poshirenij CQRS shablon yakij mozhna zastosovuvati tilki v odnopotokovih programah private int x public int value return x void increment x x x 1 Navit u vipadku odnopotokovih program inodi zruchnishe mati metod yakij ob yednuye zapit i komandu Martin Fauler navodit yak priklad metod steka pop Div takozhFluent interface Command and Query ObjectsPrimitki Arhiv originalu za 28 chervnya 2015 Procitovano 28 chervnya 2015 Literatura 1988 Object oriented Software Construction Prentice Hall ISBN 0 13 629049 3 angl PosilannyaExplanation on Martin Fowler s Bliki 28 chervnya 2015 u Wayback Machine angl Command Query Responsibility Segregation 29 chervnya 2015 u Wayback Machine angl Why Command Query Separation is needed for SOA 16 travnya 2015 u Wayback Machine angl The CQRS Frequently Asked Questions 23 sichnya 2022 u Wayback Machine angl Command and Query Responsibility Segregation CQRS na praktike 30 chervnya 2015 u Wayback Machine ros Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi