FP và OO trực giao?


13

Tôi đã nghe hết lần này đến lần khác và tôi đang cố gắng hiểu và xác thực ý tưởng rằng FP và OO là trực giao.

Trước hết, ý nghĩa của 2 khái niệm là trực giao là gì?

FP khuyến khích sự bất biến và tinh khiết nhất có thể. và OO có vẻ như một cái gì đó được xây dựng cho trạng thái và đột biến (một phiên bản hơi có tổ chức của lập trình mệnh lệnh?). Và tôi nhận ra rằng các đối tượng có thể là bất biến. Nhưng OO dường như ngụ ý trạng thái / thay đổi đối với tôi.

Họ có vẻ như đối lập. Điều đó có nghĩa là chúng trực giao?

Một ngôn ngữ như Scala giúp dễ dàng thực hiện cả OO và FP, điều này có ảnh hưởng đến tính trực giao của 2 phương thức không?


5
Hướng đối tượng không yêu cầu các đối tượng thao tác trạng thái của nó. Các phương thức có thể trả về các đối tượng mới là kết quả. Việc người ta có thể, và thường làm, sửa đổi trạng thái của một đối tượng không có nghĩa là họ phải hoặc đó là một ý tưởng tốt. OO và FP không đối lập nhau.
Huperniketes

4
Sao y trên stackoverflow: FP và OO trực giao?
sepp2k

Câu trả lời:


22

Thuật ngữ "trực giao" xuất phát từ toán học, trong đó nó có một từ đồng nghĩa: "vuông góc". Trong bối cảnh này, bạn có thể hiểu nó là "hai điều không liên quan gì đến nhau".

Khi mọi người so sánh FP và OO, họ thường nhầm lẫn hai trục riêng biệt.

Một mặt bạn có lập trình chức năng so với lập trình bắt buộc. Jonas đưa ra một so sánh tốt của hai. Phiên bản một câu nói rằng "luồng dữ liệu so với luồng điều khiển".

Các trục khác là trừu tượng hóa dữ liệu. Các ngôn ngữ như Haskell sử dụng các loại dữ liệu trừu tượng, tốt, dữ liệu trừu tượng. Smalltalk sử dụng các đối tượng, hợp nhất dữ liệu và thao tác trên dữ liệu đó thành một đơn vị. William Cook giải thích tốt hơn những gì tôi có thể trong bài viết về Tìm hiểu trừu tượng dữ liệu, xem lại .

Điều hoàn toàn dễ hiểu là hầu hết mọi người đều nghĩ rằng FP và OO là đối lập nhau: hầu hết các ngôn ngữ OO là bắt buộc, vì vậy nếu bạn so sánh, giả sử, Haskell và Java, bạn có luồng dữ liệu + ADT so với luồng điều khiển + đối tượng. Nhưng có những khả năng khác! Matthias Felleisen giải thích làm thế nào để hạnh phúc kết hôn với FP và OO trong bài nói chuyện về các đối tượng chức năng .


+1, câu trả lời tuyệt vời. Câu trả lời của bạn bỏ lỡ trên typeclass Haskell mặc dù.
missingfaktor

Chắc chắn. Tôi chỉ mới bắt đầu thực sự học Haskell.
Frank Shearar

Tôi tự hỏi liệu có bất kỳ bản ghi nào về bản trình bày Đối tượng chức năng đó không ... Tôi thực sự quan tâm, nhưng một mình các slide không thực sự công bằng.
Rei Miyasaka

9

Trước hết, ý nghĩa của 2 khái niệm là trực giao là gì?

Nó có nghĩa là hai khái niệm không có ý tưởng tương phản hoặc không tương thích với nhau.

FP khuyến khích sự bất biến và tinh khiết nhất có thể. và OO có vẻ như một cái gì đó được xây dựng cho trạng thái và đột biến (một phiên bản hơi có tổ chức của lập trình mệnh lệnh?). Và tôi nhận ra rằng các đối tượng có thể là bất biến. Nhưng OO dường như ngụ ý trạng thái / thay đổi đối với tôi.

Họ có vẻ như đối lập. Nó ảnh hưởng đến tính trực giao của chúng như thế nào?

Một ngôn ngữ như Scala giúp dễ dàng thực hiện cả OO và FP, điều này có ảnh hưởng đến tính trực giao của 2 phương thức không?

