OOPコンテキストでのメソッドと関数の簡単な説明を誰かが提供できますか?
OOPコンテキストでのメソッドと関数の簡単な説明を誰かが提供できますか?
回答:
関数は名前で呼ばれるコードの一部です。操作対象のデータ(パラメーターなど)を渡すことができ、オプションでデータ(戻り値)を返すことができます。関数に渡されるすべてのデータは明示的に渡されます。
この方法は、オブジェクトに関連付けられた名前によって呼び出されるコードの一部です。ほとんどの点で、2つの重要な違いを除いて、関数と同じです。
(これは、スコープなどの問題を無視して簡略化した説明です)
メソッドはオブジェクト上にあります。
関数はオブジェクトから独立しています。
JavaおよびC#の場合、メソッドのみがあります。
Cの場合、関数のみです。
C ++とPythonでは、クラスにいるかどうかによって異なります。
「メソッド」は「関数」のオブジェクト指向の単語です。これですべてです(つまり、実際の違いはありません)。
残念ながら、ここでの答えの多くは、いくつかの複雑で意味のある違いがあるという考えを永続させたり、進めたりしていると思います。
本当に-それほど多くはありませんが、同じことを別の言葉で表すだけです。
【後付】
実際、Brian Nealがこの質問へのコメントで指摘したように、C ++標準では、メンバー関数を指すときに「メソッド」という用語を使用していません。一部の人々は、C ++が実際にはオブジェクト指向言語ではないことを示していると考えるかもしれません。しかし、私はそれを、かなり賢い人々のグループが別の用語を使用する特に強い理由があるとは考えていなかったことを示すものとして採用することを好みます。
self
引数は明示的です。また、多くの言語にはインスタンスが渡されない静的メソッドがあります。
this
またはのオーバーライドをサポートする言語がありますself
が、これらの構造は通常、メソッドではなく関数と呼ばれます。
一般に、メソッドはクラスに属する関数であり、関数はコードの他のスコープに置くことができるため、すべてのメソッドは関数であるが、すべての関数がメソッドであるとは限らないことを示すことができます。
次の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))、または呼び出す必要があります。オブジェクト内のメソッド(object.Method())、少なくともpythonでは。
メソッドは1つのエンティティのみが実行できるものと考えてください。したがって、Dogクラスがある場合、そのクラス内にのみbark関数を配置することは理にかなっており、それはメソッドです。Personクラスもある場合、人間と犬の両方に餌を与えることができるので、どのクラスにも属さない関数 "feed"を記述します。特にどのクラスにも属していないため、その関数を呼び出すことができます。
覚える簡単な方法:
ここを読みたくなったら「OOメソッド入門」
オブジェクト指向のパラダイムの背後にある考え方は、ソフトウェアが「オブジェクト」で構成されていることを「脅かす」ことです。実世界のオブジェクトにはプロパティがあります。たとえば、従業員がいる場合、その従業員には名前、従業員ID、役職があり、部署に所属しているなどです。
オブジェクトは、その属性を処理し、それらに対していくつかの操作を実行する方法も知っています。従業員が今何をしているか知りたい場合は、その従業員に尋ねます。
employe whatAreYouDoing.
その「whatAreYouDoing」は、オブジェクトに送信される「メッセージ」です。オブジェクトはその質問に答える方法を知っています。質問を解決するための「メソッド」があると言われています。
したがって、オブジェクトがその動作を公開する方法はメソッドと呼ばれます。したがって、メソッドはアーティファクトオブジェクトが何かを「実行」する必要があります。
他の可能な方法は
employee whatIsYourName
employee whatIsYourDepartmentsName
等
一方、関数はプログラミング言語がデータを計算する方法です。たとえば、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など)はOOパラダイムをカバーしていなかったため、これらのアーティファクト「関数」のみを呼び出します。
たとえば、Cの以前の関数は次のようになります。
int addValues( int x, int y )
{
return x + y;
}
オブジェクトが何らかのアクションを実行するための「関数」を持っていると言うのは「自然なこと」ではありません。なぜなら、従業員は数学にほとんど関わっていないのに関数は数学的なものに関連しているからですが、関数とまったく同じように機能するメソッドを持つことができます。たとえばJavaでは、これは同等のaddValues関数になります。
public static int addValues( int x, int y ) {
return x + y;
}
見覚えがある?これは、JavaのルーツがC ++とC ++のC ++にあるためです。
最後は単なる概念であり、実装では同じに見えるかもしれませんが、OOのドキュメントではこれらをメソッドと呼びます。
これは、以前の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の例を追加してください。
オブジェクト指向の世界では、この2つは一般に同じことを意味するために使用されます。
純粋な数学とCSの観点から、同じ引数(f(x、y)=(x + y))で呼び出された関数は常に同じ結果を返します。一方、メソッドは通常、クラスのインスタンスに関連付けられています。ただし、最近のほとんどのオブジェクト指向言語では、ほとんどの場合、「関数」という用語を使用していません。多くの静的メソッドは、通常状態を持たない(常にtrueであるとは限らない)ため、非常に関数のようになることがあります。
関数が、いくつかの引数を受け取り、結果を返す可能性があるコードのブロック(通常は独自のスコープを持ち、場合によっては独自のクロージャーを持つ)であるとしましょう。
メソッドは、オブジェクトが所有する関数です(一部のオブジェクト指向システムでは、クラスによって所有されていると言う方が正しいです)。オブジェクト/クラスが「所有」しているということは、オブジェクト/クラスを通じてメソッドを参照することを意味します。たとえば、Javaでオブジェクト「door」が所有するメソッド「open()」を呼び出す場合は、「door.open()」と記述する必要があります。
通常、メソッドは、オブジェクト/クラス内での動作を説明する追加の属性も取得します。たとえば、可視化(カプセル化のオブジェクト指向の概念に関連)、メソッドを呼び出すことができるオブジェクト(またはクラス)を定義します。
多くのオブジェクト指向言語では、すべての「関数」はいくつかのオブジェクト(またはクラス)に属しているため、これらの言語ではメソッドではない関数はありません。
メソッドはクラスの関数です。通常の専門用語では、人々は方法と機能をすべて交換します。基本的にはそれらを同じものと考えることができます(グローバル関数がメソッドと呼ばれるかどうかはわかりません)。
関数は数学的な概念です。例えば:
f(x,y) = sin(x) + cos(y)
関数f()は、2番目のパラメーターの余弦に追加された最初のパラメーターの正弦を返すことを示しています。それは単なる数学です。sin()とcos()も関数です。関数には別のプロパティがあります。同じパラメーターを持つ関数へのすべての呼び出しは、同じ結果を返す必要があります。
一方、メソッドは、オブジェクト指向言語のオブジェクトに関連する関数です。暗黙のパラメーターが1つあります。対象となるオブジェクト(およびその状態)です。
したがって、メソッドg(x)を持つオブジェクトZがある場合、次のように表示されます。
Z.g(x) = sin(x) + cos(Z.y)
この場合、前の関数の例と同じように、パラメーターxが渡されます。ただし、cos()のパラメーターは、オブジェクトZの内部にある値です。Zとその内部にあるデータ(Zy)は、Zのg()メソッドの暗黙的なパラメーターです。
関数またはメソッドは、いくつかの操作を実行し、オプションで値を返す名前付きの呼び出し可能なコードです。
C言語の用語関数が使用されています。JavaおよびC#人々はそれをメソッドと言います(そしてこの場合の関数はクラス/オブジェクト内で定義されます)。
A C ++プログラマは、用語「方法」であるため、また、C / C ++プログラマのみの可能性が高い機能を呼び出します、彼らは手続き型スタイルのC ++コードまたはC ++のオブジェクト指向の方法をやっているを作成している場合に応じて、(関数や、時にはメソッドを呼び出すことができますC / C ++の文献ではあまり使用されていません)。
関数を使用するには、次のような名前を呼び出します。
result = mySum(num1, num2);
あなたは最初にそのオブジェクトを参照してメソッドを呼び出すでしょう、
result = MyCalc.mySum(num1,num2);
歴史的に、「メソッド」は値を返さないものであり、「関数」は値を返さないものであるという微妙な違いがあった可能性があります。各言語には、特別な意味を持つ用語の独自の用語集があります。
では、「C」、単語「機能」を意味プログラムルーチンを。
ではJavaの、用語「機能」は特別な意味を持ちません。一方、「メソッド」とは、クラスの実装を形成するルーチンの1つを意味します。
ではC#のよう翻訳します:
public void DoSomething() {} // method
public int DoSomethingAndReturnMeANumber(){} // function
しかし、実際には、2つの概念に違いはないということを繰り返します。Javaについての非公式な議論で「関数」という用語を使用する場合、人々はあなたが「メソッド」を意味するものと見なし続けます。Javaに関する適切なドキュメントやプレゼンテーションで使用しないでください。ばかげた見た目になります。
method
...または私はそれを呼ぶだろうprocedure
とfunction
。
関数は、データの操作に使用できる一連のロジックです。
一方、メソッドは、それが属するオブジェクトのデータを操作するために使用される関数です。したがって、技術的には、クラスに完全には関連付けられていないがクラスで宣言されている関数がある場合、それはメソッドではありません。それは悪いデザインと呼ばれています。
クラスのメソッドは、オブジェクトと呼ばれるクラスのインスタンスに作用します。
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 ++などのオブジェクト指向言語では、「メソッド」はオブジェクトに関連付けられた関数です。したがって、たとえば、「Dog」オブジェクトには「bark」関数があり、これは「メソッド」と見なされます。対照的に、 "StrLen"関数はスタンドアロンです(引数として提供される文字列の長さを提供します)。したがって、これは単なる「機能」です。Javascriptも技術的にはオブジェクト指向ですが、C ++、C#、Pascalなどの本格的な言語と比較して多くの制限に直面しています。それにもかかわらず、その区別は依然として保持されるべきです。
追加の事実:C#は完全にオブジェクト指向であるため、スタンドアロンの「関数」を作成することはできません。C#では、すべての関数がオブジェクトにバインドされているため、技術的には「メソッド」です。キッカーは、C#で「メソッド」と呼ぶ人はほとんどいないということです。実際に区別する必要がないため、「関数」という用語を使用しているだけです。
最後に-Pascalの達人がここで私にジャンプしないように-Pascalは「値」を返す「関数」とそうでない「手続き」も区別します。もちろん、値を返すかどうかを選択することもできますが、C#はこの区別を明示的に行いません。
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
はgreet_with_greeter
関数を使用するのとまったく同じ方法でメソッドを使用できます(クラス内で定義したため、「ドット」構文を使用して取得します)。
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!主な概念上の違いは、依然として非表示の追加パラメーターです。)
私にとって:メソッドと関数の機能は、私が同意する場合は同じです:
コードの一部と同じように、オブジェクトを入れたり、結果としてオブジェクトができたりします。その間、彼らはオブジェクトの状態を変えるかもしれませんが、それは私にとって彼らの基本的な機能を変えません。
オブジェクトや他のコードの呼び出し関数に定義の違いがあるかもしれません。しかし、それは言葉による違いのためではなく、人々がそれらを交換する理由です。私が注意する計算の言及例。私は計算を行うために雇用を雇うので:
new Employer().calculateSum( 8, 8 );
そうすることで、雇用主が計算に責任を持つことに頼ることができます。彼がもっとお金が欲しいのなら、私は彼を解放し、未使用の従業員を処分するというカーベッジコレクターの機能に残りを任せて、新しい従業員を雇います。
メソッドがオブジェクト関数であり、関数が接続されていない計算であると主張しても、助けにはなりません。関数記述子自体と、理想的には関数のドキュメントに、何が必要で何が返されるかが示されています。残りの部分は、オブジェクトの状態を操作するようなものであり、実際には透過的ではありません。私は、関数とメソッドの両方が、彼らが主張するものを提供し、操作することを期待しています。その方法を詳細に知る必要はありません。純粋な計算関数でさえ、コンソールの状態を変更したり、ログファイルに追加したりすることがあります。
一次近似として、メソッド(C ++スタイルOOの場合)は、メンバー関数、つまりクラスの一部である関数の別名です。
C / C ++のような言語では、クラスのメンバーではない関数を持つことができます。クラスに関連付けられていない関数をメソッドと呼ぶことはありません。
関数は、主にプロシージャ指向プログラミングに属する概念です。関数は、データを処理して値を返すエンティティです。
メソッドはオブジェクト指向プログラミングの概念であり、メソッドはクラスのメンバーであり、ほとんどがクラスメンバーで処理を行います。
IMHOの人々は、オブジェクト内の関数を参照したいときに、プログラマー間のコミュニケーションを容易にするための新しい単語を発明したかっただけです。
メソッドといえば、クラス内の関数を意味します。関数といえば、単にクラス外の関数です。
真実は、両方の単語が機能を説明するために使用されていることです。誤って使用しても、何も問題はありません。どちらの言葉も、コードで達成したいことをうまく説明しています。
関数は、何かを行うための役割を果たす(関数)コードでなければなりません。この方法は、ある方法この問題を解決します。
同じことをします。同じことです。非常に正確にしたい場合は、オブジェクトの関数としてメソッドを呼び出すことができます。
私は専門家ではありませんが、これは私が知っていることです:
関数はC言語の用語で、コードの一部を指し、関数名はこの関数を使用するための識別子になります。
メソッドはオブジェクト指向の用語であり、通常は関数パラメーターにthisポインターがあります。Cのようにこのコードを呼び出すことはできません。オブジェクトを使用して呼び出す必要があります。
呼び出し方法も異なります。ここで、このコードのアドレスを見つける意味を呼び出します。C / C ++では、リンク時に関数シンボルを使用して検索します。
Objecive-Cは異なります。データ構造を使用してアドレスを検索するC関数を呼び出す。これは、実行時にすべてが既知であることを意味します。
実行可能コードを含むメンバーは、まとめてクラスの関数メンバーと呼ばれます。前のセクションでは、関数メンバーの主要な種類であるメソッドについて説明しました。このセクションでは、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.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");