it-swarm-vi.com

Phương thức vs Chức năng vs Thủ tục

Câu hỏi đơn giản, nhưng tôi thường nghe ba thuật ngữ được định nghĩa với sự hung dữ như vậy, nhưng tôi đã biết nó có nghĩa là những điều khác nhau trong những năm qua.

Các định nghĩa "chính xác" của "Thủ tục", "Phương thức", "Hàm", "Chương trình con", v.v là gì?

113
Django Reinhardt

Tôi sẽ có một câu trả lời khác ở đây: thực tế mà nói, thực sự không có gì khác biệt, với một ngoại lệ nhỏ là "phương thức" thường đề cập đến một chương trình con được liên kết với một đối tượng trong các ngôn ngữ OO.

Các thuật ngữ "thủ tục, hàm, chương trình con, chương trình con và phương thức" tất cả thực sự có nghĩa giống nhau: một chương trình con có thể gọi được trong một chương trình lớn hơn. Nhưng thật khó để đưa ra một định nghĩa nắm bắt tất cả các cách sử dụng biến thể của các thuật ngữ này, bởi vì chúng không được sử dụng nhất quán trên các ngôn ngữ lập trình hoặc mô hình.

Bạn có thể nói một hàm trả về một giá trị. Chà, hàm C sau đây không trả về giá trị:

void f() { return; }

... nhưng tôi nghi ngờ bạn sẽ tìm thấy bất cứ ai gọi đó là thủ tục.

Chắc chắn, trong Pascal, các thủ tục không trả về giá trị và hàm trả về giá trị, nhưng đó chỉ là sự phản ánh về cách Pascal được thiết kế. Trong Fortran, một hàm trả về một giá trị và một chương trình con trả về nhiều giá trị. Tuy nhiên, không ai trong số này thực sự cho phép chúng tôi đưa ra định nghĩa "phổ quát" cho các thuật ngữ này.

Trên thực tế, thuật ngữ "lập trình thủ tục" dùng để chỉ cả một nhóm ngôn ngữ, bao gồm C, Fortran và Pascal, chỉ một trong số đó thực sự sử dụng thuật ngữ "thủ tục" để chỉ bất cứ điều gì.

Vì vậy, không ai trong số này là thực sự phù hợp. Ngoại lệ duy nhất có lẽ là "phương thức", dường như được sử dụng gần như hoàn toàn với các ngôn ngữ OO, đề cập đến một chức năng được liên kết với một đối tượng. Mặc dù, ngay cả điều này không phải lúc nào cũng nhất quán. C++ , ví dụ, thường sử dụng thuật ngữ "hàm thành viên" thay vì phương thức, (mặc dù thuật ngữ "phương thức" đã len lỏi vào ngôn ngữ C++ trong số các lập trình viên.)

Vấn đề là, không ai trong số này là thực sự phù hợp. Nó chỉ đơn giản phản ánh thuật ngữ được sử dụng bởi bất kỳ ngôn ngữ nào đang thịnh hành tại thời điểm đó.

109
Charles Salvia

A function trả về một giá trị, nhưng thủ tục thì không.

A phương thức tương tự như hàm, nhưng là nội bộ để một phần của lớp học Thuật ngữ phương thức được sử dụng hầu như chỉ trong lập trình hướng đối tượng.

69
Bruce Alderman

Một hàm là một cái gì đó lấy một loạt các đầu vào và trả về một hoặc nhiều giá trị. Nếu các giá trị được trả về hoàn toàn được xác định bởi các đầu vào và hàm không có bất kỳ tác dụng phụ nào (ghi nhật ký, có thể hoặc gây ra thay đổi trạng thái bên ngoài chính nó), thì đó được gọi là hàm thuần túy.

A thủ tục là hàm không trả về giá trị. Đặc biệt, điều này có nghĩa là một quy trình chỉ có thể gây ra tác dụng phụ. (Điều đó có thể bao gồm việc thay đổi một tham số đầu vào!)

A phương thức là một hàm đóng trên một tập hợp các biến, nghĩa là một bao đóng. Nó không có hoặc nhiều tham số đầu vào, có quyền truy cập vào bộ biến này và trả về 0 hoặc nhiều giá trị. Trong OO ngôn ngữ, các phương thức này được gắn vào các đối tượng hoặc lớp.

Trong hầu hết các ngôn ngữ chính OO, các biến đóng này được gọi là các trường thành viên hoặc biến đối tượng của một đối tượng. Phương thức có thể là hàm thuần túy, hàm không tinh khiết hoặc thủ tục.

Định nghĩa sau dẫn đến sự tương ứng object = struct + closures .

53
Frank Shearar

Bruce có một câu trả lời tốt . Tôi sẽ thêm, về mặt ngữ nghĩa:

  • Một thủ tục nên "làm một cái gì đó" cho các đối số hoặc gây ra một số tác dụng phụ khác (ví dụ: printf)
  • Một hàm nên (a) trả lời một câu hỏi về các đối số hoặc (b) tính toán một giá trị mới dựa trên các đối số
  • Một phương thức hàm sẽ trả lời một câu hỏi về trạng thái của đối tượng
  • Một phương thức thủ tục sẽ thay đổi trạng thái của đối tượng
14
Scott Whitlock

câu trả lời chi tiết tốt ở trên; câu chuyện ngắn là tất cả chúng sẽ có hương vị của chương trình con; ý nghĩa của mỗi thuật ngữ sẽ khác nhau tùy theo ngữ cảnh ngôn ngữ lập trình

nói chung, các hàm trả về một giá trị, nhưng chúng không phải

các phương thức là chung OOP điều khoản hiện tại

trong SQL, các thủ tục được lưu trữ có đầu ra nhưng thường chỉ trả về mã lỗi, trong khi các hàm do người dùng xác định phải trả về một giá trị (có thể là tập kết quả)

một lần nữa, sự khác biệt chính xác giữa các điều khoản này phụ thuộc vào người bạn đang nói chuyện!

4
Steven A. Lowe

80% trình độ có liên quan trực tiếp đến việc làm quen với danh pháp,

95% năng suất là khả năng xác định những gì hữu ích tại thời điểm này mặc dù các thuật ngữ được sử dụng để mô tả nó

Tôi khá thích gọi chúng là tất cả các phương thức trong c # trừ khi tôi sử dụng MSSQL, chúng tôi đã sử dụng sproc, nhưng tất nhiên bây giờ chúng tôi sử dụng Postgres và chúng được gọi là các hàm.

2
MvcCmsJon