Câu hỏi Sự khác nhau giữa phương thức và hàm là gì?


Ai đó có thể cung cấp một lời giải thích đơn giản về phương pháp so với chức năng trong ngữ cảnh OOP?


1448
2017-09-30 23:45


gốc


Xem thêm chương trình con so với hàm, chức năng so với thủ tục, coroutines. - gerrit
Khi giá trị của một thuộc tính là một hàm, chúng ta gọi nó là một phương thức - coder
Điều ngược lại của phương pháp là gì? Đó là câu hỏi của tôi. "Chức năng" là khái niệm cha mẹ. Phương thức là một loại hàm. Tên cho một loại hàm không phải là một phương thức, nhưng có thể gọi trực tiếp bằng tên là gì? - Alexander Mills
Nó sẽ là thú vị để xem một giải thích phác thảo sự khác biệt giữa các phương pháp và chức năng trong r. Nó thú vị như phương pháp thường chứa hàm. Nếu phương thức là một hàm phụ thuộc đối tượng thì kiểm tra hàm cho lớp đối tượng if(class(object)) { ... } else {stop()} sẽ là khái niệm tương đương với phương pháp? - Konrad


Các câu trả lời:


A chức năng là một đoạn mã được gọi theo tên. Nó có thể được truyền dữ liệu để hoạt động (tức là các tham số) và có thể trả về tùy chọn dữ liệu (giá trị trả về). Tất cả dữ liệu được truyền cho một hàm được truyền một cách rõ ràng.

A phương pháp là một đoạn mã được gọi bằng tên được liên kết với một đối tượng. Trong hầu hết các khía cạnh, nó giống hệt một hàm ngoại trừ hai khác biệt chính:

  1. Một phương thức được truyền hoàn toàn đối tượng mà nó được gọi.
  2. Một phương thức có thể hoạt động trên dữ liệu nằm trong lớp (nhớ rằng đối tượng là một thể hiện của một lớp - lớp là định nghĩa, đối tượng là một cá thể của dữ liệu đó).

(đây là một lời giải thích đơn giản, bỏ qua các vấn đề phạm vi v.v.)


1505
2017-10-01 00:00



Đối với 1), bạn cũng nên thêm các phương thức đó vào C ++ được gọi là hội viên chức năng. Do đó, sự khác biệt giữa các hàm và các phương thức trong ngữ cảnh này là tương tự với sự khác biệt giữa các hàm và các hàm thành viên trong C ++. Hơn nữa, các ngôn ngữ như Java chỉ có phương pháp. Trong trường hợp này, các hàm sẽ tương tự với các phương thức tĩnh và các phương thức sẽ có cùng ý nghĩa. Đối với 2), bạn nên thêm rằng một phương thức có thể hoạt động trên riêng tư dụ (thành viên) dữ liệu được khai báo như một phần của lớp. Bất kỳ mã nào cũng có thể truy cập dữ liệu cá thể công khai. - Raffi Khatchadourian
một hàm là một cấu trúc toán học. Tôi sẽ nói tất cả các phương thức đều có chức năng nhưng không phải tất cả các hàm đều là các phương thức - Tyler Gillies
Đến từ một nền tảng lập trình chức năng, tôi cảm thấy có một sự phân biệt sâu sắc giữa chức năng và phương pháp. Chủ yếu là phương pháp có tác dụng phụ, và các chức năng đó phải tinh khiết, do đó tạo ra một thuộc tính khá tốt đẹp của tính minh bạch tham chiếu - HHC
@TylerGillies và HHC, tôi đồng ý nó có thể tốt đẹp nếu "chức năng" và "phương pháp" có nghĩa là những gì bạn muốn họ, nhưng định nghĩa của bạn không phản ánh một số sử dụng rất phổ biến của những điều khoản. - Paul Draper
Bởi định nghĩa này sẽ không một phương pháp tĩnh không thực sự được coi là một phương pháp bởi vì nó không có bất cứ điều gì để làm với một trường hợp cụ thể? - Carcigenicate


