Sự khác biệt giữa một phương thức và một chức năng là gì?


1742

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



12
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
mã hóa

2
Sự đối lập của một 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 của một loại hàm không phải là một phương thức, nhưng có thể được gọi trực tiếp bằng tên?
Alexander Mills

Sẽ rất thú vị khi thấy một lời giải thích khác phác thảo sự khác biệt giữa các phương thức và hàm trong r . Thật thú vị vì phương thức thường chứa một hàm . Nếu phương thức là một hàm phụ thuộc đối tượng thì chức năng kiểm tra lớp đối tượng if(class(object)) { ... } else {stop()}sẽ tương đương về mặt khái niệm với phương thức?
Konrad

Thuật ngữ thích hợp thực sự có thể phụ thuộc vào ngôn ngữ, vì vậy nó có thể có nghĩa là những điều hơi khác nhau trong các bối cảnh khác nhau. Mặc dù vậy, vì các lập trình viên làm việc với một ngôn ngữ khác ngôn ngữ khác được sử dụng nhiều hơn cho các thuật ngữ nhất định. Các lập trình viên cũng bị ảnh hưởng bởi việc sử dụng các thuật ngữ của đồng nghiệp (cho dù đúng hay không chính xác). Những thuật ngữ này thường được sử dụng thay thế cho nhau. Xem một số ý kiến ​​dưới đây, ví dụ.
jvriesem

Câu trả lời:


1832

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

Một phương pháp là một đoạn mã mà được gọi bằng một 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 với một chức năng ngoại trừ hai điểm khác biệt chính:

  1. Một phương thức được truyền ngầm cho đố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 được chứa trong lớp (nhớ rằng một đố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 thể hiện của dữ liệu đó).

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


249
Đối với 1), bạn cũng nên thêm các phương thức trong C ++ được gọi là các hàm thành viên . Do đó, sự khác biệt giữa các hàm và phương thức trong ngữ cảnh này tương tự như 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 thức. Trong trường hợp này, các hàm sẽ tương tự như 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 dữ liệu thể (thành viên) riêng đượ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 cộng.
Raffi Khatchadourian

46
một hàm là một cấu trúc toán học. Tôi muốn nói tất cả các phương thức 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
Tyler Gillies

29
Đến từ một nền tảng lập trình chức năng, tôi cảm thấy có sự phân biệt sâu sắc giữa chức năng và phương thức. Các phương thức chủ yếu có tác dụng phụ và các chức năng đó phải hoàn toàn do đó mang lại một đặc tính khá tốt về tính minh bạch tham chiếu
HHC

26
@TylerGillies và HHC, tôi đồng ý rằng nó có thể tốt nếu "hàm" và "phương thức" có nghĩa là những gì bạn muốn chúng, nhưng định nghĩa của bạn không phản ánh một số cách sử dụng rất phổ biến của các thuật ngữ đó.
Paul Draper

9
Theo định nghĩa này, một phương thức tĩnh sẽ không thực sự được coi là một phương thức bởi vì nó không liên quan gì đến một thể hiện cụ thể?
Carcigenicate

963

Một phương thức là trên một đối tượng.
Một chức năng độc lập với một đối tượng.

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

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


39
Đã đến lúc thêm C #.
Rosdi Kasim

7
@RosdiKasim Đối với C #, chỉ có các phương thức. (vì ngay cả các phương thức tĩnh cũng cần được liên kết với một đối tượng)
Lynn Crumbled

38
Làm thế nào về các phương thức tĩnh trong một lớp? Chúng sẽ độc lập với một đối tượng (trong java). Đó sẽ không phải là một chức năng sau đó?
Squeazer

12
@Squeazer Có một câu hỏi về stackoverflow.com/questions/30402169/ Khăn gần đây Đặc tả ngôn ngữ Java chỉ khác chúng là "phương thức lớp" (phương thức tĩnh) và "phương thức cá thể". Vì vậy, họ vẫn còn tất cả các phương pháp.
xji

15
Java có các biểu thức lambda, là các hàm không phải là phương thức
Max Heiber 7/1/2016

228

