2013-07-24 52 views
77

Hầu hết các ngôn ngữ chính, bao gồm ngôn ngữ lập trình hướng đối tượng (OOP) như C#, Visual Basic, C++ và Java được thiết kế để chủ yếu hỗ trợ lập trình bắt buộc (thủ tục), trong khi Haskell/gofer như ngôn ngữ hoàn toàn là chức năng. Ai có thể giải thích về sự khác biệt giữa hai cách lập trình này?Sự khác biệt giữa ngôn ngữ lập trình hàm và mệnh lệnh là gì?

Tôi biết điều đó phụ thuộc vào yêu cầu của người dùng để chọn cách lập trình nhưng tại sao bạn nên học ngôn ngữ lập trình hàm?

+1

có thể trùng lặp của [Lập trình chức năng và lập trình hướng đối tượng] (http://stackoverflow.com/questions/2078978/functional-programming-vs-object-oriented-programming) –

+1

kiểm tra [bài đăng khác này ] [1]. Nó mô tả rõ ràng sự khác biệt. [1]: http://stackoverflow.com/questions/602444/what-is-functional-declarative-and-imperative-programming – theta

Trả lời

82

Định nghĩa: Ngôn ngữ bắt buộc sử dụng một chuỗi câu lệnh để xác định cách đạt được mục tiêu nhất định. Những tuyên bố này được cho là thay đổi trạng thái của chương trình khi mỗi chương trình được thực hiện lần lượt.

Ví dụ: Java là ngôn ngữ bắt buộc. Ví dụ: một chương trình có thể được tạo để thêm một chuỗi số:

int total = 0; 
int number1 = 5; 
int number2 = 10; 
int number3 = 15; 
total = number1 + number2 + number3; 

Mỗi câu lệnh sẽ thay đổi trạng thái của chương trình, từ việc gán giá trị cho từng biến để bổ sung cuối cùng các giá trị đó. Sử dụng một chuỗi gồm năm câu lệnh, chương trình được cho biết rõ ràng cách thêm các số 5, 10 và 15 lại với nhau.

Ngôn ngữ chức năng: Mô hình lập trình chức năng được tạo rõ ràng để hỗ trợ phương pháp tiếp cận chức năng thuần túy để giải quyết vấn đề. Lập trình hàm là một dạng lập trình khai báo.

Ưu điểm của hàm thuần túy: Lý do chính để thực hiện phép biến đổi chức năng là hàm thuần túy là hàm thuần túy có thể tổng hợp được: đó là, độc lập và không trạng thái. Những đặc điểm này mang lại một số lợi ích, bao gồm: Tăng khả năng đọc và bảo trì. Điều này là do mỗi hàm được thiết kế để hoàn thành một nhiệm vụ cụ thể cho các đối số của nó. Hàm này không phụ thuộc vào bất kỳ trạng thái bên ngoài nào.

Phát triển lặp lại dễ dàng hơn. Bởi vì mã dễ dàng hơn để cấu trúc lại, các thay đổi về thiết kế thường dễ thực hiện hơn. Ví dụ, giả sử bạn viết một phép biến đổi phức tạp, và sau đó nhận ra rằng một số mã được lặp lại nhiều lần trong phép biến đổi. Nếu bạn refactor thông qua một phương pháp thuần túy, bạn có thể gọi phương pháp tinh khiết của bạn theo ý muốn mà không đáng lo ngại về tác dụng phụ.

Kiểm tra và gỡ lỗi dễ dàng hơn. Bởi vì các hàm thuần túy có thể dễ dàng được kiểm tra trong sự cô lập, bạn có thể viết mã thử nghiệm gọi hàm thuần túy với các giá trị điển hình, các trường hợp cạnh hợp lệ và các trường hợp cạnh không hợp lệ.

Đối với nhân dân OOP hoặc ngôn ngữ bắt buộc:

hướng đối tượng ngôn ngữ là tốt khi bạn có một tập cố định các hoạt động vào những thứ và như mã của bạn phát triển, bạn chủ yếu thêm những điều mới mẻ. Đ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.

Ngôn ngữ chức năng là tốt khi bạn có bộ công cụ cố định và khi mã của bạn phát triển, bạn chủ yếu thêm 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 để lại một mình.

Nhược điểm:

Nó phụ thuộc vào yêu cầu sử dụng để lựa chọn con đường lập trình, do đó thiệt hại chỉ khi người dùng không chọn con đường đúng đắn.

Khi tiến hóa đi một cách sai lầm, bạn có vấn đề:

  • Thêm một hoạt động mới cho 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 pháp mới
  • Thêm một loại mới của điều đến 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 một trường hợp mới.
+3

Một chức năng thuần túy trong trường hợp này là tương đương với một hàm toán học. Các đầu vào tương tự sẽ luôn luôn ánh xạ tới cùng một đầu ra. Chúng cũng thiếu bất kỳ tác dụng phụ nào (ngoài việc trả về một giá trị hoặc giá trị) có nghĩa là trình biên dịch có thể thực hiện một số tối ưu hóa mát mẻ, và nó làm cho việc chạy song song dễ dàng hơn vì không có gì để tranh cãi. – WorBlux

+0

Vì vậy, cách thức đúng đắn và cách thực hành tốt nhất trong việc soạn các ứng dụng oop có thể duy trì và kiểm thử có xu hướng thiết kế mã bắt buộc với trạng thái trí tuệ suy đồi? –

+1

Tôi không thấy sự khác biệt rõ ràng về văn bản nơi tính năng của từng chương trình được tô sáng. Hầu hết các mô tả cho lập trình thủ tục có thể được trao đổi bởi các văn bản lập trình bắt buộc và ngược lại. – AxeEffect

157

Đây là sự khác biệt:

Imperative:

  • Bắt đầu
  • Bật của bạn kích thước giày 9 1/2.
  • Đặt phòng trong túi của bạn để giữ một dãy [7] phím.
  • Đặt chìa khóa trong phòng cho các phím trong túi.
  • Nhập nhà để xe.
  • Mở nhà để xe.
  • Nhập ô tô.

... và vân vân và ...

  • Đặt sữa trong tủ lạnh.
  • Dừng.

Declarative, có tên dưới đây chức năng là một tiểu thể loại:

  • Sữa là một thức uống lành mạnh, trừ khi bạn có vấn đề về tiêu hóa lactose.
  • Thông thường, một cửa hàng sữa trong tủ lạnh.
  • Tủ lạnh là một hộp giữ cho mọi thứ trong đó mát mẻ.
  • Cửa hàng là nơi các mặt hàng được bán.
  • Bằng cách "bán", chúng tôi có nghĩa là trao đổi mọi thứ về tiền.
  • Ngoài ra, việc trao đổi tiền cho mọi thứ được gọi là "mua".

... và vân vân và ...

  • Hãy chắc chắn rằng chúng ta có sữa trong tủ lạnh (khi chúng ta cần nó - cho các ngôn ngữ chức năng lười biếng).

Tóm tắt: Trong ngôn ngữ bắt buộc, bạn cho máy tính biết cách thay đổi bit, byte và từ trong bộ nhớ và theo thứ tự nào. Trong những chức năng, chúng tôi nói với máy tính những gì mọi thứ, hành động vv.Ví dụ, chúng ta nói rằng giai thừa của 0 là 1, và giai thừa của mọi số tự nhiên khác là sản phẩm của con số đó và giai thừa của người tiền nhiệm của nó. Chúng tôi không nói: Để tính giai thừa của n, hãy đặt trước vùng nhớ và lưu trữ 1 ở đó, sau đó nhân số trong vùng bộ nhớ đó với các số từ 2 đến n và lưu trữ kết quả ở cùng một vị trí và cuối cùng, vùng bộ nhớ sẽ chứa giai thừa.

+1

Cảm ơn bạn. Đó là một cách tuyệt vời để nhìn vào nó. –

+4

@ Đây là giải thích rõ ràng nhất từng được đưa ra. –

+1

Tôi thích lời giải thích của bạn @Igno, nhưng điều gì đó vẫn chưa rõ ràng với tôi. Trong Declarative, mặc dù bạn chỉ ** nói với ** stuffs, nhưng bạn vẫn cần phải thay đổi bit và thay đổi trạng thái trong máy để tiến hành đúng. Nó làm cho tôi bối rối, rằng bằng cách nào đó Tuyên bố tương tự như Lập trình thủ tục * (như C Chức năng) *, và vẫn còn có một sự khác biệt lớn giữa chúng bên trong.Không * Chức năng C * giống như * Chức năng trong Lập trình chức năng * (trên Cấp độ Máy)? – Subroto

3

Lập trình chức năng là "lập trình với các hàm", trong đó hàm có một số thuộc tính toán học được mong đợi, bao gồm cả tính minh bạch tham chiếu. Từ các thuộc tính này, lưu lượng thuộc tính tiếp tục, đặc biệt là các bước lập luận quen thuộc được kích hoạt bởi khả năng thay thế dẫn đến chứng minh toán học (tức là biện minh cho sự tự tin trong kết quả).

Sau đó, một chương trình chức năng chỉ đơn thuần là một biểu thức.

Bạn có thể dễ dàng thấy sự tương phản giữa hai kiểu bằng cách chú ý các vị trí trong chương trình bắt buộc trong đó biểu thức không còn tham chiếu trong suốt (và do đó không được xây dựng với hàm và giá trị, và không thể là một phần của hàm) . Hai nơi rõ ràng nhất là: đột biến (ví dụ như biến) khác tác dụng phụ dòng điều khiển phi địa phương (ví dụ trường hợp ngoại lệ)

On khuôn khổ này của chương trình-as-biểu thức đó bao gồm các chức năng và giá trị, là xây dựng một mô hình thực tế toàn bộ các ngôn ngữ, khái niệm, "các mẫu chức năng", các bộ kết hợp, các hệ thống kiểu khác nhau và các thuật toán đánh giá. Theo định nghĩa cực đoan nhất, hầu như bất kỳ ngôn ngữ nào, ngay cả C hoặc Java - có thể được gọi là chức năng, nhưng thường là người dự trữ thuật ngữ cho các ngôn ngữ với các trừu tượng cụ thể có liên quan (chẳng hạn như đóng cửa, giá trị không thay đổi và hỗ trợ cú pháp.). Theo như sử dụng các chương trình chức năng có liên quan, nó liên quan đến việc sử dụng functins và xây dựng mã mà không có bất kỳ tác dụng phụ nào. được sử dụng để viết các bằng chứng

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