it-swarm-vi.com

Lập trình hàm so với OOP

Tôi đã nghe rất nhiều cuộc nói chuyện về việc sử dụng các ngôn ngữ chức năng như Haskell vào cuối. Một số khác biệt lớn, ưu và nhược điểm của lập trình chức năng so với lập trình hướng đối tượng là gì?

95
GSto

Tôi sẽ nói rằng đó là nhiều hơn Lập trình hàm vs Lập trình mệnh lệnh .

Sự khác biệt lớn nhất là lập trình mệnh lệnh là về Luồng điều khiển trong khi lập trình hàm là về Luồng dữ liệu . Một cách khác để nói rằng lập trình hàm chỉ sử dụng biểu thức trong khi lập trình mệnh lệnh cả biểu thức statement được sử dụng.

Ví dụ: trong các biến và vòng lặp lập trình mệnh lệnh là phổ biến khi xử lý trạng thái, trong khi lập trình chức năng trạng thái được xử lý thông qua truyền tham số , trong đó tránh tác dụng phụ và bài tập.

Mã giả bắt buộc cho một hàm để tính tổng của một danh sách (tổng được giữ trong một biến):

int sumList(List<int> list) {
    int sum = 0;
    for(int n = 0; n < list.size(); n++) {
        sum = sum + list.get(n);
    }

    return sum;
}

Mã giả chức năng cho cùng một chức năng (tổng được truyền dưới dạng tham số):

fun sumList([], sum) = sum
 |  sumList(v::lst, sum) = sumList(lst, v+sum)

Tôi khuyên bạn nên trình bày Hiệu ứng thuần hóa với lập trình chức năng by Simon Peyton-Jones để giới thiệu tốt về các khái niệm chức năng.

69
Jonas

Lập trình hàm dựa trên mô hình khai báo và có nguồn gốc từ phép tính lambda. Nó cung cấp rất nhiều khái niệm tuyệt vời có thể được mượn từ các ngôn ngữ cấp bách hơn như C++ và C #.

Một số ví dụ bao gồm tính minh bạch tham chiếu, chức năng lambda, chức năng hạng nhất, đánh giá lười biếng và háo hức, và bất biến.

Nếu không có gì khác thì học lập trình chức năng là hữu ích cho các khái niệm mà nó chứa. Nó sẽ thay đổi cách bạn lập trình và suy nghĩ về lập trình. Và tôi đoán rằng trong tương lai lập trình chức năng sẽ quan trọng như lập trình hướng đối tượng.

Để bắt đầu, bạn có thể chọn sử dụng ngôn ngữ chức năng thuần túy như Haskell hoặc bạn có thể sử dụng ngôn ngữ kết hợp như F # .

Hầu hết các trường đại học tốt sẽ bao gồm chương trình chức năng và nếu bạn đi học, tôi rất khuyên bạn nên tham gia khóa học đó.


Một số khác biệt lớn, ưu và nhược điểm của lập trình chức năng so với lập trình hướng đối tượng là gì?

Lập trình hướng đối tượng tốt là tốt vì nó cho phép bạn mô hình hóa vấn đề phức tạp của mình thành các hệ thống phân cấp để bạn có thể đơn giản hóa vấn đề. Nhưng nó trở nên rất khó khăn khi bạn bắt đầu xem xét lập trình đa luồng trong khi sử dụng các đối tượng có thể thay đổi. Trong những trường hợp như vậy, bạn cần sử dụng nhiều đối tượng đồng bộ hóa và gần như không thể hoàn thiện một ứng dụng lớn.

Đó là nơi lập trình chức năng xuất hiện. Bởi vì những thứ như lập trình chức năng bất biến thực sự đơn giản hóa các chương trình đa luồng. Nó giúp dễ dàng song song hóa một thứ gì đó khi bạn biết rằng đầu vào X cho một hàm, nó sẽ luôn xuất Y. Ngoài ra, bạn biết rằng một biến (hoặc giá trị trong lập trình hàm) không thể thay đổi sử dụng giữa từ một luồng khác.