Phương thức là một đối tượng.
Một hàm độc lập với một đối tượng.

Đối với Java, chỉ có các phương thức.
Đối với C, chỉ có các hàm.

Đối với C ++ nó sẽ phụ thuộc vào việc bạn có đang ở trong lớp hay không.


872
2017-09-30 23:51



Đã đến lúc thêm C #. - Rosdi Kasim
@RosdiKasim Đối với C #, chỉ có phương pháp. (vì ngay cả các phương thức tĩnh cần được liên kết với một đối tượng) - Lynn Crumbling
Làm thế nào về phương pháp tĩnh trong một lớp học? Những thứ đó sẽ độc lập với một đối tượng (trong java). Liệu đó có phải là một chức năng không? - Squeazer
@Squeazer Có một câu hỏi về điều đó gần đây stackoverflow.com/questions/30402169/… Đặc tả Ngôn ngữ Java chỉ khác với chúng là "phương thức lớp" (tĩnh) và "phương thức thể hiện". Vì vậy, họ vẫn còn tất cả các phương pháp. - xji
Java có các biểu thức lambda, là các hàm không phải là các phương thức - Max Heiber


'phương pháp' là từ hướng đối tượng cho 'chức năng'. Đó là khá nhiều tất cả để có nó (ví dụ, không có sự khác biệt thực sự).

Thật không may, tôi nghĩ rằng rất nhiều câu trả lời ở đây là duy trì hoặc thúc đẩy ý tưởng rằng có một số khác biệt phức tạp, có ý nghĩa.

Thực sự - không có nhiều thứ cho nó, chỉ là những từ khác nhau cho cùng một thứ.

[bổ sung trễ]


Trong thực tế, như Brian Neal chỉ ra trong một bình luận câu hỏi này, tiêu chuẩn C ++ không bao giờ sử dụng thuật ngữ 'phương thức' khi đề cập đến các hàm thành viên. Một số người có thể coi đó là dấu hiệu cho thấy C ++ không thực sự là ngôn ngữ hướng đối tượng; tuy nhiên, tôi thích lấy nó như một dấu hiệu cho thấy một nhóm người khá thông minh không nghĩ rằng có một lý do đặc biệt mạnh mẽ để sử dụng một thuật ngữ khác.


166
2017-09-30 23:48



Vâng, ActionScript có thể có cả hai phương thức và chức năng, tùy thuộc vào nếu hàm bị ràng buộc với một thể hiện của một lớp hay không (tất cả phụ thuộc vào cách nó được định nghĩa). Vì vậy, có một sự khác biệt. - IQAndreas
Một phương thức là một kiểu hàm đặc biệt với một đối số ngầm được truyền (một cá thể của lớp mà phương thức được định nghĩa trên). Điều này quan trọng như một hàm, theo nghĩa nghiêm ngặt, không nên sử dụng hoặc sửa đổi bất cứ điều gì không có trong danh sách đối số của nó. - ty1824
@ ty1824 nó không phải luôn luôn là trường hợp mà các phương pháp được thông qua đối số tiềm ẩn. Trong Python, self đối số là rõ ràng. Và nhiều ngôn ngữ có các phương thức tĩnh, không được truyền một thể hiện. - Max Heiber
@mheiber đó là một số điểm hợp lệ. Liên quan đến bản thân, bạn đúng, nó rõ ràng xác định. Điều quan trọng là cuộc gọi là ngầm, dựa trên tham chiếu đối tượng ban đầu. Có những ngôn ngữ hỗ trợ ghi đè this hoặc là self, nhưng những cấu trúc này thường được gọi là hàm, chứ không phải là phương thức. - ty1824
@ ty1824 C ++, Scala, Python, Ruby, JavaScript và Scala đều có các phương thức tĩnh, vì vậy tôi không nghĩ đó chỉ là một điều Java. Tôi không thích chúng: chúng có thể sử dụng các đối tượng (bó của trạng thái) như thể chúng là không gian tên. - Max Heiber


