2015-02-07 11 views
5

Nếu CQS ngăn các lệnh trả về các biến trạng thái, làm thế nào để mã cho các lệnh có thể không thành công? Giả sử bạn không thể dựa vào ngoại lệ.Tách Truy vấn Lệnh: các lệnh phải trả về void?

Dường như bất kỳ điều gì là yêu cầu/phản hồi là vi phạm CQS.

Vì vậy, có vẻ như bạn sẽ có một tập hợp các phương pháp "mẹ có thể tôi" cho các trạng thái được trả lại bởi lệnh. Điều gì sẽ xảy ra trong một ứng dụng đa luồng/đa máy tính?

Nếu tôi có ba khách hàng muốn yêu cầu đối tượng của máy chủ tăng lên một (và đối tượng có giới hạn 0-100). Tất cả các kiểm tra để xem họ có thể nhưng một được nó - và hai người kia không thể vì nó chỉ đạt một giới hạn. Nó có vẻ như một trạng thái trả lại sẽ giải quyết vấn đề ở đây.

Trả lời

4

Dường như bất kỳ điều gì là yêu cầu/phản hồi là vi phạm CQS.

Khá nhiều có, do đó Command-Query- Tách. Như Martin Fowler nicely puts it:

Ý tưởng cơ bản là chúng ta nên chia các phương pháp của một đối tượng thành hai loại tách ra mạnh:

Queries: Return kết quả và không thay đổi trạng thái quan sát được của hệ thống (không có tác dụng phụ).

Lệnh: Thay đổi trạng thái của hệ thống nhưng không trả lại giá trị [nhấn mạnh].

Yêu cầu đó của một máy chủ tăng đối tượng bằng một là một lệnh, vì vậy không nên trả về một giá trị - xử lý một đáp ứng với yêu cầu đó có nghĩa là bạn đang làm một hành động chỉ huy và truy vấn cùng lúc đó phá vỡ nguyên lý cơ bản của CQS.

Vì vậy, nếu bạn muốn biết giá trị của máy chủ là gì, bạn phát hành Truy vấn riêng biệt.

Nếu bạn thực sự cần mẫu phản hồi yêu cầu, bạn cần phải có thứ gì đó như quy trình sự kiện gọi lại phức tạp để phát hành truy vấn trạng thái của yêu cầu cụ thể hoặc tinh khiết CQS không phù hợp với phần này hệ thống của bạn - lưu ý từ thuần túy.


Đa luồng là một nhược điểm chính của CQS và có thể khiến khó thực hiện. Wikipedia có một ví dụ cơ bản và thảo luận điều này và cũng liên kết với cùng một bài viết Martin Fowler nơi ông thấy đó là OK để phá vỡ các mô hình để có được một cái gì đó thực hiện mà không lái xe cho mình điên:

[Bertrand] Meyer [các nhà phát minh của CQS] thích sử dụng tách truy vấn lệnh hoàn toàn, nhưng có ngoại lệ. Popping ngăn xếp là một ví dụ tốt về truy vấn sửa đổi trạng thái .Meyer nói chính xác rằng bạn có thể tránh phương pháp này, nhưng nó là một thành ngữ hữu ích. Vì vậy, tôi thích làm theo nguyên tắc này khi tôi có thể, nhưng tôi đã sẵn sàng để phá vỡ nó để có được pop của tôi.


TL; DR - Tôi có lẽ chỉ cần nhìn vào việc trả lại một phản ứng, thậm chí tho nó không phải là chính xác CQS.

1

Điều "Race Conditions Don’t Exist" có thể giúp bạn xem xét vấn đề với tư duy CQS/CQRS.

Bạn có thể muốn quay lại và hỏi lý do tại sao giá trị bộ đếm hoàn toàn cần thiết để biết trước khi gửi lệnh? Rõ ràng, bạn muốn đưa ra quyết định về phía khách hàng cho dù bạn có thể tăng truy cập nhiều hơn hay không.

Cách tiếp cận là để cho máy chủ đưa ra quyết định như vậy. Hãy để tất cả các khách hàng gửi lệnh (một số sẽ thành công và một số sẽ thất bại). Cuối cùng, khách hàng sẽ nhận được chế độ xem nhất quán về trạng thái đối tượng máy chủ (nơi đã đạt đến giới hạn) và cuối cùng có thể ngừng gửi các lệnh đó.

Cửa sổ thời gian không nhất quán này dẫn đến quyết định sai của khách hàng, nhưng không bao giờ phá vỡ tính nhất quán của đối tượng (hoặc mô hình miền) ở phía máy chủ miễn là lệnh được xử lý đầy đủ.

Các vấn đề liên quan