« 【準備中】連載: Smalltalk use: better《12》はやくメッセージになりたいっ | トップページ | 連載: Smalltalk use: better《14》true/false が Boolean でないのは »

2006年5月24日 (水)

連載: Smalltalk use: better《13》true/false が Boolean だったら

キーワード ◆ Boolean・False・ifTrue:・ifTrue:ifFalse:・not・True

※ PDF でご覧になるなら ⇒ 「piyo60524.pdf」をダウンロード

------------ 序 ------------

難しいのは
二通りのやり方の違いがすぐには表面化しないことだ
違いはそのプログラムを
保守あるいは変更する段になって見えてくる

Brian Richter, 1994

◆ 引き続き、true/false を Boolean のインスタンスではなく、True/False のインスタンスとする場合について考察します。これら二通りのやり方の違いを理解することで、クラス「思考」から、オブジェクト「思考」への扉を開きます。

------------ 本文 ------------
 

◆ メッセージ not の使い方は、すでに紹介しました。今度は、これをどのように実現するかについて考察します。true/false は、Boolean のインスタンスではなく、それぞれ True/False のインスタンスです。ここで、true/false が、Boolean のインスタンスであると定します。すると、メッセージ not は、どのように実現されるでしょうか。

not := [:bool | | result |
    bool == true ifTrue: [result := false].
    bool == false ifTrue: [result := true].
    result].
not value: true.          "false" 
not value: false.          "true"

true not          "false" 
false not          "true"

60524a_6

 

◆ メッセージ not に相当するブロック not を用意します。これにメッセージ value: true を送ると、その否定を表す false が得られます。このとき、メッセージ式 not value: true は、true not に相当します。

  1. ブロック引数 bool は、Boolean のインスタンスと仮定した true/false を束縛します。
  2. bool が参照するオブジェクトが true か false かを判定して、その結果として得られるオブジェクト true/false に、ifTrue: を伴うメッセージを送ります。
  3. 一時変数 result は、true/false を束縛するので、どちらかがリターンオブジェクトとなります。

◆ ここで注意して欲しいのは、リターンオブジェクトを用意するのは、true/false の役割であるということです。これは、クラス Boolean において、ifTrue: が実現されるべきであることを示唆します。

not := [:bool | bool ifTrue: [false] ifFalse: [true]].
not value: true.          "false" 
not value: false.          "true"   

true not          "false" 
false not          "true"

60524b_3

 

◆ ifTrue: の代わりに、ifTrue:ifFalse: を使って実現すると、どうなるでしょう。

  1. ブロック引数 bool は、Boolean のインスタンスと仮定した true/false を束縛します。
  2. bool が参照するオブジェクトに、ifTrue:ifFalse: を伴うメッセージを送ります。
  3. true/false のどちらかがリターンオブジェクトとなります。

◆ ここで注意して欲しいのは、リターンオブジェクトを用意するのは、true/false の役割であるということです。これは、クラス Boolean において、ifTrue:ifFalse: が実現されるべきであることを示唆します。

◆ このように、クラス Boolean において実現しようとすると、true/false のどちらであるかを識別する必要があります。では、true/false が、それぞれ True/False のインスタンスならどうなるでしょう。

60524c_1

 

◆ まず、クラス True で実現する場合について考えます。このとき、false について考慮する必要はありません。true が、そのクラスの唯一のインスタンスなので、ごく自然であり必然です。すると、メッセージ value: true を受け取ったときに、単に、リターンオブジェクト false を用意するだけでよくなります。

60524d_2

 

◆ 次に、クラス False で実現する場合について考えます。このとき、true について考慮する必要はありません。false が、そのクラスの唯一のインスタンスなので、ごく自然であり必然です。すると、メッセージ value: false を受け取ったときに、単に、リターンオブジェクト true を用意するだけでよくなります。

==================================
真樹育未 著 ◆ 監修:小泉ひよ子とタマゴ倶楽部

|

« 【準備中】連載: Smalltalk use: better《12》はやくメッセージになりたいっ | トップページ | 連載: Smalltalk use: better《14》true/false が Boolean でないのは »

Squeak/Smalltalk」カテゴリの記事

.連載: Smalltalk use: better」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 連載: Smalltalk use: better《13》true/false が Boolean だったら:

« 【準備中】連載: Smalltalk use: better《12》はやくメッセージになりたいっ | トップページ | 連載: Smalltalk use: better《14》true/false が Boolean でないのは »