function - メソッド - ルーチン 関数 違い




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

メソッドと関数の違い

マイクロソフトのこのドキュメントを読むことから

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

つまり、メソッドは関数のサブセットです。 すべてのメソッドは関数ですが、すべての関数がメソッドではありません。たとえば、 constructorメソッドとは言えませんが、関数です。

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


C ++では、メソッドはクラスのメンバ関数の概念を反映するために使用されることがあります。 しかし、最近、私は「The C ++ Programming Language 4th Edition」、586ページの "Derived Classes"

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

これはちょっと混乱しますが、彼は時々言っていますので、C ++の作成者はメソッドがオブジェクト上で呼び出され、多態的に振る舞うようにする方法を見ている傾向があります。


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オブジェクトメソッドFunctions 、 プロトタイプに関する詳細


OOの世界では、2つは一般に同じことを意味するために使用されます。

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


'method''function'のオブジェクト指向の単語です。 それはそこにあるすべてのものです(つまり、実際の違いはありません)。

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

本当に、それにはそれほど多くのことはなく、同じことについてはちょっと違う言葉です。

[後期追加]

実際、 Brian Neal氏はこの質問に対するコメントで指摘しているように、C ++標準ではメンバー関数を参照するときに「メソッド」という用語を使用しません。 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_with_greeter関数を使ってgreet_with_greeter関数を使うのとまったく同じ方法で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)に変わりmethod(object, args)

(オブジェクト指向の純粋主義者は、メソッドが関数とは異なるものだと主張するかもしれませんし、高度なPythonやRubyやSmalltalkに入っていれば、そのポイントを知ることができます。主な概念の違いは、まだ隠された余分なパラメータです。)


ここで読んでいると感じたら、「私の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など)はオブジェクト指向のパラダイムをカバーしていないため、これらのアーティファクトを「関数」と呼ぶだけです。

例えば、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言語で持っているからです

最後は単なる概念であり、実装上は同じように見えるかもしれませんが、オブジェクト指向のドキュメントではメソッドと呼ばれています。

ここでは、以前の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には、自然言語のマットというアイデアがあります。 たとえばSmalltalk。 私は、これを読んだ後、オブジェクトのメソッドを理解することが妥当であることを願っています。

注:コードはコンパイルされず、例として提供されます。 投稿を修正してPythonの例を追加しても構いません。


クラスは、いくつかのデータのコレクションであり、オプションでコンストラクタを持つ関数です。

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

クラスはオブジェクト(コンストラクタなし)になり、関数はオブジェクトコンテキストではメソッドと呼ばれます。

だから基本的に

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

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

Javaでは、それは一般的にクラス名と同じコンストラクタ名と言われていますが、実際にはそのコンストラクタはインスタンスブロックと静的ブロックのようですが、ユーザが戻り値の型(つまり、クラス型)

クラスは静的ブロック、インスタンスブロック、コンストラクタ、関数を持つことができますが、オブジェクトには一般的にデータとメソッドしかありません。


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

Javaの場合、メソッドだけがあります。
Cでは、関数だけがあります。

C ++では、クラスに参加しているかどうかによって異なります。


一次近似では、(C ++スタイルのOOの)メソッドは、メンバ関数の別の単語です。つまり、クラスの一部である関数です。

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


一般的には、メソッドはクラスに属する関数であり、関数はコードの他のスコープ上にあることができるので、すべてのメソッドが関数であることを示すことができますが、すべての関数がメソッドではありません。

次の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クラスがあれば、そのクラスの中に樹皮機能を持たせることは意味があり、それはメソッドになります。人間と犬の両方が飼われることができるので、それはどんなクラスにも属していない "フィード"関数を書いてください。それは、特にクラスに属さないので関数と呼ぶことができます。


私の場合:メソッドと関数の関数は、私が同意すれば同じです:

  • 関数は値を返すことがあります
  • パラメータが期待できる