'Phương thức' là từ hướng đối tượng cho 'hàm' . Đó là khá nhiều tất cả để có nó (tức là, 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 đang tồn tại 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ó gì nhiều với nó, chỉ là những từ khác nhau cho cùng một thứ.

[bổ sung muộn]


Trên thực tế, như Brian Neal đã chỉ ra trong một bình luận cho câu hỏi này , tiêu chuẩn C ++ không bao giờ sử dụng thuật ngữ 'phương pháp' khi đề cập đến các chức năng thành viên. Một số người có thể coi đó là một 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 coi đó là 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.


14
Phương thức là một loại hàm đặc biệt với một đối số ngầm được thông qua (một thể hiện của lớp mà phương thức được định nghĩa trên). Điều này quan trọng như là một hàm, theo các thuật ngữ 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

4
@ ty1824 không phải lúc nào các phương thức cũng được thông qua các đối số ngầm. 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 thông qua một thể hiện.
Max Heiber

1
@mheiber đó là một số điểm hợp lệ. Liên quan đến bản thân, bạn là chính xác, nó được xác định rõ ràng . Điều quan trọng là cuộc gọi được ẩn, dựa trên tham chiếu đối tượng ban đầu. Có những ngôn ngữ hỗ trợ ghi đè một thishoặc self, nhưng những cấu trúc đó thường được gọi là các hàm, thay vì các phương thức.
ty1824

1
@mheiber Theo như các phương thức tĩnh có liên quan - java đã triển khai chúng như một cách giải quyết để các chức năng có thể được thực hiện mà không yêu cầu bối cảnh. Tôi sẽ đi xa hơn để đề xuất rằng 'phương pháp tĩnh' là một thuật ngữ sai lệch và nên được thay thế ... trong một thế giới lý thuyết lý tưởng :)
ty1824

1
@ 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 thứ Java. Tôi cũng không thích chúng: chúng sử dụng các đối tượng (bó trạng thái) như thể chúng là không gian tên.
Max Heiber

99

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 nào khác của mã để bạn có thể nói rằng tất cả các phương thức 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ụ về con trăn sau:

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

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

knock_door()

Ví dụ đư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 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 bên dưới định nghĩa hàm, đó là hàm vì nó không được khai báo bên trong một 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 có thể thấy và cuối cùng là hàm được gọi bởi chính nó.

Như bạn có thể thấy, bạn có thể gọi một hàm ở bất cứ đâu nhưng nếu bạn muốn gọi một phương thức hoặc bạn phải truyền một đối tượng mới cùng loại 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 nghĩ về các phương thức như những điều mà chỉ một thực thể có thể làm, vì vậy nếu bạn có một lớp Dog thì sẽ chỉ có chức năng vỏ cây trong lớp đó và đó sẽ là một phương thức, nếu bạn cũng có một lớp Person thì nó có thể có ý nghĩa viết một hàm "feed" cho cái đó 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 đó là hàm vì nó không thuộc về bất kỳ lớp nào.


2
Câu trả lời này --- chủ yếu là câu đầu tiên của nó --- cho đến nay là câu trả lời ngắn gọn nhất và tổng thể nhất cho câu hỏi.
bạn

61

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

  • F bôi → F ree (miễn phí có nghĩa là không thuộc về một đối tượng hoặc lớp)
  • M ethod → M ember (Một thành viên của một đối tượng hoặc lớp)

vì thường có thể hoán đổi cho nhau, tại sao bạn cần ghi nhớ?
Sapphire_Brick

44

Một định nghĩa rất chung về sự khác biệt chính giữa HàmPhương thức :

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.


30

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

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

Đố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 nếu chúng tôi 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.

Rằng "whatAreYouDending" là một "thông điệp" được gửi đến đối tượng. Đối tượng biết cách trả lời các câu hỏi đó, người ta nói rằng nó có một "phương pháp" để giải quyết câu hỏi.

Vì vậy, cách các đối tượng phải phơi bày hành vi của nó được gọi là phương thức. Do đó, các phương thức là đối tượng giả tạo 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ân vân.

Mặt khác, các hàm là cách mà 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, nên chúng chỉ gọi 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;
}

Không phải là "tự nhiên" khi nói một đối tượng có "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 các công cụ toán học trong khi Nhân viên có ít toán học về nó, nhưng bạn có thể có các phương thức thực hiện chính xác như các 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;
}

Trông quen quen? Điều đó vì Java có nguồn gốc từ C ++ và C ++ trên C.

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

Đây là một ví dụ về đối tượng Nhân viên trước đây 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 là, trên "miền" nơi nó được áp dụng.

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

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


