web-dev-qa-db-ja.com

メソッドと関数の違いは何ですか?

OOPコンテキストで誰かが メソッド vs. 関数 の簡単な説明を提供できますか?

1588
willc2

function は、名前で呼ばれるコードです。それは操作するためのデータ(すなわちパラメータ)を渡すことができ、オプションでデータ(戻り値)を返すことができます。関数に渡されるすべてのデータは明示的に渡されます。

method は、オブジェクトに関連付けられている名前によって呼び出されるコードです。ほとんどの点で、2つの主な違いを除いて関数と同じです。

  1. メソッドは、それが呼び出されたオブジェクトを暗黙的に渡されます。
  2. メソッドはクラス内に含まれるデータを操作することができます(オブジェクトはクラスのインスタンスであることを思い出してください - クラスは定義であり、オブジェクトはそのデータのインスタンスです)。

(これは scope などの問題を無視した簡単な説明です)

1619

メソッドはオブジェクト上にあります。
機能はオブジェクトから独立しています。 

Javaにはメソッドしかありません。
Cには関数しかありません。

C++の場合、それはあなたがクラスにいるかどうかによって異なります。

899
Aaron

'method' は、 'function' のオブジェクト指向Wordです。それだけです(つまり、実質的な違いはありません)。

残念ながら、ここでの答えの多くは、複雑で意味のある違いがいくつかあるという考えを永続させているか、あるいは進めていると思います。

本当に - それほど多くのことはありません、同じことを表すための異なる言葉だけです。

【追記】


実際、 この質問 へのコメントで Brian Neal が指摘したように、C++標準はメンバー関数を参照するときに 'メソッド'という用語を使用することはありません。 C++が実際にはオブジェクト指向言語ではないことを示していると考える人もいるかもしれません。しかし、私は、かなり賢い人々のグループが、異なる用語を使用することに特に強い理由があるとは思わなかったことを示唆するものとしてそれを採用することを好みます。

190
Michael Burr

一般的に、メソッドはクラスに属する関数であり、関数はコードの他のどの範囲にも存在できるため、すべてのメソッドが関数であると言えるかもしれませんが、すべての関数がメソッドであるわけではありません。

次のPythonの例を見てください。

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

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

knock_door()

与えられた例はあなたに "open"と呼ばれるメソッドまたはアクションを持つ "Door"と呼ばれるクラスを示します、それはクラスの中で宣言されたのでそれはメソッドと呼ばれます。その下に "def"を含む関数を定義するコードの別の部分があります。これはクラス内で宣言されていないため関数です。この関数は、クラス内で定義されたメソッドを呼び出します。それ自身で呼ばれます。

ご覧のとおり、どこでも関数を呼び出すことができますが、メソッドを呼び出したい場合は、そのクラスが宣言されているのと同じ型の新しいオブジェクト(Class.method(object))を渡すか、呼び出す必要があります。少なくともpythonでは、オブジェクト内のメソッド(object.Method())。

メソッドは1つのエンティティしか実行できないものと考えることができます。そのため、Dogクラスがある場合はそのクラス内にのみ樹皮関数があり、Personクラスがある場合はメソッドになります。人間と犬の両方を養うことができるのでそのための関数 "feed"を書くことはどのクラスにも属さず、あなたはそれが特にどのクラスにも属さないのでその関数を呼ぶことができます。

88
Gustavo Rubio

Function Method の主な違いのごく一般的な定義:

関数はクラスの外側で定義され、メソッドはクラスの内側およびその一部で定義されます。

39
Elenasys

覚える簡単な方法:

  • _ f _ unction→ _ f _ ree(Freeはオブジェクトやクラスに属さないことを意味します)
  • _ m _ ethod→ _ m _ ember(オブジェクトまたはクラスのメンバ)
37
Duc Filan

あなたがここに読んでみたいのであれば、「OOメソッドの紹介」です。

オブジェクト指向のパラダイムの背後にある考え方は、ソフトウェアが「オブジェクト」で構成されていることを「脅かす」ことです。実社会のオブジェクトにはプロパティがあります。たとえば、従業員がいる場合、その従業員には名前、従業員ID、役職、部署などに所属しています。 

オブジェクトはまた、その属性を処理し、それらに対していくつかの操作を実行する方法も知っています。従業員が今何をしているのか知りたいのであれば、彼に尋ねるとしましょう。

