言霊の國

名詞の王国 - あどけない話

概念を単位とした場合、「ある動作」も概念として扱え、概念には名前を付けられる。たとえば「○○するコト」と言いますよね?

名前を付けた概念は友人帳に記載されいつでも使役することが出来ます。


* * *


オブジェクト指向言語のはなし によれば、Simula によって発明された クラスとオブジェクトは、元々はAlgolのブロックとその活性化レコードを拡張したものです。

ブロックにはいくつかのデータ定義(ローカル変数)と、それを操作するコードが含まれていて、プログラムの実行がブロックに入ると、そのローカル変数が使用するメモリ空間を持つ活性化レコードが自動的に実行時スタック上に作成されます。

活性化レコードはブロックに入るときに自動的に作られブロックから出るとき自動的に破棄されますが*1、この連動を辞めちゃおうというアプローチで生まれたのがクラスとオブジェクトです。活性化レコードはインスタンスに、はローカル変数に相当します。ブロックに名前をつけてどこからでも呼べるようにしたものがサブルーチンです。

プログラムに構造を持たせるための 箱(というか枠組?)を構造化エンティティと言いますが、サブルーチンという構造化エンティティをより汎化した クラス/オブジェクトは、名詞のようにも動詞のようにも扱うことが出来る強い構造化エンティティです。

たとえば、Smalltalk の ブロック [...] は、C の {...} とまったく同じ物で、アルゴリズムを区切り取り、同時にそのアルゴリズム専用の閉じた変数を持つことが出来ます。ただ一つ違うのは、ブロックもオブジェクトであるということ。だから、未評価のまま変数に入れたり、引数に渡したり出来ます。(オブジェクトでブロックを表現できるのは、もともとブロックを汎化したものがクラス/オブジェクトである以上、当たり前といえば当たり前ですね)



さて、名詞の王国 では、

オブジェクト指向プログラミング(OOP)は、まず最初に名詞を置く。どうして、話の一部として具象化した部分を置くのか?どうして、一つの概念が、他に優先されるのか?突然 OOP が、我々が考えているほど動詞は重要でないと決めた訳ではあるまいし。

といいます。しかし、Smalltalk はOOPL ですが、名詞が動詞を携えているわけではありません。

ブロックは アルゴリズムであり、名前が無く、王国の身分制度上は紛れもない「動詞」です。しかしオブジェクトです。

この 「動詞」であるオブジェクトを、王国身分制度上の「名詞」である「値」にするために私たちが出来ることは、彼に 「value」と囁いてあげることだけです。Smalltalk では ブロックを評価し値を得る為には ブロックに value というメッセージを与えなければいけない。決して execute とか run では無いのです。


* * *


Java が もし名詞の王国に見えるのなら、それは多分、動詞が「モノ」で無いからです。

OOPL が「純粋」であるか?という問いとして、「汝、全ての値がオブジェクトであるか」がありました。

しかし、この「すべて」は決して「オブジェクトでない値があるか」という意味のすべてではなく、掛け値なしに「全てがオブジェクトであるか」であり、そこには値だけでなくアルゴリズムも含まれます*2

OOP が、我々が考えているほど動詞は重要でないと決めた訳ではあるまいし。


いいえ。OOP の神の前では、値もアルゴリズムも 全て平等です。

もし Java王 が OOP の神から道を違え、奴隷の国を作ったってしまったというのが事実だとするならば。王が道を踏み謝ったのは、もしかしたら「メッセージ」を忘れてしまったからかもしれません。

値もアルゴリズムも平等にオブジェクトに所有され、包まれ、オブジェクトそのものであります。そして、メッセージのみにより、違いのオブジェクトに影響を及ぼすことができる、と言うOOP神の教えを忘れてしまったのは、きっと「メソッドをコールすればいいよ」と、でっかい蛇*3が囁いたのでしょう。




へたれり

単に 「名詞の王国」が面白かったので、言葉遊びをしてみただけのエントリーです。

これを読んで、なぜか頭に 夏目友人帳の「ふっ」ってのが浮かんで、次に「八百万の神様」とというか、便所の神様までいる なんでも神様になってしまうイメージが浮かんで、でも のりのりでエントリーを書いてみたら、全然違う話になっていたという(w

しかも途中で「Smalltalk 最高! メッセージメタファは神! あー、もう『メソッドコール』なんてダサダサ!」・・・なんて変なモノが降りて来ちゃった..orz (気にしないでください。単なる宗教です。)



さて、少しまじめな話をすると。「名詞の王国」を読んで「あーっ、Javaってそうだよね」とか、「そんなわきゃないやい」とか思えるほど 私は Java を知りません。だからJavaについてはノーコメント(上で若干いじってますが、知ったかブリの戯言です)。ただ、「OOP = 名詞の王国」というのは「そんなわきゃない」と思ったので、ちょっと一言言ってみたかったんです。

名詞の王国の話は、関数型だとかOOPだとか そういうのとは関係ない、単に命名規約の話だなぁと思うわけです。というのも Smalltalk の メソッド名(というかセレクタ名) は、必ずしも「動詞ばっか」というわけないからです。(たとえば、先ほどの value とか)

わたしの大好きな サクサクSmalltalk から、メソッドのネーミングルールを引用してみます。

単に変数にアクセスするためだけのメソッドは,アクセスする変数名に対応して名前がつけられるべきである。たとえば, size と呼ばれるインスタンス変数がある場合,その値を返すメソッドは size となり, returnSize や getSize や giveSize などとはならない

getHogehoge いくない!(いや、いくないわけじゃないのですが)

さらに, メソッド名は命令的にするよりも,宣言的にすべきである。つまり, computeTotalArea よりも totalArea を使う方がよいということである。このようにするとメソッド名は返り値をより明示的に示すことになる。これが大事なのは,メッセージをカスケードした場合である。次の2つの式を比べてみよう。

CricketPitch area asSquareMatres.
CricketPitch giveAria convertToSquareMetres.

今は微妙な違いにしか思われないかもしれないが,Smalltalk プログラマにとっては最初の式は 2番目のものよりずっと明確である。本当に convert のような言葉を使いたい場合は, convertedToSquereMetres のように過去分詞を使うべきである。

というわけでむしろ動詞じゃないというかんじ。で、動詞的な場合は

PaintBox drawLineFrom: x to: y
 usingPen: aPen inColour: #red.

この場合注意することは,メソッドの名前を宣言的に付けるという決まりを破っているということである(lineFrom の代わりに drawLineFrom にした)。これは,メソッドの返値ではなく副作用(引かれた線)に興味があるからである。

です。

クラス名とかオブジェクト名の方は、概念に名前を付ける以上、名詞化しやすいのは普通のことかなぁと思ったり。

(ああ、明後日のことを言ってないといいなぁ、私)

*1:この自動の振る舞いによって、アルゴリズムとデータの組が、あたかもアルゴリズムそのものに見えます

*2:Smalltalk では「全て」が 本当に全てに。クラスもメッセージも、それどころかコンピュータ上の何もかも――ファイルってなぁに?ってくらい、病的に徹底されます。はっきり言って変態にも程があります(誉め言葉)

*3:でも、Python の関数はオブジェクトですけどね。...って、さっぱり注釈じゃ無い