Blank?=False

「呉下の阿蒙にあらず」をモットーにしたITエンジニアの日々

関数、メソッド、プロシージャ。それぞれの違いは?

どうもこんばんわ。
プログラミングだと関数を作って・・・とかメソッドを作って・・・とか、ありますよね。
これらので処理の1まとまりを表現する言葉は思いつく限り

  • 関数
  • メソッド
  • プロシージャ

の4つがあります。

これらの違い、ちゃんと説明できますか?
自分はちょっと自信がありません。なので調べてみました。

関数

ほとんどのプログラミング言語で聞く言葉です。
特にC言語などの手続き型言語ではよく聞きます。

MSDNC#プログラミングガイドにはこう書かれています。

関数とは、何らかの操作を実行するコードのブロックです。 関数 (C++)


処理のひとまとまり。おわり。

メソッド

主にオブジェクト指向言語で聞く言葉です。
MSDNC#プログラミングガイドにはこう書かれています。

メソッドは、一連のステートメントが含まれているコード ブロックです。 メソッド (C# プログラミング ガイド)


ただし、匿名関数という機能がC#にはあるので、関数という言葉がないわけではないようです。
C#ではオブジェクト以外の手続きもメソッドとなるのか、もしかしたらRubyと同じように全部オブジェクトなのかは ちょっとわかりません。


e-wordsというIT辞書サイトでは別の意味でした。

メソッドとは、オブジェクト指向プログラミングにおいて、各オブジェクトが持っている自身に対する操作。
オブジェクトは「データ」と「手続き」から成っているが、その「手続き」の部分に当たる。プログラミング言語によっては「メンバ関数」と呼ばれることもある。
メソッドとは|method|メンバ関数|member function − 意味 / 定義 / 解説 / 説明 : IT用語辞典


これは自分が持っているイメージに近いものです。
人によってイメージがオブジェクトの手続きだったりオブジェクト指向言語の手続きだったりになってるのかな。

プロシージャ

VB界隈とデータベースで聞く言葉です。
データベースではストアドプロシージャですね。

VB.netだと、こういう構文です。

Public Sub Foo
  Dim i As Integer
  i = 0
end sub

Subとあるあたり、サブルーチンが元になってるのかもしれません。

また、WikiPediaでは

プロシージャ (procedure)とは、プログラミングにおいて複数の処理を一つにまとめたものをいう

また、関数と呼ばれることもある
プロシージャ - Wikipedia


ほぼ関数と同じと思って良さそうです。

まとめ

結局、みんな同じような意味で良さそうですよね。言語が違えば言葉も変わるということでしょうか。
個人的には驚き最小の法則に従って統一して欲しいと思いますが・・・

同じ言語であっても人によってはメンバ関数だったりメソッドだったりと統一されていませんが、それは誤用とするかは ちょっと難しいところです。

個人的には、言語の公式ドキュメントの表記に合わせればいいと思います。
ただし、複数言語に共通するようなこと(リファクタリングデザインパターンとか)は、 悩むと思いますが表記を統一してしまったほうがいいでしょう。

とりあえず手続き型言語関数オブジェクト指向言語メソッドVB系はプロシージャとおぼえておけば良さそうです。
迷ったらとりあえず関数と言っとけばだいたい伝わるんじゃないかな。

なんでこんなにバラバラなの?

おそらくですが、最初アルゴリズムのサブルーチンという言葉から派生して、 1つの問題を解くものという意味で関数という言葉が生まれたんだと思います。

その後、オブジェクト指向言語が出てきて、関数は計算だからアクセサも関数というのはおかしくないか?ということで 方式・方法を表すメソッドという言葉を使うようになったのかなと。

VB界隈のプロシージャですがこれはVB言語は比較的簡単にという目的で作られているので、 ファンクションと混ざらないように2つの言葉を作ったんでしょうか。
なんとなくですが、最近の言語はメソッドと言うことが多いのかな、と思いました。