Nói chung: các phương thức là các hàm thuộc về một lớp, các hàm có thể nằm trên bất kỳ phạm vi mã nào khác để bạn có thể nói rằng tất cả các phương thức đều là các hàm, nhưng không phải tất cả các hàm đều là các phương thức:

Lấy ví dụ python sau đây:

class Door:
  def open(self):
    print 'hello stranger'

def knock_door:
  a_door = Door()
  Door.open(a_door)

knock_door()

Ví dụ được đưa ra cho bạn thấy một lớp được gọi là "Cửa" có một phương thức hoặc hành động được gọi là "mở", nó được gọi là một phương thức vì nó được khai báo bên trong một lớp. Có một phần mã khác với "def" ngay dưới định nghĩa hàm, nó là hàm bởi vì nó không được khai báo bên trong lớp, hàm này gọi phương thức chúng ta đã định nghĩa bên trong lớp của chúng ta như bạn thấy và cuối cùng hàm đang được được gọi bằng chính nó.

Như bạn có thể thấy, bạn có thể gọi một hàm ở bất kỳ đâu nhưng nếu bạn muốn gọi một phương thức, bạn phải truyền một đối tượng mới cùng kiểu với lớp mà phương thức được khai báo (Class.method (object)) hoặc bạn phải gọi phương thức bên trong đối tượng (object.Method ()), ít nhất là trong python.

Hãy suy nghĩ về các phương thức như một thứ mà một thực thể có thể làm, vì vậy nếu bạn có một lớp Dog, sẽ có ý nghĩa khi chỉ có một hàm bark bên trong lớp đó và đó sẽ là một phương thức, nếu bạn cũng có một lớp Person viết một hàm "feed" cho nó không thuộc về bất kỳ lớp nào vì cả người và chó đều có thể được cho ăn và bạn có thể gọi hàm đó vì nó không thuộc về bất kỳ lớp nào nói riêng.


81
2017-10-01 00:33





Một định nghĩa rất chung về sự khác biệt chính giữa Chức năng và một phương pháp:

Các hàm được định nghĩa bên ngoài các lớp, trong khi các phương thức được định nghĩa bên trong và một phần của các lớp.


35
2017-10-28 23:08





Nếu bạn cảm thấy thích đọc ở đây là "Giới thiệu về phương pháp OO của tôi"

Ý tưởng đằng sau mô hình hướng đối tượng là "đe dọa" phần mềm bao gồm .. cũng "đối tượng". Đối tượng trong thế giới thực có tài sản, ví dụ nếu bạn có một nhân viên, nhân viên có một tên, một id nhân viên, một vị trí, anh ta thuộc về một bộ phận, vv

Đối tượng cũng biết cách xử lý các thuộc tính của nó và thực hiện một số thao tác trên chúng. Hãy nói rằng nếu chúng ta muốn biết những gì một nhân viên đang làm ngay bây giờ chúng tôi sẽ hỏi anh ta.

employe whatAreYouDoing.

Đó là "whatAreYouDoing" là một "thông báo" được gửi đến đối tượng. Các đối tượng biết làm thế nào để trả lời cho câu hỏi đó, nó được cho là nó có một "phương pháp" để giải quyết các câu hỏi.

Vì vậy, cách các đối tượng có để lộ hành vi của nó được gọi là phương pháp. Các phương thức do đó là đối tượng tạo tác phải "làm" một cái gì đó.

Các phương pháp khác có thể là

employee whatIsYourName
employee whatIsYourDepartmentsName

v.v.

Mặt khác, các hàm là cách ngôn ngữ lập trình phải tính toán một số dữ liệu, ví dụ bạn có thể có hàm addValues ​​(8, 8) trả về 16

// pseudo-code
function addValues( int x, int y )  return x + y 
// call it 
result = addValues( 8,8 )
print result // output is 16...

