2010-08-25 53 views
11

Gần đây tôi đã xem một webcast trên Clojure. Trong đó, người trình bày đã đưa ra một bình luận trong bối cảnh thảo luận về bản chất FP của Clojure, một thứ giống như (Tôi hy vọng tôi không xuyên tạc anh ta) "Các đối tượng giả đang chế giễu bạn".Lập trình hàm và đối tượng giả

Tôi cũng đã nghe một nhận xét tương tự trong khi quay lại khi tôi xem một webcast khi Khung phản ứng của Microsoft bắt đầu xuất hiện. Nó giống như "Đối tượng giả là dành cho những người không biết toán")

Bây giờ tôi biết rằng cả hai chú thích đều là cười/lưỡi trong vv… (và có thể diễn giải sai) một cái gì đó mang tính khái niệm mà tôi không hiểu vì tôi đã không thực sự chuyển sang mô hình FP.

Vì vậy, tôi sẽ biết ơn nếu có ai đó có thể giải thích liệu FP có thực sự tạo ra sự nhô ra thừa và nếu có.

+5

Trong FP, đối tượng giả lập BẠN!/meme – delnan

Trả lời

8

Trong FP thuần túy, bạn có các hàm trong suốt tham chiếu tính toán cùng một đầu ra mỗi khi bạn gọi chúng với cùng một đầu vào. Do đó, tất cả các trạng thái bạn cần phải được thông qua một cách rõ ràng dưới dạng tham số và kết quả là hàm, không có đối tượng trạng thái nào bị ẩn đằng sau hàm mà bạn gọi. Điều này, tuy nhiên, là những gì các đối tượng giả của bạn thường làm: mô phỏng một số trạng thái bên ngoài, ẩn hoặc hành vi mà đối tượng của bạn được thử nghiệm dựa vào.

Nói cách khác: OO: Đối tượng của bạn kết hợp trạng thái và hành vi liên quan. FP thuần túy: Trạng thái là thứ bạn vượt qua giữa các hàm mà bản thân chúng là trạng thái không trạng thái và chỉ dựa vào các hàm không trạng thái khác.

+0

OK. Cám ơn. Nhưng có lẽ trạng thái được truyền giữa các hàm xung quanh có thể ở trong các đối tượng giả hoặc 'đối tượng thực' để các đối tượng giả sẽ vẫn thích hợp để thử nghiệm một giải pháp FP - không? –

+0

Trong FP thuần túy, không có đối tượng nào trong ý nghĩa OO. Có cấu trúc dữ liệu, có thể do người dùng xác định. Trong một số ngôn ngữ có những người thân ở xa của các giao diện: Haskell có các lớp kiểu, về cơ bản là một tập các hàm phải được định nghĩa cho mọi kiểu dữ liệu trong lớp kiểu đó. Vì vậy, có, bạn có thể viết chức năng của bạn để hoạt động trên các kiểu dữ liệu của một loại lớp nhất định và kiểm tra nó trên một kiểu dữ liệu khác với loại dữ liệu bạn sử dụng trong sản xuất. Trong F # hoặc Scala, nơi bạn có thể thực sự thao tác .NET hoặc Java-Objects theo kiểu chức năng, thậm chí có thể cần thiết để sử dụng các đối tượng mô phỏng thực tế. – Christoph

8

Tôi nghĩ điều quan trọng cần suy nghĩ là ý tưởng sử dụng các thử nghiệm giúp bạn cấu trúc mã của mình. Mocks thực sự là trì hoãn các quyết định mà bạn không muốn thực hiện ngay bây giờ (và một kỹ thuật bị hiểu lầm rộng rãi). Thay vì trạng thái đối tượng, hãy xem xét một phần chức năng. Bạn có thể viết một hàm có chức năng ngăn chặn một phần hành vi của nó thành một phần chức năng được truyền vào. Trong một bài kiểm tra đơn vị, đó có thể là một triển khai giả cho phép bạn chỉ tập trung vào mã trong tay. Sau đó, bạn soạn mã mới của mình bằng cách triển khai thực sự để xây dựng hệ thống.

Thực ra, khi chúng tôi phát triển ý tưởng về Mocks, tôi luôn nghĩ về Mocks theo cách này. Phần đối tượng là ngẫu nhiên.

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