創発:無機体から作られる有機体4分33秒的なるもの

2016年07月14日

できるだけわかりやすく説明してみるという実験:関数、メソッド

前回の「できるだけわかりやすく説明してみるという実験」シリーズでは、サブルーチンについて説明した。
プログラムの大きな流れの中で、繰り返し何度も出てくる一連の処理を、「サブルーチン」という共通に使うことができる処理にして、それを各所で使う、という知恵であった。



このサブルーチンというものがある値を受け取って、戻り値を持つようになったものが「関数」である。
「戻り値」とは、サブルーチンの処理結果が何らかの値を返す、ということである。
関数には、値を受け取らないものもあり、戻り値を返さないものもある。両方ないものもある。
戻り値を返さない関数はサブルーチンと同じである。

たとえば、「ある文字列を受け取って、それをディスクに記録する」という関数があった場合、そこで記録された文字列に含まれていた文字数が分かればそれを使うことができることがある。
あるいは単に「受け取った文字列に含まれる文字数を数えてそれを戻り値として返す」という関数もありうる。

値を受け取らずに、戻り値だけを持つ関数の例としては、現在時刻を返す関数があげられる。
サザンオールスターズの勝手にシンドバットである。
この場合は「いま何時?」が関数で、「そうねだいたいね」が戻り値である。ここには受け渡す値はない。
一見「いま何時?」が受け渡す値のように見えるかもしれない。
2回目に「いま何時?」と同じように聞いたら「ちょっとまってて」と返ってくる。3回めは「まだ早い」である。
これは受け渡す値が変わったからではない。
歌の流れである。
呼び出している関数は同じで、受け渡す値はない。

本来の正しく動作するはずの現在時刻を返す関数についても同じで、「いま何時?」と呼び出すと、その時の時刻を返す。毎回違う値が返ってくるだろう。

つまりプログラムにおける関数とは、数学でいう「関数」と同様、「ある値を与えれば(あるいは与えなくても)、それを計算した結果が得られる」というもの、という側面と、プログラムの大きな流れを構成する小さな一連の処理、というサブルーチンとしての側面をあわせ持つものである。

さらにこの「関数」に似たもので「メソッド」というものがある。
これはオブジェクト指向言語で使われるもので、「オブジェクトが自分自身の処理をするための関数」とでも言うべきものである。
オブジェクト指向以前の世代のプログラマーは時々このメソッドのことを「関数」と言ってしまって、若いプログラマーから陰でバカにされることがあるが、本質的には「メソッド」は「関数」である。ただ言い方がナウいだけである。
。。。などと言うのは僕が陰でバカにされている年寄りプログラマー、というだけのことかもしれないが。

とにかく、「メソッド」と「関数」を混同して使うのは、オブジェクト指向をちゃんと理解していないか、あるいはただ単に年寄りプログラマーだからである。
オブジェクト指向を理解しているのであれば、「メソッド」のことを「関数」と言ってもいいと僕は思っている。別に年寄りである必要もない。

それと、「値を与えなくても戻り値を返す関数の例」として「勝手にシンドバット」を挙げるのは、やはり年寄りである。

OLランキングで1位になりたい!賛同していただける方は下記をクリック!

コメントする

名前
URL
 
  絵文字
 
 
創発:無機体から作られる有機体4分33秒的なるもの