3
Bravo! Giải thích rõ ràng về cách các phương thức là lệnh cho các đối tượng. Đây là chìa khóa để hiểu OO và việc thiếu những lời hoa mỹ mà bạn thể hiện trong câu trả lời này là lý do tại sao OO bị lạm dụng trong ngành công nghiệp ngày nay. Tuyệt vời bài.
moffdub

18

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

Từ phối cảnh Toán học và CS thuần túy, một hàm sẽ luôn trả về cùng một kết quả khi được gọi với cùng các đối số (f (x, y) = (x + y)). Mặt khác, một phương thức thường được liên kết với một thể hiện 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ữ "hàm" 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).


17

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

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, sẽ đúng hơn khi 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 có nghĩa là bạn tham chiếu 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 ()".

Thông thường các phương thức cũng có được một số thuộc tính bổ sung mô tả hành vi của chúng trong đối tượng / lớp, ví dụ: mức độ hiển thị (liên quan đến khái niệm đóng gói hướng đối tượng) xác định từ đó các đối tượng (hoặc lớp) mà phương thức 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.


1
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 các 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 và không phải các lớp (mặc dù các cấu trúc tương tự các lớp tồn tại).
Mike Tunnicliffe

15

Phương thức là chức năng của các lớp. Trong thuật ngữ bình thường, mọi người trao đổi phương thức và chức năng tất cả. Về cơ bản, bạn có thể nghĩ về chúng như một điều tương tự (không chắc các hàm toàn cầu có được gọi là phương thức không).

http://en.wikipedia.org/wiki/Method_(computer_science)


13

Một 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ó một thuộc tính khác: tất cả các lệnh gọi đến một hàm có cùng tham số, sẽ trả về cùng một kết quả.

Mặt khác, một phương thức là một hàm có liên quan đến một đối tượng trong ngôn ngữ hướng đối tượng. Nó có một tham số ngầm định: đối tượng được hành độ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 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ị sống bên trong đối tượng Z. Z và dữ liệu sống bên trong nó (Zy) là các tham số ngầm định cho phương thức g () của Z.


13

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

Trong ngôn ngữ C , hàm hạn được sử dụng. Người dùng Java & C # 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).

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

Bạn sử dụng một chức năng bằng cách chỉ gọi tên của 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 như,

result = MyCalc.mySum(num1,num2);

13

Trong lịch sử, có thể có một sự khác biệt tinh tế với một "phương thức" là một thứ không trả về giá trị và một "hàm" nào đó. Ngôn ngữ này có từ vựng riêng có nghĩa đặc biệt.

Trong "C" , từ "hàm" có nghĩa là một thói quen của chương trình .

Trong Java , thuật ngữ "hàm" không có bất kỳ ý nghĩa đặc biệt nào. Trong khi đó "phương thức" có nghĩa là một trong những thói quen hình thành nên việc thực hiện một lớp.

Trong C # sẽ dịch là:

public void DoSomething() {} // method
public int DoSomethingAndReturnMeANumber(){} // function

Nhưng thực sự, tôi nhắc lại rằng thực sự không có sự khác biệt trong 2 khái niệm. Nếu bạn sử dụng thuật ngữ "hàm" trong các cuộc thảo luận không chính thức về Java, mọi người sẽ cho rằng bạn có nghĩa là "phương thức" và tiếp tục. Đừng sử dụng nó trong các tài liệu hoặc bài thuyết trình thích hợp về Java, nếu không bạn sẽ trông thật ngớ ngẩn.


Trên thực tế, trong ví dụ của bạn cả hai là method... hoặc tôi sẽ gọi nó procedurefunction.
Yousha Aleayoub

9

Chức năng là một tập hợp logic có thể được sử dụng để thao tác dữ liệu.

Trong khi, Phương thức là hàm được sử dụng để thao tác dữ liệu của đối tượng nơi nó thuộc về. Vì vậy, về mặt kỹ thuật, nếu bạn có một hàm không hoàn toàn liên quan đến lớp của bạn nhưng được khai báo trong lớp, thì đó không phải là một phương thức; Nó được gọi là một thiết kế xấu.


8

Các phương thức trên một lớp hoạt động theo thể hiện của lớp, được gọi là đối tượng.

