Giới thiệu
Trong thiết kế phần mềm, CQRS (Command Query Responsibility Segregation) và CQS (Command Query Separation) là hai mẫu thiết kế quan trọng, giúp tách biệt việc xử lý lệnh (command) và truy vấn (query). Tuy có tên gần nhau và có mục tiêu chung là tạo sự tách biệt giữa lệnh và truy vấn, nhưng chúng có những điểm khác biệt quan trọng.
Trong bài viết này, chúng ta sẽ tìm hiểu về sự khác biệt giữa CQRS và CQS.
Command Query Separation (CQS)
Command-query separation (CQS) is a principle of imperative computer programming. It was devised by Bertrand Meyer as part of his pioneering work on the Eiffel programming language. It states that every method should either be a command that performs an action, or a query that returns data to the caller, but not both.
CQS là một nguyên tắc thiết kế mẫu nơi mà việc gửi lệnh (command) và truy vấn (query) phải được tách biệt hoàn toàn. Nguyên tắc này đề xuất rằng mỗi phương thức trong hệ thống phần mềm sẽ là hoặc một lệnh (command) hoặc một truy vấn (query), nhưng không bao giờ cả hai. Điều này giúp đảm bảo tính rõ ràng và dễ bảo trì của mã nguồn.
Để implement CQS cơ bản nhất, bạn tách Read và Write ra thành hàm riêng
interface IBookService
{
void Edit(string name);
Book GetById(long id);
IEnumerable<Book> GetAllBooks();
}
Hàm Get không làm thay đổi dữ liệu => query
Hàm Edit thay đổi giá trị name của Book, và không có trị trả về => command
Lợi ích
Separation of Concerns
Chia nhỏ thành các thành phần read và write, nên code có thể dễ đọc, dễ maintain hơn
Quá trình phát triển nhanh hơn, do các thành phần, tính năng có thể phát triển độc lập với nhau, bởi các team khác nhau
Các thành phần có thể được update, modify một cách độc với nhau
Các thành phần có thể sử dụng lại
Có thể sử dụng các thành phần do bên khác phát triển, mà không cần phải chỉnh sửa, cũng như không cần hiểu rõ chi tiết bên trong nó như thế nào
Unit Test
Dễ dàng viết các đoạn Unit Test do các thành phần đã được chia tách ra.
...
Nhược điểm
Tăng số lượng các class do việc chia tách quá nhiều
Nếu quá tuân thủ nguyên tắc, sẽ làm giảm performance do việc gọi lên server quá nhiều.
CQRS (Command Query Responsibility Segregation)
CQRS mở rộng nguyên tắc CQS bằng cách tách biệt hoàn toàn việc xử lý lệnh và truy vấn. Trong CQRS, lệnh và truy vấn được xử lý bởi các thành phần riêng biệt và sử dụng lưu trữ dữ liệu riêng biệt.
Điều này cho phép tối ưu hóa xử lý cho từng loại yêu cầu và cung cấp khả năng mở rộng dễ dàng.
VD:
public class ProductCommandService
{
private List<Product> products = new List<Product>();
public void AddProduct(Product product)
{
products.Add(product);
}
}
public class ProductQueryService
{
private List<Product> products = new List<Product>();
public List<Product> GetProducts()
{
return products;
}
}
Nhận xét
Đăng nhận xét