ObjectSquare [1999 年 2 月号]

[Happy Squeaking!!]


6.Squeak 演習:ポリモルフィズムに親しむ

6.3 実際の ifTrue:ifFalse は?


今までSmalltalkのif文といっていたifTrue:ifFalse: メソッドも、実は基本的に同じ方法を使用しています。

Boolean
	True
	False

というクラス階層が形成されており、ifTrue:ifFalse:といったメソッドがポリモルフィズムを使って定義されているのです。
さっそく調べてみましょう。
メソッドの名前がまずわかっていて、そこから実装されているクラスをみたいといったときには、Squeakでは、Selector Finderというツールを使うと便利です。

メインメニューの"open" -> "selector finder"を選択します。

以下のような画面が立ち上がります。

Selector Finderの起動

左上のペインにifTrue:ifFalse:と打ち込んで、右クリックでポップアップメニューを出し"accept"してみてください。

Selector FinderによるifTrue:ifFalse:の検索

検索結果は右のリストに表示されます。

検索結果の表示

クリックするとブラウザが開き、メソッドの内容を見ることができます。

先ほどのBooleanConditionとほぼ同じような実装がされていることが確認できるでしょう。

例えばTrueでは以下のようになっています。(コメントは省略)

ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock 

	^trueAlternativeBlock value

引数は先ほど作成したTranscriptActionではなく、BlockContextというクラスになります。
このクラスのインスタンスは、[]で括ることでリテラルとしてすぐに作成できます。[]の中には任意のSmalltalkの表現をかくことができます。valueメッセージが送られることで、中に書いた表現が実行されます。([]はSmalltalkではブロックと呼ばれます)。

例:
| helloBlock |
helloBlock := [ Transcript cr; show: 'HelloWorld' ].
Transcript cr; show: 'not yet done'.
helloBlock value.

上記の例では、一行目では単にBlockContextのインスタンスを生成したのみで、中身の実行はされていません。三行目のvalueが送られて、初めて実行になります。

BloclkContext(実装によってはBlockClosure)はSmalltalkをSmalltalkたらしめている非常に強力な機構なのですが、ここではブロック自体についてこれ以上の解説はしません。

IfTrue: [] などで引数として与える[]も当然このブロックです。
以下のコードを実行してみてください。

| helloBlock |
helloBlock := [ Transcript cr; show: 'HelloWorld' ].
(1<3) ifTrue: helloBlock.

1<3の結果、返ってくるのは、trueオブジェクトです。これはTrueクラスのインスタンスに他なりません。(falseオブジェクトFalseクラスのインスタンスです)。True、Falseのそれぞれのポリモルフィズムを利用した振る舞いの変化によって制御構造が実現できるているのが確認できます。

ポリモルフィズムをうまく使うことでif文の入り込む煩雑なコードを排除していくことができます。Smalltalkにおいては、if文ですらポリモルフィズムを使って実現しているので、実質if文はゼロということもできます。ポリモルフィズムを究極まで使ってみせている驚きの姿です。

ご安心ください。実際には、ifTrue:ifFalse:のようなメッセージの送信を実行時に正直におこなっていたのでは、パフォーマンスが遅くなるので、Squeakを含むSmalltalkの実装の多くはコンパイル時にこの表現をインライン化して直接バイトコードにしています。(つまりこのメソッドは通常は起動されません)。perform:というインライン化を防ぐような書き方をすることにより、ifTrue:ifFalse:の本当の送信を行なわせることもできますが、今回の範囲外です。

### ### ### ### ### ### ### ### ### ### ### ### ### ###

さて、今回で基本部分は一応終了です。ポリモルフィズムまで理解できれば、オブジェクト指向の初級レベルはクリアできたといえるでしょう。
次回は、メタ機能を説明していきます。他のオブジェクト指向言語ではみられないSmalltakならではパワーも垣間みることができます。お楽しみに。


© 1999-2001 OGIS-RI Co., Ltd.

Prev.

Index

Next