web-dev-qa-db-ja.com

「機能」と「手順」の違いは何ですか?

一般的に言えば、プログラミング言語ではfunctionsまたはproceduresについて聞いています。しかし、これらの用語をほぼ同じ意味で使用していることがわかりました(おそらく非常に間違っています)。

だから、私の質問は:

機能、目的、用途の違いは何ですか?

一例をいただければ幸いです。

179
rpr

関数は値を返し、プロシージャはコマンドを実行するだけです。

名前関数は数学に由来します。入力に基づいて値を計算するために使用されます。

プロシージャは、順番に実行できるコマンドのセットです。

ほとんどのプログラミング言語では、関数にも一連のコマンドを含めることができます。したがって、違いは値部分を返すことだけです。

しかし、関数をきれいに保ちたい場合(関数型言語を見てください)、関数に副作用がないことを確認する必要があります。

268
Toon Krijthe

これはコンテキストに依存します。

Pascalのような言語では、関数とプロシージャは別個のエンティティであり、値を返すか返さないかが異なります。これらは異なる動作をします。言語構文(例:プロシージャ呼び出しフォームステートメント。式内でプロシージャ呼び出しを使用することはできません。関数呼び出しはステートメントを形成しません。他のステートメントで使用する必要があります)。したがって、Pascalで育ったプログラマーはそれらを区別します。

Cに似た言語や他の多くの現代言語では、この区別はなくなりました。静的に型付けされた言語では、プロシージャは面白い戻り値型を持つ関数にすぎません。これがおそらく交換可能に使用される理由です。

関数型言語では、通常、プロシージャのようなものはありません。すべてが関数です。

37
jpalecek

Cの例:

// function
int square( int n ) {
   return n * n;
}

// procedure
void display( int n ) {
   printf( "The value is %d", n );
}

C標準では手続きについては言及しておらず、機能についてのみ言及していることに注意してください。

15
anon

一般に、手順は一連の指示です。
関数は同じでもかまいませんが、通常は結果を返します。

11
HS.

用語subroutineまたはsubprogramがあります。これは、さまざまな場所から呼び出すことができるパラメーター化されたコードを表します。

関数とプロシージャはそれらの実装です。通常、関数は値を返し、プロシージャは何も返しません。

10
sharptooth

基本的な違い

  • 関数は値を返す必要がありますが、ストアドプロシージャではオプションです。プロシージャは0またはnの値を返すことができます。
  • 関数には入力パラメータのみを指定できますが、プロシージャには入力/出力パラメータを指定できます。
  • 関数の場合、1つの入力パラメーターを取ることが必須ですが、ストアドプロシージャは0からnの入力パラメーターを取ることができます。
  • プロシージャから関数を呼び出すことはできますが、プロシージャから関数を呼び出すことはできません。

高度な違い

  • 例外はプロシージャのtry-catchブロックで処理できますが、try-catchブロックは関数では使用できません。
  • トランザクション管理はプロシージャで実行できますが、ファンクションでは実行できません。

SQLの場合:

  • プロシージャでは、SELECTおよびDML(INSERTUPDATEDELETE)ステートメントを使用できますが、関数では、SELECTステートメントのみを使用できます。
  • プロシージャはSELECTステートメントでは使用できませんが、関数はSELECTステートメントに埋め込むことができます。
  • ストアドプロシージャは、WHERE(またはHAVINGまたはSELECT)ブロック内のSQLステートメントでは使用できませんが、関数は使用できます。
  • テーブルを返す関数は、別の行セットとして扱うことができます。これは、JOINブロックで他のテーブルとともに使用できます。
  • インライン関数は、パラメーターを受け取り、JOINブロックおよびその他の行セット操作で使用できるビューと考えることができます。
6

プロシージャ内ではDML(挿入/更新/削除)ステートメントを使用できますが、関数内ではDMLステートメントを使用できません。

プロシージャには入力パラメータと出力パラメータの両方を含めることができますが、関数には入力パラメータのみを含めることができます。

ストアドプロシージャでTry-Catchブロックを使用できますが、関数ではTry-Catchブロックを使用できません。

Selectステートメントではストアドプロシージャを使用できませんが、関数ではSelectステートメントで使用できます。

ストアドプロシージャは0またはn値(最大1024)を返すことができますが、関数は1つの値のみを返すことができますが、これは必須です。

ストアドプロシージャを関数から呼び出すことはできませんが、ストアドプロシージャから関数を呼び出すことはできます。

ストアドプロシージャでトランザクションを使用できますが、機能ではトランザクションを使用できません。

Where/Having/selectセクションのどこでも、SQLステートメントでストアドプロシージャを使用することはできませんが、使用できる関数では。

ストアドプロシージャに参加することはできませんが、関数に参加することはできます。

詳細については、ここをクリックしてください... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html

5
Mukesh Kumar

より厳密には、関数fは、x = yの場合にf(x) = f(y)というプロパティに従います。つまり、同じ結果それぞれを計算します同じ引数で呼び出されたとき(したがって、システムの状態を変更しません。)

したがって、Rand()またはprint( "Hello")などは関数ではなくプロシージャです。 sqrt(2.0)は関数である必要があります。呼び出しの頻度に関係なく、目に見える効果や状態の変化はなく、常に1.41といくつかを返します。

5
Ingo

