Tôi nghĩ rằng tôi thực sự có vấn đề với cách mà bạn đang đóng khung này:
Thật vậy, tôi không có ý tưởng về cách dung hòa những ảnh hưởng quy tắc không-side ngụ ý bởi loại không thay đổi và chức năng tinh khiết và tiền đề của OO, nơi mà các phương pháp sửa đổi trạng thái thể hiện tại chỗ, mà rõ ràng là tác dụng phụ.
Tôi sẽ không nói rằng các hoạt động đột biến trên các trường đối tượng là tiền đề cốt lõi của OO. Không hề (mặc dù ngược lại tôi làm nghĩ rằng sự bất biến là tiền đề cốt lõi của FP). Đối với tôi, OO là một cách suy nghĩ về mô hình mô đun nhiều hơn bất kỳ thứ gì khác.
Suy nghĩ của tôi, thậm chí Haskell - một ngôn ngữ mà người ủng hộ thường xoay quanh suy nghĩ theo phong cách OO - vẫn thể hiện một số khái niệm OO, theo nghĩa là nó có hệ thống mô-đun, nhiều cách đóng gói thực hiện chi tiết về các kiểu dữ liệu, v.v .. Và mặt khác, mặc dù nó đặc biệt vụng về và trầm trọng hơn, mã Java của tôi có xu hướng sử dụng nhiều khái niệm chức năng cơ bản như currying.
Nói cách khác, tôi nghĩ rằng hai phương pháp tiếp cận là bổ sung theo nghĩa nào đó.
Bây giờ, ở một mức độ ít lý thuyết và nhiều hơn nữa hạt-and-bu lông ... Hãy nói rằng bạn có một cái gì đó như:
class Foo(val a : A, val b : B, val c : C) {
def setB(newb : B) : Foo = new Foo(a, newb, c)
}
... vì vậy bạn có thể nói newFoo = foo.setB(b)
như bạn đề nghị trong bài gốc . Tôi muốn nói rằng đây là phong cách hoàn toàn tốt, và không gây ra mối quan tâm (về hiệu suất hoặc khả năng đọc hoặc bất cứ điều gì). Bạn sẽ thấy rất nhiều điều này với các lớp sưu tập bất biến trong thư viện Scala.
Đọc thú vị và có liên quan cao: [Có phải FP và OO trực giao?] (Http://stackoverflow.com/q/3949618/395760) – delnan
Đó có phải là tiền đề của OO không? Tại sao, khi đó, Java có hiệu quả đề xuất các đối tượng bất biến? Tôi nghĩ bạn nên bắt đầu điều chỉnh quan điểm của bạn về OO với những gì các chuyên gia đã thực sự nói ... –