Có lẽ điều này là do nguyên tắc command-query separation?
CQS có xu hướng phổ biến tại giao điểm của OO và các kiểu lập trình hàm, vì nó tạo sự khác biệt rõ ràng giữa các phương pháp đối tượng hoặc không có tác dụng phụ (tức là thay đổi đối tượng). Áp dụng CQS cho các bài tập thay đổi đang thực hiện nó nhiều 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 ngôn ngữ giả lai F/OO với một lớp List
có phương pháp Sort
, Append
, First
, và Length
. Trong phong cách OO bắt buộc, người ta có thể muốn viết một hàm như thế này:
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 đó trong phong cách thêm chức năng, người ta sẽ nhiều khả năng ghi 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 dường như cố gắng để làm điều tương tự, nhưng rõ ràng một trong hai là không chính xác, và không biết nhiều hơn về hành vi của các phương pháp, chúng ta không thể biết cái nào.
Sử dụng CQS, tuy nhiên, 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. Sự hiện diện của các tác dụng phụ do đó cũng trở nên ngầm định trong chữ ký phương thức.
David Pollack đã đăng một số thông tin đầu tay, được xác nhận rất nhiều bởi lời nhận xét của Martin Odersky về câu trả lời của mình. Tôi nghĩ rằng người ta có thể an toàn acceppt câu trả lời của Pollack. –