2011-10-27 16 views
7

Đọc lại một số mã Scala của tôi, tôi nhận thấy rằng đó là chức năng hoặc hướng đối tượng. Thật vậy, tôi không có ý tưởng làm thế nào để hòa giải quy tắc tác dụng không có ngụ ý bởi các loại bất biến và chức năng thuần túy và tiền đề của OO, nơi 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ụ.Làm thế nào để kết hợp các mô hình dường như không tương thích: OOP và FP?

Một giải pháp mà tôi đang điều tra là làm cho tất cả các phương thức trả về bản sao của cá thể hiện tại với các sửa đổi trạng thái thích hợp. Có vẻ háo hức, nhưng có thể giúp đỡ khi tôi quyết định để paralelize mã, phải không?

Các phương pháp hay nhất về việc trộn lẫn 2 mô hình đó là gì? Số dư là gì?

Cảm ơn.

+2

Đọ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

+4

Đó 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 ... –

Trả lời

2

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.

+0

Nếu yu nói OO được kết nối với Modularity cho bạn, bạn có thể mô tả cách thức đó được hoàn thành? OO sử dụng các tính năng nào để mô đun hóa mô-đun? Tôi yêu cầu vì tôi là curios và tôi nghĩ đơn giản và đạt được tính mô đun, tôi không thể nghĩ ra các tính năng OO hữu ích (độc quyền) nào đạt được điều đó. Có lẽ đa hình 'a la carte' thấy ở đây: http://www.infoq.com/presentations/Simple-Made-Easy? – AndreasScheinert

0

Bạn có thể muốn kiểm tra số Functional Programming chapter của Lập trình Scala (đó là available free online) để nhận một số gợi ý.

FP không chỉ là về luồng. Các chức năng đặt hàng cao có thể giúp bạn dọn dẹp và làm khô mã của bạn, làm cho nó trông thanh lịch hơn.

+0

Cảm ơn câu trả lời của bạn. Tôi hoàn toàn bị thuyết phục về những lợi ích của FP, và áp dụng chúng đã có, nhưng tôi tự hỏi về biên giới của tính hai mặt thể hiện trong bài viết hàng đầu. –

+0

FP KHÔNG phải là về 'làm cho mã của bạn trông thanh lịch', nó là về tính composability và mô đun thông qua reusability. – AndreasScheinert

+0

bất cứ điều gì bạn nói –

7

Các lớp không thể thay đổi là một cách rất tốt để kết nối OO và FP. Scala's Collection Library là một ví dụ tuyệt vời về pha trộn OO, các đối tượng bất biến và lập trình hàm.

Trong mã của riêng bạn, số case classes của Scala thực sự giúp thực hiện đối tượng không thay đổi, vì chúng có phương thức copy có thể được sử dụng để thay thế cho mẫu trình tạo.

// begin cheesy example 
case class Circle(center: (Double, Double), radius: Double) { 
    def move(c: (Double, Double)) = copy(center = c) 
    def resize(r: Double) = copy(radius = r) 
    def area = math.Pi * radius * radius 
} 

Bạn cũng có thể được hưởng lợi theo dõi cuộc đàm phán Giàu Hickey của Persistent Data Structures and Managed References, và Are We There Yet? Cả hai làm một công việc tuyệt vời giải thích sự cần thiết cho bất biến, và làm thế nào nó giúp chúng ta lý do về nhà nước. Anh ta nói về mọi thứ liên quan đến Clojure, nhưng điểm của anh ta cũng tương đương với Scala.

0

làm tất cả các phương pháp trả về một bản sao của instance hiện

nếu bạn kiểm tra như thế nào jQuery hiện nó, nó sử dụng một kỹ thuật gọi là Phương pháp Chaining mọi phương pháp mà nếu không sẽ trả về void lợi nhuận $ này, vì vậy bạn có thể tiếp tục gọi các phương thức khác nhau. Đó là lý do tại sao jQuery đối tượng không phá vỡ mã người dùng thủ tục truyền thống trong javascript.

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