class Example
{
   public int data = 0; // Each instance of Example holds its internal data. This is a "field", or "member variable".

   public void UpdateData() // .. and manipulates it (This is a method by the way)
   {
      data = data + 1;
   }

   public void PrintData() // This is also a method
   {
      Console.WriteLine(data);
   }
}

class Program
{
   public static void Main()
   {
       Example exampleObject1 = new Example();
       Example exampleObject2 = new Example();

       exampleObject1.UpdateData();
       exampleObject1.UpdateData();

       exampleObject2.UpdateData();

       exampleObject1.PrintData(); // Prints "2"
       exampleObject2.PrintData(); // Prints "1"
   }
}

8

Trong các ngôn ngữ OO như Object Pascal hoặc C ++, "phương thức" là một hàm được liên kết với một đối tượng. Vì vậy, ví dụ, một đối tượng "Dog" có thể có chức năng "sủa" và điều này sẽ được coi là "Phương thức". Ngược lại, hàm "StrLen" đứng độc lập (nó cung cấp độ dài của chuỗi được cung cấp dưới dạng đối số). Do đó, nó chỉ là một "chức năng." Javascript cũng hướng đối tượng về mặt kỹ thuật nhưng phải đối mặt với nhiều hạn chế so với ngôn ngữ toàn diện như C ++, C # hoặc Pascal. Tuy nhiên, sự phân biệt vẫn nên giữ.

Một vài sự thật bổ sung: C # hoàn toàn hướng đối tượng để bạn không thể tạo các "hàm" độc lập. Trong C #, mọi hàm được liên kết với một đối tượng và do đó, về mặt kỹ thuật, là một "phương thức". Các kicker là rất ít người trong C # gọi chúng là "phương thức" - họ chỉ sử dụng thuật ngữ "hàm" bởi vì không có sự phân biệt thực sự nào được thực hiện.

Cuối cùng - chỉ để bất kỳ bậc thầy về Pascal nào không nhảy vào tôi ở đây - Pascal cũng phân biệt giữa "hàm" (trả về giá trị) và "thủ tục" không. C # không thực hiện phân biệt này một cách rõ ràng mặc dù dĩ nhiên, bạn có thể chọn trả về giá trị hay không.


8

Vì bạn đã đề cập đến Python, sau đây có thể là một minh họa hữu ích về mối quan hệ giữa các phương thức và đối tượng trong hầu hết các ngôn ngữ hướng đối tượng hiện đại. Tóm lại, cái mà họ gọi là "phương thức" chỉ là một hàm được thông qua một đối số phụ (như các câu trả lời khác đã chỉ ra), nhưng Python làm cho nó rõ ràng hơn hầu hết các ngôn ngữ.

# perfectly normal function
def hello(greetee):
  print "Hello", greetee

# generalise a bit (still a function though)
def greet(greeting, greetee):
  print greeting, greetee

# hide the greeting behind a layer of abstraction (still a function!)
def greet_with_greeter(greeter, greetee):
  print greeter.greeting, greetee

# very simple class we can pass to greet_with_greeter
class Greeter(object):
  def __init__(self, greeting):
    self.greeting = greeting

  # while we're at it, here's a method that uses self.greeting...
  def greet(self, greetee):
    print self.greeting, greetee

# save an object of class Greeter for later
hello_greeter = Greeter("Hello")

# now all of the following print the same message
hello("World")
greet("Hello", "World")
greet_with_greeter(hello_greeter, "World")
hello_greeter.greet("World")

Bây giờ so sánh hàm greet_with_greetervà phương thức greet: sự khác biệt duy nhất là tên của tham số đầu tiên (trong hàm tôi gọi nó là "lời chào", trong phương thức tôi gọi nó là "tự"). Vì vậy, tôi có thể sử dụng greetphương thức theo cách chính xác giống như tôi sử dụng greet_with_greeterhàm (sử dụng cú pháp "dấu chấm" để lấy nó, vì tôi đã định nghĩa nó trong một lớp):

Greeter.greet(hello_greeter, "World")

Vì vậy, tôi đã biến một phương thức thành một hàm một cách hiệu quả. Tôi có thể biến một hàm thành một phương thức không? Chà, vì Python cho phép bạn gây rối với các lớp sau khi chúng được xác định, hãy thử:

Greeter.greet2 = greet_with_greeter
hello_greeter.greet2("World")