Vì các ngôn ngữ lập trình phổ biến đầu tiên (như fortran, c, pascal) không bao gồm mô hình OO, chúng chỉ gọi các hàm "các hàm" này.

ví dụ hàm trước trong C sẽ là:

int addValues( int x, int y ) 
{
   return x + y;
}

Nó không phải là "tự nhiên" để nói một đối tượng có một "hàm" để thực hiện một số hành động, bởi vì các hàm có liên quan nhiều hơn đến toán học trong khi Nhân viên có ít toán học trên nó, nhưng bạn có thể có các phương thức làm chính xác giống như hàm, ví dụ trong Java, đây sẽ là hàm addValues ​​tương đương.

public static int addValues( int x, int y ) {
    return x + y;
}

Có vẻ quen thuộc? Đó là bởi vì Java có nguồn gốc của nó trên C + + và C + + trên C.

Cuối cùng chỉ là một khái niệm, trong việc thực hiện chúng có thể giống nhau, nhưng trong tài liệu OO chúng được gọi là phương thức.

Dưới đây là một ví dụ về đối tượng Employee trước đó trong Java.

public class Employee {

    Department department;
    String name;

    public String whatsYourName(){
        return this.name;
    }
    public String whatsYourDeparmentsName(){
         return this.department.name();
    }
    public String whatAreYouDoing(){
        return "nothing";
    } 
    // Ignore the following, only set here for completness
    public Employee( String name ) {
        this.name = name;
    }

}

// Usage sample.
Employee employee = new Employee( "John" ); // Creates an employee called John

// If I want to display what is this employee doing I could use its methods.
// to know it.
String name = employee.whatIsYourName():
String doingWhat = employee.whatAreYouDoint();

// Print the info to the console.

 System.out.printf("Employee %s is doing: %s", name, doingWhat );

Output:
Employee John is doing nothing.

Sự khác biệt sau đó, là trên "tên miền", nơi nó được áp dụng.

AppleScript có ý tưởng về matphor "ngôn ngữ tự nhiên", tại một số điểm mà OO có. Ví dụ Smalltalk. Tôi hy vọng nó có thể là hợp lý dễ dàng hơn cho bạn để hiểu các phương pháp trong các đối tượng sau khi đọc này.

LƯU Ý: Mã không được biên dịch, chỉ để phục vụ như một ví dụ. Vui lòng sửa đổi bài đăng và thêm ví dụ Python.


26
2017-10-08 00:07



Bravo! Hiển thị rực rỡ về cách các phương thức là các lệnh tới các đối tượng. Đây là chìa khóa để hiểu OO và sự thiếu hùng biện mà bạn hiển thị trong câu trả lời này là lý do tại sao OO bị ngược đãi trong ngành công nghiệp ngày nay. Bài đăng tuyệt vời. - moffdub


Cách đơn giản để nhớ:

  • Function → Free (miễn phí có nghĩa là không thuộc về một đối tượng hoặc lớp học)
  • Method → Member (Một thành viên của một đối tượng hoặc một lớp)

20
2017-09-30 23:56



Đó là một cách dễ nhớ! cổ vũ - Sijan Shrestha


Trong thế giới OO, cả hai thường được sử dụng để có nghĩa là cùng một điều.

Từ quan điểm toán học và CS thuần túy, một hàm sẽ luôn trả về kết quả tương tự khi được gọi với cùng các đối số (f (x, y) = (x + y)). Một phương thức khác, thường được kết hợp với một cá thể của một lớp. Một lần nữa, hầu hết các ngôn ngữ OO hiện đại không còn sử dụng thuật ngữ "chức năng" cho hầu hết các phần. Nhiều phương thức tĩnh có thể khá giống các hàm, vì chúng thường không có trạng thái (không phải lúc nào cũng đúng).


16
2017-09-30 23:55





