Tôi đã nghe nói rất nhiều 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ì?
Tôi đã nghe nói rất nhiều 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ì?
Câu trả lời:
Tôi muốn nói rằng đó là lập trình chức năng nhiều hơn so với 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à lập trình chức năng chỉ sử dụng các biểu thức trong khi trong lập trình mệnh lệnh cả biểu thức và câu lệnh đều được sử dụng.
Ví dụ, trong các biến lập trình bắt buộc và các vòng lặp là phổ biến khi xử lý trạng thái, trong khi trong lập trình chức năng , trạng thái được xử lý thông qua truyền tham số, 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 của Simon Peyton-Jones để giới thiệu tốt về các khái niệm chức năng.
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ữ lai 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 việc song song hóa một thứ gì đó gần như dễ dàng 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.
(Câu trả lời này được điều chỉnh từ câu 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 là tốt khi bạn có một tập hợp hoạt động cố định trên mọi 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 là tốt khi bạn có một tập hợp các thứ cố định và khi mã của bạn phát triển, bạn chủ yếu thêm các hoạt động mới vào 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 để riêng.
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 hàm để 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.
Không có thực so với. Họ có thể được bổ sung hoàn hảo. Có các ngôn ngữ FP, hỗ trợ OOP. Nhưng các cộng đồng khác nhau trong cách họ xử lý mô-đun.
Người dùng ngôn ngữ FP có xu hướng đạt được mô đun hóa thông qua các định luật toán học. Và thích bằng chứng để thể hiện sự tuân thủ pháp luật của họ.
Trong OOP bắt buộc, 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 mô đun hóa này.
Nó chỉ là một khía cạnh nhỏ, nhưng tôi nghĩ nó đáng được đề cập.
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 đó để tạo ra sự thay đổi .