Vâng, chức năng greet_with_greeterbây giờ còn được gọi là phương thức greet2. Điều này cho thấy sự khác biệt thực sự duy nhất giữa một phương thức và một hàm: khi bạn gọi một phương thức "bật" một đối tượng bằng cách gọi object.method(args), ngôn ngữ sẽ biến nó thành một cách kỳ diệu method(object, args).

(Những người theo chủ nghĩa thuần túy OO có thể cho rằng một phương thức khác với hàm và nếu bạn vào Python hoặc Ruby nâng cao - hoặc Smalltalk! - bạn sẽ bắt đầu thấy quan điểm của họ. Ngoài ra, một số ngôn ngữ cung cấp cho phương thức quyền truy cập đặc biệt vào các bit của đối tượng. Nhưng sự khác biệt về khái niệm chính vẫn là tham số phụ ẩn.)


7

đối với tôi: chức năng của một phương thức và một chức năng là như nhau nếu tôi đồng ý rằng:

  • một hàm có thể trả về một giá trị
  • có thể mong đợi các thông số

Giống như bất kỳ đoạn mã nào bạn có thể có các đối tượng bạn đặt vào và bạn có thể có một đối tượng đi kèm. Trong khi làm điều đó họ có thể thay đổi trạng thái của một đối tượng nhưng điều đó sẽ không thay đổi chức năng cơ bản của họ đối với tôi.

Có thể có một định nghĩa khác nhau trong chức năng gọi của các đối tượng hoặc các mã khác. Nhưng đó không phải là thứ gì đó cho sự khác biệt bằng lời nói và đó là lý do tại sao mọi người trao đổi chúng? Các ví dụ đề cập đến tính toán tôi sẽ cẩn thận với. bởi vì tôi thuê người làm để tính toán:

new Employer().calculateSum( 8, 8 );

Bằng cách đó, tôi có thể dựa vào một chủ nhân chịu trách nhiệm tính toán. Nếu anh ta muốn có nhiều tiền hơn, tôi giải phóng anh ta và để cho người thu gom rác có chức năng xử lý những nhân viên không sử dụng làm phần còn lại và nhận một nhân viên mới.

Ngay cả lập luận rằng một phương thức là một hàm đối tượng và một hàm là tính toán không được kết nối sẽ không giúp tôi. Bản thân bộ mô tả hàm và lý tưởng là tài liệu của hàm sẽ cho tôi biết những gì nó cần và những gì nó có thể trả về. Phần còn lại, như thao túng trạng thái của một số đối tượng không thực sự minh bạch đối với tôi. Tôi thực sự mong đợi cả chức năng và phương thức cung cấp và thao tác những gì họ yêu cầu mà không cần phải biết chi tiết cách họ thực hiện. Ngay cả một hàm tính toán thuần túy cũng có thể thay đổi trạng thái của giao diện điều khiển hoặc nối vào logfile.


5

Chúng ta đừng quá phức tạp những gì nên là một câu trả lời rất đơn giản. Phương pháp và chức năng là cùng một điều. Bạn gọi một hàm là một hàm khi nó nằm ngoài một lớp và bạn gọi một hàm là một phương thức khi nó được viết bên trong một lớp.


4

Theo hiểu biết của tôi, một phương thức là bất kỳ hoạt động nào có thể được thực hiện trên một lớp. Nó là một thuật ngữ chung được sử dụng trong lập trình.

Trong nhiều ngôn ngữ, các phương thức được biểu diễn bởi các hàm và chương trình con. Sự khác biệt chính mà hầu hết các ngôn ngữ sử dụng cho các ngôn ngữ này là các hàm có thể trả lại giá trị cho người gọi và chương trình con có thể không. Tuy nhiên, nhiều ngôn ngữ hiện đại chỉ có chức năng, nhưng chúng không thể trả về bất kỳ giá trị nào.

Ví dụ: giả sử bạn muốn mô tả một con mèo và bạn muốn điều đó có thể ngáp. Bạn sẽ tạo một lớp Cat, với phương thức Ngáp, rất có thể là một hàm không có giá trị trả về.


4

Theo một xấp xỉ thứ tự đầu tiên, một phương thức (theo kiểu CO OO) là một từ khác cho một hàm thành viên, đó là một hàm là một phần của một lớp.