どんなコードと同じように、オブジェクトを置くことができます。結果としてオブジェクトが得られるかもしれません。 それをしている間、彼らはオブジェクトの状態を変えるかもしれませんが、それは私にとって基本的な機能を変えません。

オブジェクトまたは他のコードの関数を呼び出す際に、定義の相違が存在する可能性があります。 しかし、言葉の相違のための何かではないので、人々がそれを交換しているのですか? 私が計算の言及の例は私が慎重になるでしょう。 私は私の計算をするために雇用者を雇うので、

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

そうすることで、私は雇用者が計算責任を負うことに頼ることができます。 彼がもっとお金が欲しいと思ったら、私は彼を解放して、未使用の従業員を処分するためのカーバイトコレクターの機能を残りの人たちに任せ、新しい従業員を手に入れさせる。

あるメソッドがオブジェクト関数であり、関数が未接続であると主張しても、計算は私を助けません。 関数記述子自体と、理想的には関数のドキュメンテーションは、必要なものと返すものを教えてくれます。 残りの部分は、オブジェクトの状態を操作するようなものではありません。 私は、彼らがどのようにそれを行うかを詳細に知る必要なしに彼らが主張するものを提供し、操作する機能と方法の両方を期待しています。 純粋な計算機能であっても、コンソールの状態を変更したり、ログファイルに追加することができます。


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

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

例えば、あなたが猫を描写したいと思うと、あなたはそれが去ることができるようにしたいと言うことができます。 あなたは戻り値のない関数である可能性が最も高いYawnメソッドを使ってCatクラスを作成します。


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

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

  2. メソッドはオブジェクト指向の用語で、通常は関数のパラメータにthisポインタがあります。 Cのようなコードを呼び出すことはできません。オブジェクトを使用して呼び出す必要があります。

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

  4. Objecive-Cは異なる。 Invokeは、データ構造を使用してアドレスを見つけるC関数を意味します。 これは実行時にすべてが分かっていることを意味します。


簡単な覚え方:

  • 機能F ree(フリーとはオブジェクトやクラスに属さないことを意味します)
  • Mエド→ M ember(オブジェクトまたはクラスのメンバ)

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

一方、メソッドは、それが属するオブジェクトのデータを操作するために使用される関数です。 つまり、クラスに完全には関連していないが、クラスで宣言されている関数を持っていれば、それはメソッドではありません。 それは悪いデザインと呼ばれています。


関数は、データを操作するために使用できるロジックのセットです。 一方、メソッドは、それが属するオブジェクトのデータを操作するために使用される関数です。 つまり、クラスに完全には関連していないが、クラスで宣言されている関数を持っていれば、それはメソッドではありません。 それは悪いデザインと呼ばれています。


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

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

関数f()は、第2パラメータの余弦に加えられた第1パラメータの罪を返すと述べている。 それは単なる数学です。 それが起こると、sin()とcos()も関数になります。 関数には別のプロパティがあります。つまり、同じパラメータを持つ関数へのすべての呼び出しは、同じ結果を返す必要があります。

一方、メソッドは、オブジェクト指向言語のオブジェクトに関連する関数です。 これには1つの暗黙的なパラメータがあります。つまり、実行中のオブジェクト(およびその状態)です。

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

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

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


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

C言語では、関数という用語が使用されています。 JavaおよびC#の人々はそれをメソッドと呼んでいます(この場合、関数はクラス/オブジェクト内で定義されています)。

C ++プログラマは、プロシージャスタイルのC ++コードを記述しているのか、オブジェクト指向のC ++を実行しているのかに応じて、関数または時にはメソッドと呼ぶことがあります(C / C ++のみのプログラマは、あまり頻繁にC / C ++文献で使用される)。

関数を使うのは、その名前を呼び出すだけで、

result = mySum(num1, num2);


最初にそのオブジェクトを参照してメソッドを呼び出すと、

result = MyCalc.mySum(num1,num2);




terminology