Ý nghĩa cụ thể của các điều khoản: Chức năng, phương pháp, thủ tục và chương trình con là gì?


11

Tôi đang tự hỏi sự khác biệt cụ thể trong thuật ngữ mà chúng tôi sử dụng để nhóm các phần liên quan của mã. Đôi khi tôi đã thấy các thuật ngữ được sử dụng thay thế cho nhau: nhiều ngôn ngữ OO thậm chí sử dụng từ khóa "hàm" để định nghĩa một phương thức. (Tại sao?)

Nếu bạn muốn chính xác, ý nghĩa cụ thể của mỗi là gì? Hay đó chỉ là bất cứ điều gì mà mỗi ngôn ngữ chọn để gọi nó?


Hai ngôn ngữ duy nhất tôi biết sử dụng functioncho các phương thức là JavaScript và PHP. Cả hai đều sử dụng cùng một từ khóa cho các phương thức không (các hàm miễn phí) và trong trường hợp JavaScript thực sự không có sự phân biệt giữa các hàm và phương thức, ít nhất là không ở cấp độ ngôn ngữ.

Ví dụ: trong VB.Net SubFunctionkhông có giá trị trả về. Trong Pythonbạn có thể có một hàm không phải là một phần của bất kỳ lớp nào, vì vậy nó không phải là một phương thức. Bạn cũng có thể khai báo các hàm trong các hàm và bạn cũng có thể làm điều đó trong C #. Đôi khi chúng có tên khác nhau cho cùng một lý do mà táo và dứa làm: bởi vì chúng khác nhau.
Công việc

Những gì bạn đã tìm thấy cho đến nay mà làm cho bạn nghĩ rằng có một sự khác biệt?
JeffO 11/03/2016

Câu trả lời:


20
  • chương trình con, chương trình con
    "chương trình con" có lẽ đến từ ngôn ngữ lắp ráp. Một số bộ xử lý bao gồm các hướng dẫn để hỗ trợ các chương trình con như một cách tổ chức mã và sử dụng lại các phần phổ biến của mã. Ví dụ, bộ xử lý 6502 có các lệnh JSR (nhảy đến chương trình con) và RTS (trở về từ chương trình con). Tôi nhớ nó cũng được sử dụng rất nhiều trong lập trình có cấu trúc, trong đó một chương trình là một hệ thống phân cấp các đơn vị mã đôi khi được gọi là chương trình con hoặc chương trình con. IMO, đây là những thuật ngữ chung nhất cho một số đơn vị mã được kiểm soát tạm thời được chuyển cho mục đích hoàn thành một nhiệm vụ nhất định.

  • chức năng, thủ tục
    Chúng thường được sử dụng thay thế cho nhau, nhưng trong một số ngôn ngữ có sự phân biệt. Trong Pascal, một hàm là một chương trình con trả về một giá trị, trong khi một thủ tục là một chương trình con không có. Trong C và các ngôn ngữ liên quan, mọi chương trình con đều có kiểu trả về (ngay cả khi đó void), do đó không có sự phân biệt.

  • phương thức, hàm thành viên
    Đây là hai tên cho cùng một thứ - về cơ bản là một hàm được liên kết với một lớp hoặc đối tượng nhất định.

  • Toán tử
    Mỗi ngôn ngữ có một tập hợp các toán tử tích hợp. Trong một số ngôn ngữ, chẳng hạn như C ++, toán tử là các hàm có thể bị ghi đè (nghĩa là được thay thế) và / hoặc bị quá tải (nghĩa là được xác định cho các loại mới).

  • chức năng ẩn danh
    Điều này đề cập đến một chức năng không có tên. Các hàm ẩn danh về cơ bản là các khối mã có thể được gán cho các biến hoặc được truyền dưới dạng tham số cho lần sử dụng tiếp theo, ví dụ như một thói quen hoàn thành.

  • bao đóng, biểu thức lambda, khối
    Một bao đóng là một đoạn mã được liên kết với một tập hợp các biến. Tôi nghĩ về việc đóng cửa như các chức năng ẩn danh cộng với bối cảnh.


4
Không phải tất cả các ngôn ngữ đi kèm với các nhà khai thác tích hợp. Một số, như Scheme và Haskell, chỉ cho phép bạn xác định các hàm với các tên như '+' hoặc '>> ='. Ngoài ra, có lẽ bạn nên thêm rằng trong một số ngôn ngữ (như Lược đồ), "hàm" ngụ ý độ trong suốt tham chiếu (ví dụ: nó luôn trả về cùng một giá trị cho cùng một đầu vào mà không có tác dụng phụ) trong khi thủ tục thì không. Nếu không, câu trả lời tuyệt vời.
Tikhon Jelvis

Cho đến nay tôi có thể nhớ "toán tử" được sử dụng chủ yếu cho các hàm có 2 đối số. Chúng là infix (toán tử giữa các đối số 2 + 2:). Có một ngoại lệ nhỏ như 1-arg like ++arg(tiền tố) hoặc arg++(postfix). Mặc dù, tôi chưa thấy nhiều toán tử postfix ..
Darek Nędza

-1

Nó phụ thuộc vào ngôn ngữ, những gì bạn có thể làm với chúng

  • bạn có cần một sự phân biệt
  • Có một sự khác biệt trong cú pháp, hay chỉ là sự tiện lợi, khi nói về mã

AFAIK, trong Basic, nếu bạn gọi một cái gì đó, không trả lại bất cứ thứ gì, nhưng thực hiện một công việc có tác dụng phụ, như in, ghi vào tệp hoặc thay đổi một biến toàn cục, thì đó được gọi là thủ tục.

Nếu nó trả về một cái gì đó, nó được gọi là một hàm.

Trong một ngôn ngữ OOP như Java, tôi hiếm khi gặp thuật ngữ 'hàm', nhưng 'phương thức', và người ta đã dạy rằng các hàm là những thứ mang tính toàn cầu và có thể được mọi người gọi.

Trong scala ngôn ngữ chức năng và ngôn ngữ OOP, một phương thức không được gọi là hàm, nhưng bạn có thể truyền một thứ như vậy cho một phương thức khác, và sau đó nó trở thành một hàm.

Theo tôi, một chương trình con là một thói quen, được gọi bởi một thói quen khác.

Tóm lại, tôi không nghĩ có một định nghĩa ngắn gọn về tất cả các ngôn ngữ và hơn thế nữa là các mô hình. Bạn phải xem xét văn hóa cụ thể, nếu bạn sử dụng các thuật ngữ này - có lẽ bạn nên giới thiệu định nghĩa của mình trước.


-1

Tôi muốn nói tùy thuộc vào ngữ cảnh, tất cả những từ đó có thể có nghĩa giống nhau hoặc những thứ cực kỳ khác nhau, ví dụ như những gì Caleb đã viết (nhưng có nhiều hơn, tức là các ngôn ngữ nơi các toán tử là các hàm hạng nhất, v.v.). Vì vậy, thật khó để đưa ra một định nghĩa cụ thể và khôn ngoan để không giả định quá nhiều trừ khi bối cảnh (ngôn ngữ lập trình) được biết đế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.