vieweditattachhistorytopchangessearchhelp

第32回


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


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

 「コレクション」と呼ばれるオブジェクトは、Collectionとそのサブクラス群によって定義され、文字通り、要素の集まりを表現するために使います。どのようなルールで要素を集めて扱うか、あるいは、どんな要素を対象にするのかといった目的別に使い分けます。Smalltalkのコレクションは非常に数が多く、その多さに初心者は(特に他の言語に精通している人ほど)面食らってしまうようです。どのくらい多いか、その数を知ることは簡単にできます。

Collection allSubclasses size   " => 88 "


 Smalltalkシステムが返してきたこの答えを信じるならば、なんと90個近いコレクションがあることになるわけです。もっとも「これをすべて覚えなければならないのか…」とのご心配にはおよびません。そのほとんどは特殊な用途向けに用意されたもので、普段から覚えておく必要があるのはほんのいくつかにすぎないからです。

 Smalltalkシステム、つまり暫定ダイナブック環境においては、他のOSに比べて、あらゆる情報がすべてオープンで、しかも異常なほど容易にアクセスできるため、つい、ひとつひとつ実際に手にとって確かめたくなってしまいがちです。そうした姿勢自体は悪いことではないですし、それ、つまりエンドユーザーが自身の使用しているシステムのしくみを知りたくなるよう仕向けることは、まさにアラン・ケイの狙いでもあるわけですが、初心のうちはほどほどにしておかないと、情報の多さに押しつぶされてしまいます。うまく捨て目を利かせつつ、適度に無視するのが、Smalltalkとうまくつき合うためのコツだと言えそうです。

 さて。普段から覚えておいたほうがよいいくつかのコレクションというのは、なにも特別なものではなく、Cocoaに用意されているコレクションとほぼ一致します。これはけっして偶然というわけではありません。なぜなら、Cocoaの前身であるNEXTSTEP(のAPI)は、Smalltalkの雑然としたクラス群をライブラリとして使いやすく整理・再構築したものだとも言えるので、むしろ当然のことでしょう。

 SmalltalkのコレクションとCocoaのコレクションの対応は、おおよそ次の通りです。

NSArray         …… Array
NSMutableArray  …… OrderedCollection
NSDictionary    …… Dictionary
NSSet           …… Set
NSCountedSet    …… Bag
NSString        …… Symbol
NSMutableString …… String


 念のため、それぞれがどんな特徴を持っているかについても簡単に紹介しておきます。

 Arrayはすでにご存じでお馴染みの「配列」です。各要素は前後関係を保持しつつ管理され各々にインデックスが振られます。ただ、Cocoaとは異なりSmalltalkではインデックスは0からではなく1から始まり、最後の要素のインデックスは全要素数に一致します。また、NSArrayと違ってArrayでは、要素を変更することができますが、要素数の増減は(NSArray同様)できません。要素数を増減させる用途には、Arrayではなく、OrderedCollectionを使います。

 Dictionary、Set、Bagは、要素の順番を考慮しないコレクションです。Dictionaryは名前のとおり「辞書」です。「キー(key)」に「値(value)」を対応付けて要素として管理してくれます。Setは要素の重複を許しません。すでに存在する要素を追加しようとしても無視されます。Setの「要素の重複を許さない」という制約を取り払ったのがBagです。

 SymbolとStringは、Array同様、これまでも何度か登場していますね。Symbolには、NSMutableStringに対しNSStringの持っているImutableであるという性質の他に、同値なら同一オブジェクトであることを保証する(つまり、同内容のコピーの存在を許さない)という特性も備わっています。「= arg」はレシーバとargが同値かどうかを、「== arg」は同一かどうかをテストしたいときに送るメッセージです。

#symbol = #symbol copy     " => true "
#symbol == #symbol copy    " => true "
'string' = 'string' copy   " => true "
'string' == 'string' copy  " => false "


 シンボル、文字列に関しては、大島芳樹さんら日本人Squeakユーザーの有志により構築された多国語対応版を用いることで、いわゆるマルチバイト文字列への対応も可能です。多国語版Squeakをベースにした日本語版は、次のサイトより入手できます。日本語版については、現在最新版の開発が最終段階に入っているようなので、近いうちにご紹介できると思います。

http://squeak.hp.infoseek.co.jp/nihongo.htm

 以上の他に、範囲や等差数列を表わすのに用いるInterval、常に要素がソートされた状態で保たれるSortedCollectionを知っておけば、当面、コレクション関係で不自由はしないはずです。

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


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

This page has been visited 967 times.