Chuyển đến nội dung chính

CQRS là gì?

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

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.