A Command and Query Responsibility Segregation (CQRS) – a CQRS elve vagy paradigmája elválasztja a lekérdezések célját (pl. adatok olvasásakor) és az adatfeldolgozási parancsokat. A CQRS megvalósítása egy alkalmazásban maximalizálhatja annak teljesítményét, méretezhetőségét és biztonságát. A CQRS-re való átállás által teremtett rugalmasság lehetővé teszi a rendszer jobb fejlődését az idő múlásával, és megakadályozza, hogy a frissítési parancsok összevonási ütközéseket okozzanak a tartomány szintjén. [egy]
A CQRS minta parancs -lekérdezés szétválasztás ( CQS ) kötelező programozást alkalmaz, külön lekérdezési és parancsobjektumokat használva az adatok lekérésére és módosítására [2] [3] . A CQRS-t Bertrand Meyer vezette be, miközben az Eiffel programozási nyelven dolgozott . Az elv szerint a metódusnak vagy parancsnak kell lennie, amely valamilyen műveletet hajt végre, vagy olyan lekérdezésnek , amely adatokat ad vissza, de nem mindkettőt. Más szóval, egy kérdés feltevés nem változtathatja meg a választ . Formálisabban csak egy tiszta (azaz determinisztikus és mellékhatásoktól mentes ) módszer adhat vissza értéket . Ennek az elvnek a szigorú betartása lehetetlenné teszi a lekérdező hívások számának nyomon követését.
A CQRS különösen jól illeszkedik a szerződés-programozási módszertanhoz, amely forráskódba ágyazott állításokat használ a program állapotának leírására bizonyos fontos pontokon. A szerződéses programozásban az állítások a tervezésre vonatkoznak, nem a végrehajtási logikára, így végrehajtásuk nem befolyásolhatja a program állapotát. A CQRS előnyös a szerződésprogramozáshoz, mert bármely értékvisszaadó metódus (bármilyen lekérdezés) meghívható utasításokban anélkül, hogy aggódnánk a program állapotának esetleges változásai miatt.
Elméletileg ez lehetővé teszi a program állapotának megismerését anélkül, hogy megváltoztatná azt. A gyakorlatban a CQRS lehetővé teszi az összes érvényesítési ellenőrzés kihagyását egy élő rendszerben, hogy javítsa a teljesítményét anélkül, hogy attól félne, hogy ez megváltoztatja a viselkedését. A CQRS bizonyos Heisenbugok előfordulását is megakadályozza .
A CQRS használatát a szerzõdéses programozáson kívül is úgy látják hívei, hogy leegyszerûsítõ hatást fejt ki a programra, érthetõbbé teszi állapotának elérését (lekérdezéseken keresztül) és állapotának megváltoztatását (parancsokkal), éppúgy, mint a goto használatának elkerülését. megkönnyíti a programvégrehajtás folyamatának megértését.
A CQRS jól illeszkedik az objektum-orientált programozási módszertanhoz, de OOP-on kívül is alkalmazható, mivel a mellékhatások és a visszatérési értékek szétválasztása nem igényel OOP-t, így a CQRS bármely programozási paradigmában hasznosan alkalmazható . a mellékhatások miatti aggódást igényel.
A CQRS megnehezítheti az újra belépő és többszálú szoftverek létrehozását. Ez a probléma általában akkor fordul elő, ha nem szálbiztos mintát használ a CQRS megvalósításához.
Egy egyszerű példa egy mintára, amely sérti a CQRS-t, de hasznos a többszálú szoftverekben:
privát int x ; nyilvános increment_and_return_x ( ) { zár x ; // valamiféle zárszerkezet x = x + 1 ; int x_másolat = x ; x feloldása ; // valamiféle zárszerkezet return x_copy ; }Általános CQRS-minta, amely csak egyszálas alkalmazásokban alkalmazható:
privát int x ; nyilvános int érték () { visszatér x ; } void increment_x () { x = x + 1_ _ }Még az egyszálú programok esetében is lehet néha érvelni, hogy sokkal kényelmesebb egy kérést és parancsot kombináló metódus. Martin Fowler a veremmódszert pop() hozza fel példaként. [négy]