VBオブジェクト指向プログラミング講座 第6回 手続き、関数、メソッドの違いを知る
オブジェクト指向プログラミングの基本要素はメソッドです。でも、メソッドを本当に理解していますか?経験者の中にも、理解していない人が結構いるようです。そんなメソッドについてちょっとだけ詳しく学びましょう。
手続き(プロシージャ)、関数(ファンクション)、操作(メソッド)の違いは、プログラムとして可視化すると分かります。
Structure Point
'フィールド
Public X As Integer
Public Y As Integer
'関数で使用するコンストラクタ
Public Sub New(ByVal x As Integer, ByVal y As Integer)
Me.X = x
Me.Y = y
End Sub
'内容を表示
Public Sub Print()
Console.WriteLine("X = {0}, Y = {1}", Me.X, Me.Y)
End Sub
End Structure
Module Module1
'加算手続き
Sub AddSub(
ByRef p As Point, ByVal x As Integer, ByVal y As Integer)
p.X += x
p.Y += y
End Sub
'加算関数
Function AddFunc(
ByVal p As Point, ByVal x As Integer, ByVal y As Integer)
As Point
Dim result As New Point(p.X + x, p.Y + y)
Return result
End Function
Sub Main()
'手続きは処理順序に依存
Dim a As New Point()
Console.WriteLine("処理前の値")
a.Print()
AddSub(a, 10, 10)
Console.WriteLine("処理後の値")
a.Print()
Console.WriteLine()
'関数は処理順序に依存しない
Dim b As New Point()
Console.WriteLine("処理前の値")
b.Print()
Dim c As Point = AddFunc(b, 10, 10)
Console.WriteLine("処理後の値")
b.Print() '値が変わらない
Console.WriteLine("新しい値")
c.Print()
Console.ReadLine()
End Sub
End Module
プログラムを見ると、手続き、関数、メソッドに明確な違いがある事が分かると思います。これから個別に解説します。手続き(プロシージャ)は、引数として渡されたデータ構造の値を変える閉じた操作です。「閉じている」とは、環境に変化を与える操作の事を指しています。手続きを呼び出すと、プログラムの環境(データ構造など)に変化がもたらされます。従って、手続きの処理結果は、処理する順番に依存します。サンプルを例に取り具体的に書くと、Printメソッドの結果はAddSubプロシージャの呼び出し有無で変化しています。
関数(ファンクション)は、処理結果を返す開いた操作です。「開いている」は、「閉じている」の反対で、プログラムの環境に影響を与えません。余計な事をしない限り、どこで呼び出しても処理結果は変わりません。従って、関数は処理の実行順序に依存しません。
メソッド(操作)は、オブジェクトが持つ手続もしくは関数です。サンプルで確認できるように、Printメソッドは引数としてPointオブジェクトのインスタンスを受け取りません。オブジェクトが持つとは、この事を表現しています。
細かい事を言えば他にも色々ありますが、ひとまず今回解説した分だけ押えておきましょう。違いを分かっていれば、オブジェクト設計にそって上手に実装できます。ちなみに私のお勧めは、関数の方のメソッドを多用するスタイルです。並列プログラミングが一般となった今、処理結果が実行順序に依存するのは問題です。また、処理順序に依存しない方が、プログラムを単独で扱えるのでテストがやりやすいです。ただし、関数を多用するスタイルは、インスタンスを大量に発生させるので注意が必要です。