employe whatAreYouDoing.

その「whatAreYouDoing」はオブジェクトに送信される「メッセージ」です。オブジェクトはその質問にどう答えるかを知っています、それはそれが質問を解決するための「方法」を持っていると言われています。

そのため、オブジェクトがその動作を公開する方法はメソッドと呼ばれます。したがって、メソッドはアーティファクトオブジェクトが何かを「やる」必要があります。 

他の可能な方法は 

employee whatIsYourName
employee whatIsYourDepartmentsName

等.

一方、関数はプログラミング言語がデータを計算する方法です。例えば、関数addValues(8、8)を使って16を返すことができます。

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

最初のポピュラーなプログラミング言語(Fortran、c、Pascalなど)はOOパラダイムをカバーしていなかったので、それらはこれらのアーティファクト "関数"を呼び出すだけです。

たとえば、Cの以前の関数は次のようになります。

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

関数は数学的なものに関連しているのに対し、Employeeはそれについて数学的なことをほとんどしていないので、オブジェクトが何らかのアクションを実行するための「関数」を持つと言うのは「自然」ではありませんたとえばJavaでは、これは同等のaddValues関数になります。

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

おなじみの?これは、JavaがC++とC++のルーツを持っているからです。

最後は単なる概念です。実装上は同じに見えるかもしれませんが、OOのドキュメントではこれらはmethodと呼ばれています。

これは、以前のJavaのEmployeeオブジェクトの例です。

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.

違いは、それが適用される「ドメイン」にあります。

AppleScriptには、ある時点でOOが持っていた「自然言語」の格言という概念があります。例えばSmalltalkです。これを読んだ後は、オブジェクト内のメソッドを理解した方が合理的に簡単であることを願います。

注:コードはコンパイルされていません。単なる例として機能します。投稿を修正してPythonの例を追加してください。

27
OscarRyz

OOの世界では、ふたつは同じことを意味するのに使われています。 

純粋なMath and CSの観点からは、同じ引数(f(x、y)=(x + y))を指定して呼び出すと、関数は常に同じ結果を返します。一方、メソッドは通常、クラスのインスタンスに関連付けられています。しかし、やはり、最近のほとんどのOO言語では、もはや「関数」という用語をほとんど使用していません。多くの静的メソッドは、通常は状態を持たない(常に真であるとは限らない)ので、関数に非常に似ている可能性があります。

17
TheSoftwareJedi

関数は、いくつかの引数を受け取り、結果を返す可能性があるコードブロック(通常は独自のスコープを持ち、場合によっては独自のクロージャを持つ)であるとしましょう。

メソッドは、オブジェクトによって所有される関数です(一部のオブジェクト指向システムでは、クラスによって所有されると言う方がより正確です)。オブジェクト/クラスに「所有」されているということは、オブジェクト/クラスを通してメソッドを参照するということです。たとえば、Javaでは、オブジェクト「door」が所有するメソッド「open()」を呼び出したい場合は、「door.open()」と記述する必要があります。 

通常、メソッドは、オブジェクト/クラス内での動作を説明するいくつかの追加の属性も取得します。たとえば、メソッドを呼び出すことができるオブジェクト(またはクラス)から定義する可視性(オブジェクト指向のカプセル化の概念に関連).

多くのオブジェクト指向言語では、すべての「関数」が何らかのオブジェクト(またはクラス)に属しているため、これらの言語ではメソッドではない関数はありません。

15

関数またはメソッドは、いくつかの操作を実行し、オプションで値を返す、名前付きの呼び出し可能なコードです。 

_ c _ languageでは、functionという用語が使用されます。 Java C# 人はそれをメソッドと言うでしょう(そしてこの場合の関数はクラス/オブジェクトの中で定義されます)。