ほとんどのコンテキストでは、関数は値を返しますが、プロシージャは返しません。どちらも同じことを行うためにグループ化されたコードです。

関数型プログラミングのコンテキスト(すべての関数が値を返す)では、関数は抽象オブジェクトです:

f(x)=(1+x)
g(x)=.5*(2+x/2)

ここで、fはgと同じ関数ですが、手順は異なります。

3
xtofl

ここで言語にとらわれない場合、procedureは通常、特定の結果を確実かつべき等に達成するために必要な一連の行為を指定します。つまり、プロシージャは基本的にアルゴリズムです。

一方、関数は、大規模なプログラム内の多少独立したコードです。つまり、関数はプロシージャの実装です。

3
Anton Gogolev

関数は値を返し、プロシージャはコマンドを実行するだけです。

名前関数は数学に由来します。入力に基づいて値を計算するために使用されます。

プロシージャは、順番に実行できるコマンドのセットです。

ほとんどのプログラミング言語では、関数にも一連のコマンドを含めることができます。したがって、違いは値部分を返すことだけです。

しかし、関数をきれいに保ちたい場合(関数型言語を見てください)、関数に副作用がないことを確認する必要があります。

2
OWOEYE GBENGA

私はこれらの答えのほとんどで何度も見続けていることに反対し、関数を関数にするのは値を返すということです。

関数は、値を返すだけの古いメソッドではありません。そうではありません:メソッドが実際の関数であるためには、常に特定の入力が与えられると同じ値を返さなければなりません。関数ではないメソッドの例は、ほとんどの言語のrandomメソッドです。これは、値を返すにもかかわらず、値が常に同じとは限らないためです。

したがって、関数はよりマップに似ています(たとえば、1次元関数の場合はx -> x')。これは、通常のメソッドと関数の非常に重要な区別です。実際の関数を扱うとき、タイミングと評価される順序は、非関数では常にそうとは限らないため、どこでもかまわないからです。

次に、関数ではないが値を返すメソッドの別の例を示します。

// The following is pseudo code:
g(x) = {
  if (morning()) {
     g = 2 * x;
  }
  else {
   g = x;
  }
  return g;
}

さらに、プロシージャは値を返さないという概念に反対します。プロシージャは、関数またはメソッドについて話す特定の方法です。つまり、プロシージャが定義または実装する基になるメソッドが値を返す場合、そのプロシージャが値を返すものを推測します。 SICP から次のスニペットを例に取ります:

// We can immediately translate this definition into a recursive procedure 
// for computing Fibonacci numbers:

(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))

最近、再帰的な手続きを聞いたことがありますか?彼らは、再帰関数(実際の関数)について話していて、それが値を返し、「プロシージャ」という単語を使用しています。それでは、違いは何ですか?

(上記の意味に加えて)関数の別の考え方は、数字1のような理想の抽象的な表現としてです。手順とは、そのことの実際の実装です。個人的には互換性があると思います。

(注、リンクからこの章を読むと、把握するのが難しい概念は、関数と手続きの違いではなく、プロセスと手続きの違いであることに気付くかもしれません。再帰的手続きには、反復プロセス?)

手順の類似物はレシピです。例えば; make-piesと呼ばれるマシンがあり、このマシンが(fruit, milk, flower, eggs, sugar, heat)の成分を取り込み、このマシンがpieを返すとします。

このマシンの表現は次のようになります

make-pies (fruit, milk, flower, eggs, sugar, heat) = {
   return (heat (add fruit (mix eggs flower milk)))
}

もちろん、それがパイを作る唯一の方法ではありません。

この場合、次のことがわかります。

A       function     is to a     machine
as a    procedure    is to a     recipe
as      attributes   are to      ingredients
as      output       is to       product

その類推は問題ありませんが、コンピュータープログラムを扱っているときはすべてが抽象化されていることを考慮に入れると、破綻します。そのため、マシンのレシピの場合とは異なり、それ自体が抽象化されている2つのことを比較しています。同じことかもしれない2つのこと。そして、私は彼らが(すべての意図と目的のために)同じものだと思います。

1
dkinzer

関数はsqlステートメント内で使用できますが、プロシージャはsqlステートメント内では使用できません。

Insert、Update、およびCreateステートメントを関数に含めることはできませんが、プロシージャにはこれらのステートメントを含めることができます。

プロシージャはトランザクションをサポートしますが、関数はトランザクションをサポートしません。

関数は1つの値のみを返す必要があります(もう1つはOUT変数で返すことができます)が、プロシージャは同じ数のデータセットと戻り値を返します。

関数とプロシージャの両方の実行計画はキャッシュされるため、パフォーマンスは両方の場合で同じです。

1
pulak

dbのコンテキストでは、ストアドプロシージャはプリコンパイル済み実行計画であり、as関数はそうではありません。

0
Awais

С#/ Javaに関しては、functionは特定の値を返すコードのブロックですが、手順voidを返すコードのブロックです=(なし)。 C#/ Javaでは、関数とプロシージャの両方がmethodsと呼ばれることがよくあります。

    //This is a function
    public DateTime GetCurrentDate()
    {
        return DateTime.Now.Date;
    }

    //This is a procedure(always return void)
    public void LogMessage()
    {
        Console.WriteLine("Just an example message.");
    }
0
user2771704