web-dev-qa-db-ja.com

メソッドvs関数vs手順

簡単な質問ですが、私はこのような凶暴さで定義されたこれらの3つの用語をよく耳にしますが、長年にわたってさまざまな意味で知られています。

「プロシージャ」、「メソッド」、「関数」、「サブルーチン」などの「正しい」定義は何ですか?

113

ここでは別の答えを使用します。実際には、実際には違いはありませんですが、 "メソッド"は通常OO言語でオブジェクトに関連付けられたサブルーチンを参照します。

「プロシージャ、関数、サブルーチン、サブプログラム、メソッド」という用語はすべて同じ意味で、より大きなプログラム内の呼び出し可能なサブプログラムを意味します。しかし、これらの用語のすべてのバリエーションの使用法をキャプチャする定義を思い付くのは困難です。これらの用語は、プログラミング言語またはパラダイム全体で一貫して使用されていないためです。

関数が値を返すと言うかもしれません。次のC関数は値を返しません。

void f() { return; }

...しかし、それを手順と呼ぶ人はいないと思います。

確かに、Pascalでは、プロシージャは値を返さず、関数は値を返しますが、これはPascalがどのように設計されたかを単に反映したものです。 Fortranでは、関数は値を返し、サブルーチンは複数の値を返します。それでも、これらの用語の「普遍的な」定義を思いつくことはできません。

実際、「手続き型プログラミング」という用語は、C、Fortran、Pascalなどの言語のクラス全体を指し、そのうちの1つだけが実際に「手続き」という用語を使用して何かを意味します。

したがって、これらのどれも実際には一貫していません。唯一の例外はおそらく「メソッド」であり、ほぼ完全にOO言語で使用され、オブジェクトに関連付けられている関数を参照します。ただし、これは常に一貫しているわけではありません。C++たとえば、通常、メソッドではなく「メンバー関数」という用語を使用します(「メソッド」という用語は、プログラマーの間でC++の常識に浸透しています)。

重要なのは、これが実際に一貫していることはないということです。それは、当時流行している言語が採用している用語を単に反映しているだけです。

109
Charles Salvia

functionは値を返しますが、procedureは返しません。

メソッドは関数に似ていますが、 内部 クラスの一部。 メソッドという用語は、ほとんどオブジェクト指向プログラミングでのみ使用されます。

69
Bruce Alderman

functionは、一連の入力を受け取り、1つ以上の値を返すものです。戻り値が入力によって完全に決定され、関数に副作用がない場合(おそらく、ログに記録されたり、外部で状態が変化したりする)、純粋な関数と呼ばれます。

手順は、値を返さない関数です。特に、これはプロシージャが副作用のみを引き起こす可能性があることを意味します。 (これには、入力パラメーターの変更が含まれる場合があります!)

メソッドは、一連の変数を閉じる関数、つまりクロージャーです。 0個以上の入力パラメーターを受け取り、この変数のセットにアクセスして、0個以上の値を返します。 OO言語では、これらのメソッドはオブジェクトまたはクラスにアタッチされます。

ほとんどの主流のOO言語では、これらの閉じられた変数は、オブジェクトのメンバーフィールドまたはインスタンス変数と呼ばれます。メソッドは、純粋な関数、不純な関数、またはプロシージャです。

後者の定義は、object = struct + Closuresの対応になります。

53
Frank Shearar

ブルースには 良い答え があります。私は意味的に追加します:

  • プロシージャは引数に「何かをする」か、他の副作用を引き起こす必要があります(例:printf
  • 関数は、(a)引数に関する質問に答えるか、(b)引数に基づいて新しい値を計算する必要があります
  • 関数メソッドはオブジェクトの状態に関する質問に答えるべきです
  • プロシージャメソッドはオブジェクトの状態を変更する必要があります
14
Scott Whitlock

上記の詳細な回答;短い話は、それらはすべてサブルーチンのフレーバーになるということです。各用語の意味は、プログラミング言語のコンテキストによって異なります

一般に、関数は値を返しますが、その必要はありません

メソッドは一般的ですOOP用語現在

sQLでは、ストアドプロシージャには出力がありますが、通常はエラーコードのみを返しますが、ユーザー定義関数は値(結果セットの場合もあります)を返す必要があります。

繰り返しますが、これらの用語の正確な違いは、話し相手によって異なります!

4
Steven A. Lowe

習熟度の80%は、命名法への精通度に直接関連しています。

生産性の95%は、それを説明するために使用される用語にもかかわらず、現時点で何が有用であるかを識別する能力です

SprocがあったMSSQLを使用したときを除いて、c#ですべてのメソッドを呼び出すことを好みますが、もちろん今ではPostgresを使用しており、それらは関数と呼ばれます。

2
MvcCmsJon