16
Brian R. Bondy

(Câu trả lời này được điều chỉnh từ trả lời cho câu hỏi đóng tại StackOverflow .)

Một trong những khác biệt lớn giữa lập trình chức năng và lập trình hướng đối tượng là mỗi cái tốt hơn ở một loại tiến hóa phần mềm khác nhau:

  • Các ngôn ngữ hướng đối tượng sẽ tốt khi bạn có một bộ hoạt động cố định trên thứ và khi mã của bạn phát triển, bạn chủ yếu thêm những thứ mới. Điều này có thể được thực hiện bằng cách thêm các lớp mới thực hiện các phương thức hiện có và các lớp hiện có được để lại một mình.

  • Các ngôn ngữ chức năng rất tốt khi bạn có một bộ cố định và khi mã của bạn phát triển, bạn chủ yếu thêm mới hoạt động trên những thứ hiện có. Điều này có thể được thực hiện bằng cách thêm các hàm mới tính toán với các kiểu dữ liệu hiện có và các hàm hiện có được để lại một mình.

Khi tiến hóa đi sai hướng, bạn có vấn đề:

  • Thêm một hoạt động mới vào một chương trình hướng đối tượng có thể yêu cầu chỉnh sửa nhiều định nghĩa lớp để thêm một phương thức mới.

  • Thêm một loại điều mới vào một chương trình chức năng có thể yêu cầu chỉnh sửa nhiều định nghĩa chức năng để thêm trường hợp mới.

Vấn đề này đã được biết đến trong nhiều năm; vào năm 1998, Phil Wadler gọi nó là "vấn đề biểu hiện" . Mặc dù một số nhà nghiên cứu nghĩ rằng vấn đề biểu hiện có thể được giải quyết với các tính năng ngôn ngữ như mixins, một giải pháp được chấp nhận rộng rãi vẫn chưa được đưa vào dòng chính.

10
Norman Ramsey

Không có thực so với. Họ có thể được bổ sung hoàn hảo. Có FP ngôn ngữ, hỗ trợ OOP. Nhưng các cộng đồng khác nhau về cách họ xử lý mô đun.

Người dùng các ngôn ngữ FP có xu hướng đạt được tính mô đun hóa thông qua các định luật toán học. Và thích các bằng chứng để thể hiện sự tuân thủ luật pháp của họ.

Trong mệnh lệnh OOP, người dùng có xu hướng nắm bắt hành vi của đối tượng trong các trường hợp thử nghiệm, có thể chạy lại nếu đối tượng đã thay đổi và đạt được theo cách này.

Nó chỉ là một khía cạnh nhỏ, nhưng tôi nghĩ nó đáng được đề cập.

5
Edgar Klerks

Một sự tương tự:

Bạn đang trao một đơn xin việc. Bạn điền tên, thông tin liên lạc và lịch sử công việc. Khi bạn hoàn thành, bạn không còn có một ứng dụng trống.

Bây giờ hãy tưởng tượng thay vì trước khi viết bạn phủ nó bằng một tấm giấy bóng kính rõ ràng. Bạn viết tên của bạn. Bạn thêm một tờ giấy bóng kính. Bạn viết thông tin liên lạc của bạn. Giấy bóng kính nhiều hơn. Bạn viết lịch sử công việc của bạn. Khi bạn hoàn thành, bạn vẫn còn ứng dụng trống chưa được xử lý. Bạn cũng có ba tờ giấy bóng kính, mỗi tấm có được hiệu ứng của một thay đổi riêng lẻ.

Cái trước (OOP) bao trùm ý tưởng thay đổi mọi thứ tại chỗ trong khi cái sau (FP) trốn tránh nó. Cả hai đều là mô hình quản lý nhà nước. Cả hai có thể, sử dụng các chiến lược khác nhau, nắm bắt hiệu quả của việc hoàn thành đơn xin việc. OOP thay đổi công cụ bắt đầu trực tiếp, trong khi FP phủ lên những gì xuất hiện trước để thực hiện sự xuất hiện của thay đổi .

2
Mario T. Lanza