メソッドと関数の違いは何ですか?
-
03-07-2019 - |
質問
OOPコンテキストでメソッドと関数の簡単な説明を誰かが提供できますか?
解決
関数は、名前で呼び出されるコードです。操作対象のデータ(つまり、パラメーター)を渡すことができ、オプションでデータ(戻り値)を返すことができます。関数に渡されるすべてのデータは明示的に渡されます。
メソッドは、オブジェクトに関連付けられた名前で呼び出されるコードです。ほとんどの点で、2つの重要な違いを除いて関数と同じです:
- メソッドは、呼び出されたオブジェクトに暗黙的に渡されます。
- メソッドは、クラス内に含まれるデータを操作できます(オブジェクトはクラスのインスタンスであることに注意してください-クラスは定義であり、オブジェクトはそのデータのインスタンスです)。
(これは、 scope などの問題を無視した、簡単な説明です)
他のヒント
メソッドはオブジェクト上にあります。
関数はオブジェクトに依存しません。
Javaの場合、メソッドのみがあります。
Cには、関数のみがあります。
C ++の場合、クラスにいるかどうかによって異なります。
'method' は、 'function' のオブジェクト指向の単語です。これでほとんどすべてです(つまり、実質的な違いはありません)。
残念ながら、ここでの回答の多くは、複雑で意味のある違いがあるという考えを永続化または前進させていると思います。
本当に-それだけではありません。同じことを表す言葉が違うだけです。
[後期追加]
実際、 Brian Neal はこの質問、C ++標準では、メンバー関数を参照するときに「メソッド」という用語は使用されません。一部の人々は、それをC ++が実際にはオブジェクト指向言語ではないことを示すものと考えるかもしれません。ただし、かなり賢い人々が別の用語を使用する特別な理由があるとは考えていなかったことを示すものとしてそれを採用することを好みます。
一般的に、メソッドはクラスに属する関数であり、関数はコードの他のスコープに置くことができるため、すべてのメソッドは関数ですが、すべての関数がメソッドではないことを示すことができます:
次のPythonの例を取り上げます。
class Door:
def open(self):
print 'hello stranger'
def knock_door:
a_door = Door()
Door.open(a_door)
knock_door()
この例では、<!> quot; Door <!> quotというクラスを示しています。 <!> quot; open <!> quot;というメソッドまたはアクションがある場合、クラス内で宣言されているため、メソッドと呼ばれます。 <!> quot; def <!> quot;を含むコードの別の部分があります。関数を定義するすぐ下で、クラス内で宣言されていないため、関数です。この関数は、クラス内で定義したメソッドを呼び出します。最後に、関数はそれ自体で呼び出されています。
ご覧のとおり、どこでも関数を呼び出すことができますが、メソッドを呼び出す場合は、メソッドが宣言されているクラスと同じ型の新しいオブジェクトを渡す必要があります(Class.method(object))または少なくともpythonでは、オブジェクト(object.Method())内のメソッドを呼び出す必要があります。
メソッドは1つのエンティティのみが実行できるものと考えてください。そのため、Dogクラスがある場合は、そのクラス内にのみbark関数を配置するのが理にかなっています。関数<!> quot; feed <!> quot;を書くのは理にかなっています。人間と犬の両方に餌を与えることができるので、それはどのクラスにも属しません。特に、どのクラスにも属さないので関数を呼び出すことができます。
関数とメソッドの主な違いの非常に一般的な定義:
関数はクラスの外部で定義され、メソッドはクラスの内部および一部で定義されます。
覚える簡単な方法:
- F 機能<!>#8594; F ree(無料はオブジェクトまたはクラスに属さないことを意味します)
- M 第<!>#8594; M メンバー(オブジェクトまたはクラスのメンバー)
ここを読んでみたいと思うなら<!> quot; OOメソッドの紹介<!> quot;
オブジェクト指向パラダイムの背後にある考え方は、<!> quot; threat <!> quot;ソフトウェアは.. well <!> quot; objects <!> quot;で構成されています。現実世界のオブジェクトにはプロパティがあります。たとえば、従業員がいる場合、従業員には名前、従業員ID、役職、部門などに所属しています。
オブジェクトは、その属性を処理し、それらに対していくつかの操作を実行する方法も知っています。従業員が今何をしているかを知りたい場合は、彼に尋ねるとしましょう。
employe whatAreYouDoing.
その<!> quot; whatAreYouDoing <!> quot; <!> quot; message <!> quot;オブジェクトに送信されます。オブジェクトは、その質問に答える方法を知っています。<!> quot; method <!> quot;質問を解決します。
したがって、オブジェクトの動作を公開する方法はメソッドと呼ばれます。したがって、メソッドはアーティファクトオブジェクトが<!> quot; do <!> quot;する必要があります。何か。
その他の可能な方法は
ですemployee whatIsYourName
employee whatIsYourDepartmentsName
etc。
一方で、関数はプログラミング言語がデータを計算する方法です。たとえば、16を返す関数addValues(8、8)があります
// 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など)はオブジェクト指向のパラダイムをカバーしていなかったため、これらのアーティファクトを呼び出すのは<!> quot; functions <!> quot;のみです。
たとえば、Cの前の関数は次のようになります。
int addValues( int x, int y )
{
return x + y;
}
<!> quot; natural <!> quotではありません;オブジェクトに<!> quot; function <!> quotがあると言うには;従業員には数学がほとんどない一方で、関数は数学的なものに関連しているため、何らかのアクションを実行しますが、関数とまったく同じメソッドを持つことができます。たとえば、Javaではこれは同等のaddValues関数になります。
public static int addValues( int x, int y ) {
return x + y;
}
おなじみですか?それは、JavaがC ++とC ++にルートを持っているためです。
最後は単なる概念であり、実装上は同じように見えるかもしれませんが、オブジェクト指向ドキュメントではこれらはメソッドと呼ばれます。
Here <!>#180;は、以前の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.
違いは、<!> quot; domain <!> quot;です。適用場所。
AppleScriptには<!> quot;自然言語<!> quot;という考えがあります。 matphor、ある時点でオブジェクト指向が持っていた。たとえば、Smalltalk。これを読んだ後、オブジェクトのメソッドを理解するのが合理的で簡単になることを願っています。
注:コードはコンパイルするのではなく、単なる例として使用します。投稿を自由に変更してPythonの例を追加してください。
オブジェクト指向の世界では、この2つは同じことを意味するために一般的に使用されます。
純粋な数学とCSの観点から、関数は同じ引数(f(x、y)=(x + y))で呼び出されると常に同じ結果を返します。一方、メソッドは通常、クラスのインスタンスに関連付けられます。繰り返しますが、最近のほとんどのオブジェクト指向言語では、<!> quot; function <!> quotという用語は使用されなくなりました。ほとんどの場合。多くの静的メソッドは、通常は状態を持たないため、関数に非常に似ています(常にtrueとは限りません)。
関数は、いくつかの引数を受け取り、結果を返す可能性のあるコードブロック(通常は独自のスコープを使用し、場合によっては独自のクロージャを使用)であるとします。
メソッドは、オブジェクトが所有する関数です(一部のオブジェクト指向システムでは、クラスが所有していると言う方が正確です)。 <!> quot;所有<!> quot;オブジェクト/クラスによるとは、オブジェクト/クラスを介してメソッドを参照することを意味します。たとえば、Javaでメソッド<!> quot; open()<!> quotを呼び出す場合オブジェクトが所有する<!> quot; door <!> quot; <!> quot; door.open()<!> quot;と記述する必要があります。
通常、メソッドはオブジェクト/クラス内での動作を説明する追加の属性も取得します。たとえば、どのオブジェクト(またはクラス)からメソッドを呼び出すことができるかを定義する可視性(カプセル化のオブジェクト指向の概念に関連)。
多くのオブジェクト指向言語では、すべての<!> quot;関数<!> quot;オブジェクト(またはクラス)に属しているため、これらの言語にはメソッドではない関数はありません。
メソッドはクラスの関数です。通常の専門用語では、人々は方法と機能を全面的に交換します。基本的に、それらは同じものと考えることができます(グローバル関数がメソッドと呼ばれるかどうかはわかりません)。
関数は数学的概念です。例:
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()メソッドに対する暗黙のパラメーターです。
関数またはメソッドは、いくつかの操作を実行し、オプションで値を返す名前付きの呼び出し可能なコードです。
C 言語では、関数という用語が使用されます。 Java <!> amp; C#の人々はそれをメソッドと言います(そしてこの場合の関数はクラス/オブジェクト内で定義されます)。
C ++ プログラマーは、それを関数またはメソッドと呼ぶことがあります(手続き型のC ++コードを書いているか、C ++のオブジェクト指向の方法を行っているか、C / C ++のみのプログラマーもそうです) 「メソッド」という用語はC / C ++の文献ではあまり使用されないため、関数と呼びます。
result = mySum(num1, num2);
最初にオブジェクトを参照することでメソッドを呼び出します。
result = MyCalc.mySum(num1,num2);
歴史的に、<!> quot; method <!> quot;と微妙な違いがあった可能性があります。値を返さないものであり、<!> quot; function <!> quot;各言語には、特別な意味を持つ独自の用語の語彙があります。
<!> quot; C <!> quot; では、単語 <!> quot; function <!> quot; はプログラムルーチンを意味します。
Java では、 <!> quot; function <!> quot; という用語には特別な意味はありません。一方、 <!> quot; method <!> quot; は、クラスの実装を形成するルーチンの1つを意味します。
C#では、次のように変換されます。
public void DoSomething() {} // method
public int DoSomethingAndReturnMeANumber(){} // function
しかし、実際には、2つの概念に違いはまったくないことを繰り返します。 用語<!> quot; function <!> quot;を使用する場合Javaに関する非公式の議論では、人々はあなたが<!> quot; method <!> quot;そして続けます。 Javaに関する適切な文書やプレゼンテーションで使用しないでください。使用すると、馬鹿げて見えます。
クラスのメソッドは、オブジェクトと呼ばれるクラスのインスタンスに作用します。
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"
}
}
Object PascalやC ++などのオブジェクト指向言語では、<!> quot; method <!> quot;オブジェクトに関連付けられた関数です。たとえば、<!> quot; Dog <!> quot;オブジェクトには<!> quot; bark <!> quot;が含まれる場合があります。関数であり、これは<!> quot; Method <!> quot;と見なされます。対照的に、<!> quot; StrLen <!> quot;関数はスタンドアロンです(引数として提供される文字列の長さを提供します)。したがって、これは just <!> quot; function。<!> quot;です。 Javascriptも技術的にはオブジェクト指向ですが、C ++、C#、Pascalなどの本格的な言語と比較して多くの制限に直面しています。それにもかかわらず、区別はまだ保持する必要があります。
追加の事実:C#は完全にオブジェクト指向であるため、スタンドアロンの<!> quot; functions。<!> quot;を作成できません。 C#では、すべての関数はオブジェクトにバインドされているため、技術的には<!> quot; method。<!> quot;です。キッカーは、C#で<!> quot; methods <!> quot;と呼ばれる人はほとんどいないということです。 -彼らは、単に<!> quot; functions <!> quotという用語を使用します。実際に区別する必要がないためです。
最後に-Pascalの達人がここに飛び付かないように-Pascalは<!> quot; functions <!> quot;も区別します。 (値を返す)および<!> quot; procedures <!> quot;しません。もちろん、値を返すかどうかを選択できますが、C#はこの区別を明示的に行いません。
Pythonについて説明したので、以下は、ほとんどの最新のオブジェクト指向言語におけるメソッドとオブジェクトの関係を示す有用な例です。一言で言えば、それらは<!> quot; method <!> quotと呼ばれるものです。 (他の回答が指摘しているように)追加の引数を渡す関数にすぎませんが、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
を比較します。唯一の違いは、最初のパラメーターの名前です(関数では<!> quot; greeter <!> quot ;、メソッドIでは<!> quot; self <!> quot;)と呼ばれます。したがって、greet2
関数を使用するのとまったく同じ方法でobject.method(args)
メソッドを使用できます(クラス内で定義したため、取得するには<!> quot; dot <!> quot;構文を使用します) :
Greeter.greet(hello_greeter, "World")
だから、メソッドを関数に効果的に変えました。関数をメソッドに変えることはできますか? Pythonを使用すると、クラスを定義した後にクラスをいじることができるので、試してみましょう。
Greeter.greet2 = greet_with_greeter
hello_greeter.greet2("World")
はい、関数method(object, args)
はメソッド<=>としても知られるようになりました。これは、メソッドと関数の唯一の本当の違いを示しています。メソッドを呼び出すとき<!> quot; on <!> quot; <=>を呼び出してオブジェクトを作成すると、言語は魔法でオブジェクトを<=>に変換します。
(オブジェクト指向の純粋主義者は、メソッドは関数とは異なるものであると主張するかもしれません。高度なPythonやRuby、またはSmalltalkに入れば、そのポイントが見え始めます。また、一部の言語はオブジェクト。ただし、主な概念上の違いは、隠された追加パラメーターです。)
関数は、データを操作するために使用できるロジックのセットです。
一方、Methodは、それが属するオブジェクトのデータを操作するために使用される関数です。 したがって、技術的には、クラスに完全には関連していないが、クラス内で宣言された関数がある場合、メソッドではありません。悪いデザインと呼ばれます。
私にとって: 私がそれに同意する場合、メソッドの機能と機能は同じです:
- 関数は値を返すことがあります
- パラメータが必要な場合があります
コードの一部と同様に、オブジェクトを入れたり、結果としてオブジェクトを作成したりできます。そうすることで、オブジェクトの状態が変わる可能性がありますが、基本的な機能は変わりません。
オブジェクトまたは他のコードの関数の呼び出しに定義の違いがある可能性があります。しかし、それは言葉による差別化のためのものではなく、それが人々がそれらを交換する理由ですか?私が注意する計算の言及例。雇用者を雇って計算をしているからです:
new Employer().calculateSum( 8, 8 );
そのようにすることで、雇用主が計算を担当することに頼ることができます。もし彼がもっとお金が欲しいなら、私は彼を解放し、未使用の従業員を処分するキャベツコレクターの機能に残りを任せて新しい従業員を得るようにします。
メソッドはオブジェクト関数であり、関数は接続されていない計算であると主張しても、私は助けにはなりません。関数記述子自体と、理想的には関数のドキュメントから、必要なものと返される可能性のあるものがわかります。残りは、何らかのオブジェクトの状態を操作するようなもので、私にはあまりわかりません。関数とメソッドの両方が、どのように機能するかを詳細に知る必要なく、それらが主張するものを提供し操作することを期待しています。 純粋な計算関数でさえ、コンソールの状態を変更したり、ログファイルに追加したりする可能性があります。
私の理解では、メソッドはクラスで実行できる任意の操作です。プログラミングで使用される一般的な用語です。
多くの言語では、メソッドは関数とサブルーチンで表されます。ほとんどの言語がこれらに使用する主な違いは、関数が呼び出し元に値を返すことがあり、サブルーチンは返さないことです。ただし、現代の多くの言語には関数しかありませんが、オプションで値を返すことはできません。
たとえば、猫について説明したいのに、あくびできるようにしたいとします。 Yawnメソッドを使用してCatクラスを作成します。ほとんどの場合、戻り値のない関数になります。
一次近似では、メソッド(C ++スタイルOO)は、メンバー関数、つまりクラスの一部である関数の別の単語です。
C / C ++などの言語では、クラスのメンバーではない関数を使用できます。クラスに関連付けられていない関数をメソッドと呼ばないでください。
IMHOの人々は、オブジェクト内の関数を参照したいときにプログラマー間のコミュニケーションを容易にするための新しい単語を発明したかっただけです。
メソッドを言う場合、クラス内の関数を意味します。 関数と言っている場合、単にクラス外の関数を意味します。
真実は、両方の単語が関数を記述するために使用されるということです。誤って使用しても、何も問題は発生しません。どちらの言葉も、コードで達成したいことをよく説明しています。
関数は、何かをする役割を果たす(関数)必要があるコードです。 メソッドは、問題を解決するための aメソッドです。
同じことをします。同じことです。非常に正確にしたい場合は、慣例に従ってください。オブジェクト内の関数としてメソッドを呼び出すことができます。
関数は、主に手続き指向プログラミングに属する概念です。関数は、データを処理して値を返すエンティティです
メソッドは、オブジェクト指向プログラミングの概念です。メソッドは、ほとんどの場合、クラスメンバーで処理を行うクラスのメンバーです。
非常に簡単な答えを複雑にする必要はありません。メソッドと関数は同じものです。クラスの外にあるときに関数を関数と呼び、クラスの内部に記述されているときに関数をメソッドと呼びます。
私は専門家ではありませんが、これは私が知っていることです:
-
関数はC言語の用語であり、コードを指し、関数名はこの関数を使用するための識別子になります。
-
メソッドはオブジェクト指向用語であり、通常は関数パラメーターにthisポインターがあります。 Cのようなこのコードを呼び出すことはできません。呼び出すにはオブジェクトを使用する必要があります。
-
invokeメソッドも異なります。ここで、このコードのアドレスを見つける意味を呼び出します。 C / C ++では、リンク時に関数シンボルを使用して検索します。
-
Objecive-Cは異なります。アドレスを見つけるためにデータ構造を使用するC関数を意味する呼び出し。これは、実行時にすべてが既知であることを意味します。
他の多くの人がすでに答えていることは知っていますが、以下はシンプルでありながら効果的な単一行の答えです。ここでは他の人の答えよりも格段に良く見えませんが、注意深く読むと、メソッドと機能について知っておく必要のあるすべてが揃っています。
メソッドは、定義済みのレシーバーを持つ関数です。OOPの用語では、メソッドはオブジェクトのインスタンスの関数です。
メソッドと関数の違い
実行可能コードを含むメンバーは、クラスの関数メンバーと総称されます。前のセクションでは、関数の主要な種類であるメソッドについて説明しました。このセクションでは、C#でサポートされる他の種類の関数メンバー、コンストラクター、プロパティ、インデクサー、イベント、演算子、およびファイナライザーについて説明します。
つまり、メソッドは関数のサブセットです。すべてのメソッドは関数ですが、すべての関数がメソッドではありません。たとえば、constructor
はメソッドとは言えませんが、関数です。
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();
ここで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オブジェクトメソッド、関数、プロトタイプの詳細
関数-いくつかのロジックを含み、独立して呼び出さなければならない クラスの外部で定義される独立したコード部分の関数。
メソッド-メソッドは、オブジェクトを参照して呼び出され、クラス内で定義される独立したコードです。
C ++では、クラスのメンバー関数の概念を反映するためにメソッドが使用される場合があります。しかし、最近<!>#171; The C ++ Programming Language 4th Edition <!>#187 ;, 586ページに<!> quot; Derived Classes <!> quot;
のステートメントが見つかりました。仮想関数はメソッドと呼ばれることもあります。
これは少しわかりにくいですが、彼は時々と言ったので、おおよそ理にかなっています。C++の作成者は、オブジェクトで関数を呼び出してポリモーフィックに振る舞うメソッドを見る傾向があります。
クラスは、オプションでコンストラクターを使用したデータと関数のコレクションです。
その特定のクラスのインスタンス(コピー、レプリケーション)を作成している間、コンストラクターはクラスを初期化し、オブジェクトを返します。
クラスはオブジェクトになります(コンストラクターなし) <!> amp; 関数は、オブジェクトコンテキストのメソッドとして知られています。
基本的に
クラス<!> lt; == new == <!> gt; Object
関数<!> lt; == new == <!> gt;メソッド
javaクラスには静的ブロック、インスタンスブロック、コンストラクタ、関数を含めることができますが 通常、オブジェクトにはデータ<!> ampのみがあります。メソッド。