vieweditattachhistorytopchangessearchhelp

第33回


■SqueakではじめるSmalltalk入門   第33回


 本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。

 Smalltalkでは、「Object」クラスを頂点とする単一継承の継承ツリーの中にすべてクラスが組み込まれています【註】。この継承ツリーをたどりながらそれぞれの定義を見てゆくことで、注目するクラスに属するオブジェクトがどんな特性を有するのかをよりよく知ることができます。

 コレクションは、「Object」を直接のスーパークラスとする「Collection」を頂点に巨大なサブツリーを形成します。前回挙げた「Array」「OrderedCollection」「Dictionary」「Set」「Bag」「Symbol」「String」「Interval」「SortedCollection」も、そのサブツリーの中のどこかに定義されています。念のため、たがいの位置関係を次に示しておきましょう。「字下げ」により、そのクラスが、ひとつ上の字下げレベルのクラスのサブクラスであることを表現しています(たとえば「String」は「ArrayedCollection」のサブクラスで「Symbol」のスーパークラスである、といった具合に)。

Collection
 SequenceableCollection
  ArrayedCollection
   Array
   String
    Symbol
  OrderedCollection
   SortedCollection
  Interval
 Set
  Dictionary
 Bag


 ここで新しく登場したSequenceableCollectionとArrayedCollectionは、Collection同様、それぞれの直下のサブクラス群を束ねるために存在する抽象クラスです。抽象クラスというのは、そのインスタンスの生成・使用は想定しないけれど、他のクラスのスーパークラスになることで、全体の継承関係を整理する目的で存在する特殊なクラスのことを言います。C++やEiffelなどでは、もっぱら多態性実現のために、型宣言において頻繁に用いられますが、Smalltalkでは完全に裏方に徹しており、せいぜいサブクラスに共通するメソッドを保持する場所…程度の意味しかないため、コード中でその名を見ることはほとんどないと思います。

 ではまずSmalltalkのコレクションオブジェクトの基本的な機能を知るために、Collectionの定義を覗いてみましょう。

 文字が入力できる適当な場所で「Collection」とタイプして選択後、browse it(cmd+B)してCollectionの定義を呼び出します。

[fig.A]ブラウザでCollectionクラスを選択したところ。
Uploaded Image: 33a.png

 ちなみに、ここで下のコードペインに目をやると、CollectionがObjectの直接のサブクラスであることが確認できます。

Object subclass: #Collection
   instanceVariableNames: ''
   classVariableNames: 'RandomForPicking '
   poolDictionaries: ''
   category: 'Collections-Abstract'


 また、この状態で、上段左から2番目のペイン下にある「?」ボタンを繰り返しクリックすることで、Collectionクラスのコメント、Collectionクラスを中心に見た、巨大なスーパークラス群およびサブクラス群が形成する巨大なサブツリーをトグルさせながら閲覧することも可能です。

[fig.B]Collectionクラスのコメントを呼び出したところ。
Uploaded Image: 33b.png

[fig.C]Collectionを含むサブツリーを一覧したところ。
Uploaded Image: 33c.png

 本題に戻ります(なお、作業を続けるにあたって、上の「?」ボタンのトグル状態は気にする必要はありません)。まず上段左から3番目のペイン(プロトコルリスト、あるいは、メソッドカテゴリリスト、メッセージカテゴリリストとも言う)からaccessingをクリックして選択してください。

[fig.D]accessingプロトコルを選択したところ。
Uploaded Image: 33d.png

 すると、accessingプロトコルに属するメソッド名(セレクタ)が続く右側のペインで一覧できます。ここでコレクション共通の機能として注目したいのは、#sizeと#atRandomです。コレクションに対して、sizeというメッセージを送信することで要素数を、atRandomというメッセージを送信することで任意の要素を取り出すことが可能です。

Collection allInstances class   " => Array "
Collection allInsntaces size    " an Arrayの要素数確認 "
($a to: $z) size                " an Intervalの要素数確認 "
#('this' #is $a 10) atRandom    " an Arrayから任意の要素選択 "
'squeak' atRandom               " a Stringから任意の文字選択 "
($a to: $z) atRandom " $aから$zまでのa Characterから任意選択 "


 次のadaptingプロトコルはいったん無視して、addingプロトコルに属するメソッドを見ます。ここで注目しておきたいのは、#add:、#addAll:です。「add: newObject」というメッセージ送信により、コレクションへの要素(newObject)の追加、「addAll: aCollection」によりaCollectionに含まれる要素の追加を期待します。

| collection |
collection _ OrderedCollection new.
collection add: 'this'.
collection addAll: #(#is $a 10).
^ collection   " => an OrderedCollection('this' #is $a 10) "


 ただし、こうした要素の追加を期待するメッセージ送信は、当然、要素の追加を許すタイプのコレクションにしか通用しないので注意してください。なお、要素の追加ができないan Array、a String、a Symbol、an Intervalなどに、これらの要素追加用メッセージを送ると例外が生じます。

'string' add: $s
  " => Error: This message is not appropriate for this object "


 次回も引き続き、Collectionのプロトコルを見つつ、コレクションに共通な機能をさぐってゆきましょう。

註: SqueakシステムではObjectのスーパークラスとして、新たにProtoObjectという特殊なクラスが設けられていますが、通常はObjectが頂点であると考えていて差し支えありません。

このページを編集 (4834 bytes)


Congratulations! 以下の 1 ページから参照されています。

This page has been visited 983 times.