Trong các ngôn ngữ như C / C ++, bạn có thể có các hàm không phải là thành viên của một lớp; bạn không gọi một hàm không liên quan đến một lớp là một phương thức.


4

Hàm là khái niệm chủ yếu thuộc về lập trình hướng thủ tục trong đó hàm là một thực thể có thể xử lý dữ liệu và trả về giá trị cho bạn

Phương thức là khái niệm về lập trình hướng đối tượng trong đó phương thức là thành viên của lớp mà phần lớn thực hiện xử lý trên các thành viên của lớp.


3

Người IMHO chỉ muốn phát minh ra từ mới để giao tiếp dễ dàng hơn giữa các lập trình viên khi họ muốn đề cập đến các chức năng bên trong các đối tượng.

Nếu bạn đang nói các phương thức, bạn có nghĩa là các hàm bên trong lớp. Nếu bạn đang nói các hàm, bạn có nghĩa là các hàm đơn giản bên ngoài lớp.

Sự thật là cả hai từ được sử dụng để mô tả chức năng. Ngay cả khi bạn sử dụng sai, không có gì sai xảy ra. Cả hai từ mô tả tốt những gì bạn muốn đạt được trong mã của bạn.

Chức năng là một mã phải đóng một vai trò ( một chức năng ) để làm một cái gì đó. Phương pháp là một phương pháp để giải quyết vấn đề.

Nó làm điều tương tự. Đó là điều tương tự. Nếu bạn muốn siêu chính xác và tuân theo quy ước, bạn có thể gọi các phương thức là các hàm bên trong các đối tượng.


2

Tôi không phải là một chuyên gia, nhưng đây là những gì tôi biết:

  1. Hàm là thuật ngữ ngôn ngữ C, nó dùng để chỉ một đoạn mã và tên hàm sẽ là định danh để sử dụng hàm này.

  2. Phương thức là thuật ngữ OO, thông thường nó có một con trỏ này trong tham số hàm. Bạn không thể gọi đoạn mã này như C, bạn cần sử dụng đối tượng để gọi nó.

  3. Các phương thức gọi cũng khác nhau. Ở đây gọi ý nghĩa để tìm địa chỉ của đoạn mã này. C / C ++, thời gian liên kết sẽ sử dụng ký hiệu hàm để định vị.

  4. Objecive-C thì khác. Gọi hàm C để sử dụng cấu trúc dữ liệu để tìm địa chỉ. Nó có nghĩa là tất cả mọi thứ được biết đến trong thời gian chạy.


2

Tôi biết nhiều người khác đã trả lời, nhưng tôi thấy sau đây là một câu trả lời đơn giản nhưng hiệu quả. Mặc dù nó không tốt hơn nhiều so với câu trả lời của người khác ở đây, nhưng nếu bạn đọc kỹ, nó có mọi thứ bạn cần biết về phương thức vs hàm.

Phương thức là một hàm có một máy thu được xác định, theo thuật ngữ OOP, phương thức là một hàm trên một thể hiện của một đối tượng.


2

Sự khác biệt giữa phương thức và chức năng

Từ việc đọc tài liệu này trên Microsoft

Các thành viên có chứa mã thực thi được gọi chung là các thành viên chức năng của một lớp. Phần trước mô tả các phương thức, là loại thành viên chính của hàm. Phần này mô tả các loại thành viên chức năng khác được hỗ trợ bởi C #: constructor, thuộc tính, bộ chỉ mục, sự kiện, toán tử và bộ hoàn thiện.

Vì vậy, các phương thức là tập hợp con của các hàm. Mọi phương thức là một hàm nhưng không phải mọi hàm đều là một phương thức, ví dụ, constructorkhông thể nói là một phương thức mà nó là một hàm.


Thuộc tính, chỉ mục và sự kiện không phải là chức năng. Các getters, setters (cho các thuộc tính và bộ chỉ mục), bộ cộng và tẩy trang (cho các sự kiện) là các chức năng. Các thành viên chức năng là các thành viên được liên kết với một hoặc nhiều chức năng, nhưng không nhất thiết phải là một chức năng.
Jon Hanna

2

Hàm - Một hàm trong một đoạn mã độc lập bao gồm một số logic và phải được gọi độc lập và được định nghĩa bên ngoài lớp.

Phương thức - Phương thức là một đoạn mã độc lập được gọi trong tham chiếu đến một số đối tượng và được định nghĩa bên trong lớp.