Giả sử một hàm là một khối mã (thường là với phạm vi riêng của nó, và đôi khi có đóng riêng) có thể nhận được một số đối số và cũng có thể trả về kết quả.

Một phương thức là một hàm được sở hữu bởi một đối tượng (trong một số hệ thống hướng đối tượng, nó là chính xác hơn để nói nó thuộc sở hữu của một lớp). Được "sở hữu" bởi một đối tượng / lớp nghĩa là bạn tham chiếu đến phương thức thông qua đối tượng / lớp; ví dụ, trong Java nếu bạn muốn gọi một phương thức "open ()" thuộc sở hữu của một đối tượng "cửa" bạn cần phải viết "door.open ()".

Các phương thức thông thường cũng có thêm một số thuộc tính mô tả hành vi của chúng trong đối tượng / lớp, ví dụ: khả năng hiển thị (liên quan đến khái niệm định hướng đối tượng), định nghĩa từ đối tượng (hoặc lớp) nào có thể được gọi.

Trong nhiều ngôn ngữ hướng đối tượng, tất cả "hàm" thuộc về một số đối tượng (hoặc lớp) và vì vậy trong các ngôn ngữ này, không có hàm nào không phải là phương thức.


14
2017-10-01 00:54



Tôi tin rằng các phương thức có thể được sở hữu bởi một đối tượng hoặc lớp vì Javascript (mà bạn đã đề cập trong câu hỏi của bạn) là một trong những ngôn ngữ mang xu hướng chung của ngôn ngữ hướng đối tượng bằng cách có các phương thức thuộc sở hữu của các đối tượng chứ không phải lớp. các lớp tồn tại). - Mike Tunnicliffe


Hàm là một khái niệm toán học. Ví dụ:

f(x,y) = sin(x) + cos(y)

nói rằng hàm f () sẽ trả về sin của tham số đầu tiên được thêm vào cosin của tham số thứ hai. Nó chỉ là toán học. Khi nó xảy ra sin () và cos () cũng là các hàm. Một hàm có thuộc tính khác: tất cả các cuộc gọi đến một hàm có cùng các tham số, phải trả về cùng một kết quả.

Một phương thức, mặt khác, là một hàm liên quan đến một đối tượng trong một ngôn ngữ hướng đối tượng. Nó có một tham số ngầm định: đối tượng đang bị tác động (và trạng thái của nó).

Vì vậy, nếu bạn có một đối tượng Z với một phương thức g (x), bạn có thể thấy như sau:

Z.g(x) = sin(x) + cos(Z.y)

Trong trường hợp này, tham số x được truyền vào, giống như trong ví dụ hàm trước đó. Tuy nhiên, tham số cos () là một giá trị nằm trong đối tượng Z. Z và dữ liệu nằm bên trong nó (Z.y) là các tham số ngầm định cho phương thức g () của Z.


11
2018-02-06 05:03





Hàm hoặc phương thức là một đoạn mã có tên gọi được gọi là thực hiện một số thao tác và trả về một giá trị tùy ý.

Trong C ngôn ngữ mà hàm thuật ngữ được sử dụng. Java & C # mọi người sẽ nói nó là một phương thức (và một hàm trong trường hợp này được định nghĩa trong một lớp / đối tượng).

A C ++ lập trình viên có thể gọi nó là hàm hoặc đôi khi là phương thức (tùy thuộc vào việc chúng đang viết mã c ++ theo cách thủ tục hay đang làm theo hướng đối tượng của C ++, cũng là lập trình viên C / C ++ có thể gọi nó là hàm vì thuật ngữ 'phương thức' ít thường xuyên hơn được sử dụng trong văn học C / C ++).

Bạn sử dụng một hàm bằng cách gọi nó là tên như,

result = mySum(num1, num2);


Bạn sẽ gọi một phương thức bằng cách tham chiếu đối tượng của nó trước tiên,

result = MyCalc.mySum(num1,num2);

11
2017-09-30 23:52