« 連載: Smalltalk use: better《10》基本要素の意義:式とは★ | トップページ | 【準備中】連載: Smalltalk use: better《12》はやくメッセージになりたいっ »

2006年5月22日 (月)

連載: Smalltalk use: better《11》はやくオブジェクトになりたいっ

キーワード ◆ Boolean・class・false・False・nil・not・pseudo variable・self・sole instance・super・superclass・thisContext・true・True・グリーンカード・コンパイラー・メソッド呼び出し・メタクラス・ラッパー・基本データ型・疑似変数・妖怪人間ベム 

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

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

はやく人間になりたいっ!

「妖怪人間ベム」1968〜1969年・フジテレビ系列

◆ ひととおり簡単に文法を紹介したので、今週からは、プログラミング言語の背景にある概念や文化について紹介します。最初は、true/false について再考します。何が真であり何が偽であるかは、すべての根幹をなす概念のひとつですので、これを避けては通れません。

◆ Java の世界では、true/false はオブジェクトとは認めてもらえない半人前の存在です。それが証拠に、メソッド呼び出しには応じてくれません。Smalltalk の世界では、true/false は一人前のオブジェクトとして扱われます。それが証拠に、メッセージを投げかけると返事をしてくれます。「はやくオブジェクトになりたいっ!」今日は、そんな true/false の声に耳を傾けてみます。

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

true/false ◆「すべてがオブジェクト」という世界では、true/false もその例外ではありません。

true class                    "True"
false class                    "False"
True superclass                    "Boolean"
False superclass                    "Boolean"

60522a◆ true/false がオブジェクトなら、そのクラスの実体が存在するはずです。任意のインスタンスが属するクラスの実体を得るには、メッセージ class を送るだけです。すると、true のクラスは True であり、false のクラスは False であることが分ります。もちろん、識別子 True/False は変数名であり、クラスの実体を束縛するので、これらを容易に参照できます。

◆ True/False は、オブジェクトでもあり、クラスとしての特徴も持ちます。クラスなら、親クラスが存在するはずです。メッセージ superclass を送ると、その親クラスが得られます。すると、True/False に共通の親クラスは、Boolean であることが分ります。

◆ Java の(非)常識からすると、true/false は、Boolean のインスタンスでも良さそうなものです。True/False など冗長ではないか…との声が聞こえてきそうな気配です。もちろん、それにはそれなりの理由があります。そして、それを理解することが、真のオブジェクト指向の世界へと導きます。ただひとつのオブジェクトのために、クラスを個別に用意するとは、なんて贅沢なのでしょう。でも、こうすると、if 文をメソッドとしてスマートに定義できるのです。

◆ それでは、クラス True には、ほかにどのようなインスタンスがあるのでしょうか。残念ながら、true 以外にはインスタンスを持ちません。このように、あるクラスに属する、ただひとつのインスタンスを sole instance と言います。sole instance の例には、true, false, nil などがあります。

※ Java の世界では、true/false は一人前のオブジェクトとは認めてもらえず、半人前の存在です。それが証拠に、true.toString() はエラーとなり、オブジェクト市民には与えられている権利である、メソッド呼び出しさえままなりません。System.out.println("true: "+true) では、コンパイラーの介護によって、オブジェクト市民(ここでは、グリーンカードを持つ String インスタンス)との同席が許されます。基本データ型は、オブジェクト指向の世界では、オブジェクト市民の子供たちに紛れて、みそっかすとして扱われます。たとえば、この指とまれと言われてコレクションごっこをしようとしても、親切なラッパーの加護がなければ、仲間に混ぜてもらえません。気配りの勧めを常とする autoboxing は、そんな形見の狭い思いをさせたくないので、基本データ型が傷つかないように、陰日向になってかばってあげてくれるのです。

※ C# の世界では、基本データ型にもグリーンカードが与えられ、一人前のオブジェクトとの同席が許されます。しかし、null などのみそっかすには、平等の権利が与えられていません。

◆ オブジェクトを参照するには、3つの方法がありました。
 (1) リテラル (2) 変数 (3) メッセージ式
では、true/false は、どれに相当するのでしょうか。正解は、変数です。つまり、変数 true/false は、それぞれ真偽を表すオブジェクトを束縛します。これらの変数は、疑似変数〔pseudo variable〕と呼ばれます。ただし、これらは変数でありながら、代入ができません。代入できないなら定数と同じでは…という声が聞こえてきそうですが、残念ながらリテラルではありません。これらの疑似変数には、Smalltalk が起動されたときに、対象となるオブジェクトが代入され、それ以降の代入は許されないのです。true/false は物事の真理であり、プログラマーが安易に犯してはならない領域なのです。

※ すべてのクラスオブジェクトも、それぞれのメタクラスの sole instance です。たとえば、クラス String は、メタクラス String class の sole instance です。

60522b

※ 他に、nil、self、super、thisContext などの疑似変数があります。thisContext について理解することが、開発環境のみならず、プログラマー自身もオブジェクトと見なすという、真の統合開発環境へと誘います。

true not          "false"
false not          "true"

60522c◆ メッセージ not は、論理否定を表すものです。オブジェクト true にメッセージ not を送ると、その否定を表すオブジェクト false が得られます。オブジェクト false にメッセージ not を送ると、その否定を表すオブジェクト true が得られます。ここで注目して欲しいのは、メッセージを受け取ったオブジェクト true/false が、どのオブジェクトを返すべきかを決定しているということです。つまり、メッセージ not に対応するメソッドは、true/false が属するクラスで定義されることが期待されます。

3 < 4                    "true"
(3 < 4) not          "false"

60522d ◆ メッセージ < は、大小比較を表すものです。オブジェクト 3 にメッセージ < 4 を送ると、大小を比較した結果を表すオブジェクト true が得られます。すると、メッセージ not を送るべき相手は、true となることが分ります。

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

|

« 連載: Smalltalk use: better《10》基本要素の意義:式とは★ | トップページ | 【準備中】連載: Smalltalk use: better《12》はやくメッセージになりたいっ »

JML/Java/Eclipse」カテゴリの記事

Squeak/Smalltalk」カテゴリの記事

C#/Visual Studio」カテゴリの記事

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

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: 連載: Smalltalk use: better《11》はやくオブジェクトになりたいっ:

« 連載: Smalltalk use: better《10》基本要素の意義:式とは★ | トップページ | 【準備中】連載: Smalltalk use: better《12》はやくメッセージになりたいっ »