Có lẽ điều này là do nguyên tắc tách lệnh-truy vấn ?
CQS có xu hướng phổ biến ở giao điểm của kiểu lập trình OO và chức năng, vì nó tạo ra sự khác biệt rõ ràng giữa các phương thức đối tượng có hoặc không có tác dụng phụ (tức là làm thay đổi đối tượng). Việc áp dụng CQS cho các nhiệm vụ thay đổi đang đưa nó đi xa hơn bình thường, nhưng ý tưởng tương tự cũng được áp dụng.
Một minh họa ngắn về việc tại sao CQS rất hữu ích: Xem xét một giả thuyết lai ngôn ngữ F / OO với một List
lớp mà có phương pháp Sort
, Append
, First
, và Length
. Trong kiểu OO bắt buộc, người ta có thể muốn viết một hàm như sau:
func foo(x):
var list = new List(4, -2, 3, 1)
list.Append(x)
list.Sort()
# list now holds a sorted, five-element list
var smallest = list.First()
return smallest + list.Length()
Trong khi theo phong cách chức năng hơn, nhiều khả năng người ta sẽ viết một cái gì đó như thế này:
func bar(x):
var list = new List(4, -2, 3, 1)
var smallest = list.Append(x).Sort().First()
# list still holds an unsorted, four-element list
return smallest + list.Length()
Những điều này dường như đang cố gắng làm điều tương tự, nhưng rõ ràng một trong hai phương thức là không chính xác, và nếu không biết thêm về hoạt động của các phương thức, chúng ta không thể biết phương thức nào.
Tuy nhiên, sử dụng CQS, chúng tôi sẽ nhấn mạnh rằng nếu Append
và Sort
thay đổi danh sách, chúng phải trả về loại đơn vị, do đó ngăn chúng tôi tạo lỗi bằng cách sử dụng biểu mẫu thứ hai khi chúng tôi không nên. Do đó, sự hiện diện của các tác dụng phụ cũng trở nên tiềm ẩn trong chữ ký của phương pháp.