Bạn gọi một đoạn mã trong một lớp tĩnh, cũng là tĩnh, đây là phương thức hay hàm? Một hàm / phương thức tĩnh của một lớp không cần một đối tượng của lớp mà nó được khai báo.
Wolfgang Roth

1

Dưới đây là một số giải thích cho phương thức so với chức năng sử dụng các ví dụ JavaScript:

test(20, 50); là chức năng xác định và sử dụng để chạy một số bước hoặc trả lại một cái gì đó có thể được lưu trữ / sử dụng ở đâu đó.

Bạn có thể sử dụng lại mã: Xác định mã một lần và sử dụng nhiều lần.

Bạn có thể sử dụng cùng một mã nhiều lần với các đối số khác nhau, để tạo ra các kết quả khác nhau.

var x = myFunction(4, 3);   // Function is called, return value will end up in x

function myFunction(a, b) {
    return a * b;          // Function returns the product of a and b
}

var test = something.test(); ở đây test () có thể là một phương thức của một số đối tượng hoặc tùy chỉnh được xác định một nguyên mẫu cho các đối tượng sẵn có, đây là giải thích thêm:

Các phương thức JavaScript là các hành động có thể được thực hiện trên các đối tượng.

Phương thức JavaScript là thuộc tính chứa định nghĩa hàm.

Thuộc tính / phương thức tích hợp cho chuỗi trong javascript:

var message = "Hello world!";
var x = message.toUpperCase();
//Output: HELLO WORLD!

Ví dụ tùy chỉnh:

function person(firstName, lastName, age, eyeColor) {
    this.firstName = firstName;  
    this.lastName = lastName;
    this.age = age;
    this.eyeColor = eyeColor;
    this.changeName = function (name) {
        this.lastName = name;
    };
}

something.changeName("SomeName"); //This will change 'something' objject's name to 'SomeName'

Bạn cũng có thể định nghĩa các thuộc tính cho String, Array, v.v.

String.prototype.distance = function (char) {
    var index = this.indexOf(char);

    if (index === -1) {
        console.log(char + " does not appear in " + this);
    } else {
        console.log(char + " is " + (this.length - index) + " characters from the end of the string!");
    }
};

var something = "ThisIsSomeString"

// now use distance like this, run and check console log

something.distance("m");

Một số tài liệu tham khảo: Phương pháp đối tượng Javascript , Hàm , Thông tin thêm về nguyên mẫu


Xin vui lòng không gửi câu trả lời giống hệt nhau cho nhiều câu hỏi. Đăng một câu trả lời hay, sau đó bỏ phiếu / gắn cờ để đóng các câu hỏi khác dưới dạng trùng lặp. Nếu câu hỏi không trùng lặp, điều chỉnh câu trả lời của bạn cho câu hỏi.
Paul Roub

Cảm ơn bạn đã phản hồi, tôi đã không điều chỉnh câu trả lời khác, tôi đã xóa anwer đó. :-)
Lahar Shah

1

TL; DR

Hàm là một đoạn mã để chạy.
Phương thức là một Hàm bên trong một đối tượng.

Ví dụ về hàm:


function sum(){
  console.log("sum")l
}

Ví dụ về một Phương thức:

const obj = {
a:1,
b:2,
sum(){
  }
}

Vì vậy, đó là lý do tại sao chúng ta nói rằng từ khóa "này" bên trong Hàm không hữu ích trừ khi chúng ta sử dụng nó với cuộc gọi, áp dụng hoặc liên kết .. bởi vì gọi, áp dụng, liên kết sẽ gọi hàm đó như một phương thức bên trong đối tượng ==> về cơ bản nó chuyển đổi chức năng thành phương thức


1

Chúng thường có thể hoán đổi cho nhau, nhưng một phương thức thường đề cập đến một chương trình con bên trong một lớp và một hàm thường đề cập đến một chương trình con bên ngoài lớp. ví dụ, trong Ruby:

# function
def putSqr(a)
   puts a ** 2
end


class Math2
   # method
   def putSqr(a)
      puts a ** 2
   end
end

Trong Java, nơi mọi thứ (ngoại trừ các câu lệnh đóng gói và nhập khẩu) phải nằm trong lớp, mọi người hầu như luôn gọi chúng là "phương thức".

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.