C++ プログラマーはそれを関数と呼ぶこともあればメソッドと呼ぶこともあります(手続き型のC++コードを書いているかC++のオブジェクト指向の方法を使っているかによって'method'は、C/C++の文献ではあまり使われていません。

次のように名前を呼ぶだけで関数を使うことができます。

result = mySum(num1, num2);


最初にそのオブジェクトを参照することでメソッドを呼び出すでしょう。

result = MyCalc.mySum(num1,num2);
12

関数は数学的概念です。例えば:

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

関数f()が、2番目のパラメータの余弦に追加された最初のパラメータのsinを返すと言っています。それはただの数学です。たまたまsin()とcos()も関数です。関数には別のプロパティがあります。同じパラメータを使って関数を呼び出すと、すべて同じ結果が返されるはずです。

一方、メソッドは、オブジェクト指向言語のオブジェクトに関連する関数です。それは1つの暗黙のパラメータを持っています。それは対象となるオブジェクトです(そしてそれは状態です)。

したがって、メソッドg(x)を持つオブジェクトZがあると、次のようになります。

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

この場合、前の関数の例と同じように、パラメータxが渡されます。ただし、cos()のパラメータはオブジェクトZの内部にある値です。Zとその内部のデータ(Z.y)は、Zのg()メソッドの暗黙のパラメータです。

12
Bradley Mazurek

歴史的に、値を返さない「メソッド」と値を返す「関数」との微妙な違いがあったかもしれません。各言語には独自の用語の語彙が特別な意味を持っています。

"C"では、Word "function"プログラムルーチンを意味します。

Javaでは、"function"という用語には特別な意味はありません。一方、"method"は、クラスの実装を形成するルーチンの1つを意味します。

C#では、次のように変換されます。

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

しかし、実際には、2つの概念に実際には違いがないことを繰り返します。 Javaについての非公式の議論で「関数」という用語を使用する場合、人々は「メソッド」を意味していると見なし、続けます。 Javaに関する適切なドキュメントやプレゼンテーションで使用しないでください。

12
Jaimin Patel

メソッドはクラスの機能です。通常の専門用語では、人々が方法や機能をくまなく交換しています。基本的には、それらを同じものと考えることができます(グローバル関数がメソッドと呼ばれるかどうかわからない)。

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

11
Statement

クラスのメソッドは、オブジェクトと呼ばれるクラスのインスタンスに作用します。 

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
Statement

Object PascalやC++などのOO言語では、「メソッド」はオブジェクトに関連付けられた関数です。したがって、たとえば、 "Dog"オブジェクトには "bark"関数があり、これは "Method"と見なされます。対照的に、 "StrLen"関数は独立しています(引数として提供される文字列の長さを提供します)。したがって、それは just "関数"です。 Javascriptも技術的にはオブジェクト指向ですが、C++、C#、Pascalなどの本格的な言語と比べて多くの制限があります。それにもかかわらず、区別はまだ成り立ちます。

その他の事実:C#は完全にオブジェクト指向なので、スタンドアロンの "関数"を作成することはできません。 C#では、すべての関数はオブジェクトにバインドされているため、技術的には「メソッド」です。キッカーは、C#のほとんどの人がそれらを「メソッド」と呼んでいないということです - 本当の区別はないので、彼らは単に「関数」という用語を使用します。

最後に - Pascalのどの教祖もここで私を飛び越えないように - Pascalはまた「関数」(値を返す)と「手続き」を区別しません。 C#はこの区別を明確にしていませんが、もちろん値を返すかどうかを選択できます。 

8

関数は、データを操作するために使用できる一連のロジックです。

Methodは、それが属するオブジェクトのデータを操作するために使用される関数です。したがって、厳密には自分のクラスに完全には関連しないがクラス内で宣言された関数がある場合方法;それは悪いデザインと呼ばれています。

8
gian ebao

Pythonについて触れたので、以下は、ほとんどの現代のオブジェクト指向言語におけるメソッドとオブジェクトの間の関係を示す便利な例です。一言で言えば、彼らが「メソッド」と呼ぶものは、(他の答えが指摘したように)余分な引数を渡される単なる関数ですが、Pythonはそれをほとんどの言語よりも明確にします。

# 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")

それでは、関数greet_with_greeterとメソッドgreetを比較してください。唯一の違いは最初のパラメータの名前です(関数内では "greeter"、私は "self"と呼びました)。それで、私はgreet_with_greeter関数を使うのと全く同じ方法でgreetメソッドを使うことができます(それを取得するために "dot"構文を使います、それは私がクラスの中で定義したので)

Greeter.greet(hello_greeter, "World")

だから私は効果的にメソッドを関数に変えました。関数をメソッドに変えることはできますか?さて、Pythonはクラスが定義された後にそれを台無しにすることができるので、試してみましょう:

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

はい、関数greet_with_greeterは現在メソッドgreet2としても知られています。これは、メソッドと関数の唯一の本当の違いを示しています。object.method(args)を呼び出してオブジェクト上のメソッドを呼び出すと、言語はそれをmethod(object, args)に魔法のように変換します。

(オブジェクト指向の純粋主義者は、メソッドは関数とは異なるものだと主張するかもしれず、もしあなたが高度なPythonやRuby、あるいはSmalltalk!に着手するなら、あなたはそれらの要点を理解し始めるでしょう。主な概念上の違いはまだ隠された追加パラメータです。)

8
Sam Stokes

私のために:メソッドの機能と機能は、私が以下のことに同意すれば同じです。

  • 関数は値を返す
  • パラメータを期待できます

他のコードと同じように、自分が入れるオブジェクトを持っているかもしれませんし、結果として来るオブジェクトを持っているかもしれません。それをしている間彼らは物の状態を変えるかもしれませんが、それは私のために彼らの基本的な機能を変えないでしょう。

オブジェクトや他のコードの関数を呼び出す際に異なる定義があるかもしれません。しかし、それは言葉による区別のためのものではないので、人々がそれらを交換するのはなぜですか?言及している計算の例は私が注意するでしょう。私は計算をするために雇用者を雇うからです。

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

そのようにすることによって、私は計算に責任がある雇用主に頼ることができます。彼がもっとお金を欲しがったら私は彼を解放し、未使用の従業員を処分するCarbage Collectorの機能に残りをさせて新しい従業員を得るようにさせる。

メソッドはオブジェクト関数で関数は接続されていない計算であると主張しても私には役に立ちません。関数記述子自体、そして理想的には関数のドキュメンテーションは私がそれが必要としているものとそれが返すかもしれないものを教えてくれるでしょう。他のオブジェクトの状態を操作するのと同じように、それ以外の部分は私にはあまりわかりません。関数とメソッドの両方が、それらがどのようにしてそれを行うのかを詳細に知る必要なしに、彼らが主張するものを提供し操作することを期待しています。

7
Dirk Schumacher

一次近似では、メソッド(C++スタイルのオブジェクト指向)はメンバ関数、つまりクラスの一部である関数を表す別のWordです。

C/C++のような言語では、クラスのメンバーではない関数を持つことができます。クラスに関連付けられていない関数をメソッドと呼ばないでください。

4

私の理解したところでは、メソッドはクラスで実行できる操作です。プログラミングで使用される一般的な用語です。 

多くの言語でメソッドは関数とサブルーチンによって表されます。ほとんどの言語がこれらのために使用する主な違いは、関数が呼び出し側に値を返すかもしれず、サブルーチンは返さないかもしれないということです。しかし、現代の多くの言語は関数しか持っていませんが、これらはオプションで値を返すことができません。

たとえば、猫について説明したいとし、それをあくびできるようにしたいとします。 Yawnメソッドを使用してCatクラスを作成します。これはほとんどの場合、戻り値のない関数です。

4
marcj

非常に単純な答えであるべきものを複雑にし過ぎないようにしましょう。メソッドと機能は同じものです。関数がクラスの外側にあるときは関数を関数と呼び、クラスの内側に書かれるときは関数をメソッドと呼びます。 

3
SamyCode

私見の人々は、オブジェクト内の関数を参照したいときに、プログラマ間のコミュニケーションを容易にするために、新しいWordを発明したいと考えていました。 

メソッドを言っているのであれば、クラス内の関数を意味しています。関数を言っているのであれば、単にクラス外の関数を意味しています。

真実は両方の単語が機能を記述するのに使用されているということです。あなたがそれを間違って使ったとしても、何も悪いことは起こりません。どちらの単語も、コードで何を達成したいのかをよく説明しています。

関数は何かをするという役割( 関数 )を演じなければならないコードです。メソッドは メソッド 問題を解決するためのものです。

それは同じことをします。それは同じことです。もしあなたが超精密であり、そして慣習に沿って行きたいのであれば、メソッドをオブジェクト内部の関数として呼び出すことができます。

3
Morfidon

関数は主に 手続き指向プログラミングに属する概念です 関数はデータを処理し、あなたに価値を返すことができる実体です

メソッドは オブジェクト指向プログラミングの概念です /メソッドはクラスメンバーの処理を主に行うクラスのメンバーです。

3
Akshay Khale

他の多くの人がすでに答えていることを私は知っていますが、私は以下が簡単でありながら効果的な単一行の答えであることがわかりました。それは他の人がここで答えるよりそれほど良くは見えないけれども、あなたがそれを注意深く読んだならば、それはあなたがメソッド対関数について知る必要があるすべてを持っています。 

メソッドは定義された受信側を持つ関数です。OOPの用語では、メソッドはオブジェクトのインスタンス上の関数です。

2
f-society

私は専門家ではありませんが、これは私が知っていることです:

  1. 関数はC言語の用語で、コードの一部を指し、関数名はこの関数を使用するための識別子になります。

  2. MethodはOOという用語です。通常、functionパラメータにthisポインタがあります。 Cのようにこのコードを呼び出すことはできません。それを呼び出すにはobjectを使用する必要があります。

  3. 呼び出し方法も異なります。ここで、このコードのアドレスを見つけるための意味を呼び出します。 C/C++では、リンク時には関数シンボルを使って検索します。

  4. Objecive-Cは違います。アドレスを見つけるためにデータ構造を使用するには、C関数を意味して呼び出します。実行時にすべてがわかっているということです。

2
Marvin

ここではJavaScriptの例を使用してメソッド対関数のいくつかの説明があります:

test(20, 50);は関数定義であり、いくつかのステップを実行したり、どこかに格納/使用できる何かを返すために使用します。

あなたはコードを再利用することができます:一度コードを定義し、それを何度も使用します。

同じコードを異なる引数で何度も使用して、異なる結果を得ることができます。

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(); here test()は、あるオブジェクトのメソッドでも、カスタムオブジェクトのプロトタイプをカスタム定義することもできます。詳細は以下のとおりです。

JavaScriptメソッドは、オブジェクトに対して実行できるアクションです。

JavaScriptメソッドは、関数定義を含むプロパティです。

Javascriptの文字列用の組み込みプロパティ/メソッド

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

カスタム例:

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'

String、Arrayなどのプロパティも定義できます。

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");

/Javascriptオブジェクトメソッド関数プロトタイプに関する追加情報

1
Lahar Shah

メソッドと関数の違い

Microsoftから このドキュメント を読んでから 

実行可能コードを含むメンバーは、まとめてクラスの関数メンバーと呼ばれます。前の節では、メソッドメンバーについて説明しました。これらはメソッドメンバーの主な種類です。このセクションでは、C#でサポートされている他の種類の関数メンバ、つまりコンストラクタ、プロパティ、インデクサ、イベント、演算子、およびファイナライザについて説明します。

そのため、メソッドは関数のサブセットです。すべてのメソッドは関数ですが、すべての関数がメソッドというわけではありません。たとえば、constructor method とは言えませんが、関数です。

1
Siraj

関数 - 独立したコード内の関数で、一部のロジックと独立して呼び出す必要がありますおよびクラス外で定義されています

メソッド - メソッドは独立したコードで、何らかのオブジェクトを参照して呼び出され、クラス内で定義されますです。

0
Aditya Malviya

クラスは、データと関数の集まりで、オプションでコンストラクタを使用します。

その特定のクラスのインスタンス(コピー、複製)を作成している間、コンストラクターはそのクラスを初期化してオブジェクトを返します。 

これでクラスは(コンストラクタなしで)オブジェクトになります。&関数はオブジェクトコンテキストでメソッドとして知られています。

だから基本的に 

クラス<== new ==>オブジェクト

関数<== new ==>メソッド

Javaでは、コンストラクタ名はクラス名と同じですが、実際にはコンストラクタはインスタンスブロックや静的ブロックに似ていますが、戻り値の型(つまり、クラス型)を定​​義する必要があると一般に言われています

クラスは静的ブロック、インスタンスブロック、コンストラクタ、関数を持つことができますが、オブジェクトは一般にdata&methodのみを持ちます。

0

C++では、クラスのメンバー関数の概念を反映するためにmethodが使用されることがあります。しかし、最近私は本の中の文を見つけました。«C++プログラミング言語第4版»、586ページ「派生クラス」

仮想関数はメソッドとも呼ばれます。

これは少し混乱しますが、彼は 時々 と言ったので、C++の作成者はオブジェクトに対して関数を呼び出すことができ、多態的に振る舞うことができるのでメソッドを概して理解する傾向があります。

0
Lance LI