OO là về đóng gói, thành phần đối tượng, trừu tượng hóa dữ liệu, đa hình thông qua phân nhóm và đột biến có kiểm soát khi cần thiết (tính bất biến cũng được khuyến khích trong OO). FP là về thành phần chức năng, sự trừu tượng hóa kiểm soát và tính đa hình bị ràng buộc (hay còn gọi là đa hình tham số). Do đó hai ý tưởng không mâu thuẫn. Cả hai đều cung cấp cho bạn các loại sức mạnh và cơ chế trừu tượng khác nhau, điều chắc chắn có thể có trong một ngôn ngữ. Trên thực tế, đây là luận án mà Scala được xây dựng!

Trong bài nói chuyện về Thử nghiệm Scala tại Google, Martin Oderky giải thích rất rõ cách anh tin hai khái niệm - OO và FP - là trực giao với nhau và cách Scala hợp nhất hai mô hình một cách thanh lịch và liền mạch thành một mô hình mới phổ biến trong cộng đồng Scala như mô hình đối tượng chức năng. Phải xem nói chuyện cho bạn. :-)


Các ví dụ khác về các ngôn ngữ chức năng đối tượng: OCaml , F # , Nemerle .


1
"Điều đó có nghĩa là hai khái niệm không có ý tưởng tương phản hoặc không tương thích với nhau." - Điều đó đúng, nhưng tôi nghĩ tôi sẽ nói một cái gì đó như " khác biệt nhưng không tương thích". Chẳng hạn, nếu cái này là tập con của cái kia thì chúng sẽ không tương thích, nhưng chúng cũng sẽ không trực giao.
Tim Goodman

@Tim: Đó là nỗ lực [có thể thất bại] của tôi trong việc xác định thuật ngữ. Tôi không phải là một bậc thầy tiếng Anh mà bạn thấy. : - |
missingfaktor

7

Trực giao đại khái có nghĩa là "độc lập."

Vì vậy, nếu FP và OO là trực giao, điều đó có nghĩa là bạn có thể sử dụng tính bất biến cho dù bạn có sử dụng đối tượng hay không và bạn có thể sử dụng các đối tượng cho dù chúng có bất biến hay không.


2
"Độc lập" là một cách hay để đặt nó. Không phải là chúng đối lập nhau, nhưng mã của bạn là kiểu lập trình chức năng hay kiểu lập trình hướng đối tượng là hai thứ riêng biệt. Hãy nghĩ về chúng giống như các trục x và y trên biểu đồ - bạn có thể di chuyển lên và xuống trong khi vẫn cố định trên biểu đồ kia. (Theo nghĩa toán học, một vectơ theo hướng x và vectơ theo hướng y là trực giao theo nghĩa đen - định nghĩa CS có liên quan.)
Tim Goodman

@Timoodman: Tôi thực sự thích trục x, y trên biểu đồ tương tự bạn đã thực hiện. Điều này có thể được ánh xạ tới kết quả cuối cùng đạt được khi di chuyển theo hướng này so với hướng khác (ý ​​tôi là cuối cùng cả hai mục tiêu mô hình lập trình là để có mã dễ dàng hơn và có thể duy trì được không?)
rahulaga_dev

0

* Tôi đã nghe hết lần này đến lần khác và tôi đang cố gắng hiểu và xác thực ý tưởng rằng FP và OO là trực giao. *

Trước hết, ý nghĩa của 2 khái niệm là trực giao là gì?

Wikipedia trích dẫn: "Tính trực giao đảm bảo rằng sửa đổi hiệu ứng kỹ thuật được tạo ra bởi một thành phần của hệ thống không tạo ra cũng như không truyền bá tác dụng phụ đến các thành phần khác của hệ thống."

Đơn giản, điều đó chỉ có nghĩa là thay đổi đối với một hệ thống thì không và không thể ảnh hưởng đến thay đổi trong hệ thống kia.

Ví dụ: một chiếc xe có các bộ phận và điều khiển trực giao (ví dụ: tăng tốc chiếc xe không ảnh hưởng gì khác ngoài các bộ phận liên quan đến chức năng tăng tốc. Chẳng hạn, nó không ảnh hưởng đến radio (mặc dù tôi không chắc liệu nó có ảnh hưởng đến việc phát CD không, vì tôi đôi khi bỏ qua)).

FP khuyến khích sự bất biến và tinh khiết nhất có thể. và OO có vẻ như một cái gì đó được xây dựng cho trạng thái và đột biến (một phiên bản hơi có tổ chức của lập trình mệnh lệnh?). Và tôi nhận ra rằng các đối tượng có thể là bất biến. Nhưng OO dường như ngụ ý trạng thái / thay đổi đối với tôi.

Họ có vẻ như đối lập. Điều đó có nghĩa là chúng trực giao?

Kinda. Vấn đề là không có khái niệm nào trong số này thực sự khó định nghĩa. Nhưng vâng, bạn có ý chính của nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.