vieweditattachhistorytopchangessearchhelp

第12回


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


 本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、数多く存在するメソッドやクラスを把握しやすくする工夫である「カテゴリ」についてです。

 前回、クラス「String」に定義された「#withCRs」という名前のメソッド、つまりString >> #withCRsをブラウズしてみました。この時、withCRsを選ぶのに使ったブラウザ上段の右端にあるペインには大量のメソッド名(セレクタ)がリストアップされていたのに気付かれたと思います。

String selectors asSortedArray " => Stringに定義されているメソッドたち"


 その数はなんと200個弱あります。

String selectors size " => 181 "


 これは相当極端な例ですが、クラスによっては1000個を越える場合もあります。

| dictionary |
dictionary _ Dictionary new.
Smalltalk allBehaviorsDo: [:class |
  dictionary at: (class selectors size) put: class].
^dictionary associationAt: (dictionary keysSortedSafely last)
  " => 1090->Morph "


 GUIフレームワークの中核を担うMorphのようなクラスはかなり特殊と言えそうですが、平均でも数十個のメソッドを単純にアルファベット順に並べたリストから、名前の分かっているメソッドの実装を調べるだけならともかく、注目したオブジェクトに欲している機能を探す(つまり辞書やリファレンスマニュアルで言うところの“逆引き”のような)作業はかなり骨の折れるものになりそうです。

 そんなときに役立つのが、ブラウザ上段の右から2番目にあるリストです。これは「プロトコル」とか「メソッドカテゴリ」と呼ばれているペインで、各メソッドが定義時に分類されたカテゴリごとに共通するメソッドだけをすぐ右手のメソッドペインに表示する…という機構を提供します。たとえば、Stringなら、「accessing」というメソッドカテゴリを選択することで、その要素である文字などにアクセスする手段を提供するメソッドだけを選んで一覧できます。

[fig.A]accessingカテゴリに分類されているメソッドのみを呼び出したところ
Uploaded Image: 12a.png

 ちなみに、もとのように、全メソッドの一覧に戻すにはメソッドカテゴリペインで「-- all --」を選びます。クラスペインでStringを2度クリックして解除・再選択しても同じです。

 実は、メソッドはその定義時に(#'as yet unclassified'、つまり“未分類”という名のカテゴリを含め)必ず何らかのカテゴリに属すよう定められています。新たに作成したメソッドをどういったカテゴリに分類するかは開発者のセンスにゆだねられていますが、それほど的外れでなければ、システム内で慣例的に使われているカテゴリに分類することが推奨されます。システム内でポピュラーなカテゴリについて興味があれば、次のようなスクリプトでその一覧を得ることが可能です。システム内のクラスがメソッドの分類に使用している全カテゴリを抽出してカウント、その中から15個以上のクラスで使われているものを降順で列挙します。

| bag |
bag _ Bag new.
Smalltalk allClassesDo: [:class |
  bag addAll: class organization categories].
World findATranscript: nil.
bag sortedCounts do: [:association |
  association key > 14 ifTrue: [Transcript cr; show: association]]


 なお、現在のブラウザはカテゴリを限らないメソッド一覧表示の状態時(クラスを選択してすぐ、あるいは「-- all --」カテゴリ選択時)に、特定のメソッドをブラウズしても、それが属するカテゴリをメソッドカテゴリペイン内に探してくれません。もし選択したメソッドのカテゴリを知りたいときは、ブラウザ中段のボタン群のひとつ「browse」をクリックして別のブラウザを起動することで確認できます。

 数が多いということでは、クラスも事情は同じです。Smalltalkシステムを構成するオブジェクトは、通常のOSが分担するサービスを担当するものから、基本的なデータ構造を定義したもの、GUIフレームワークやアプリケーションの要素となるもの、ユーザー定義のデータ構造やアプリケーションの構成要素に至るまで、幅広く存在します。それらを網羅するクラスもまた、当然、多くなります。Smalltalkシステムを単なる言語処理系としてしか考えられず、VMベースの独立した(ちょっと変わった仕組みで動く)コンピュータ環境と捉える習慣に馴染まない人には、このクラス数の多さはSmalltalkという“言語処理系”の明らかな欠点として認識される傾向にあるようです。

 メソッド同様、クラスも、その定義時に特定のカテゴリに分類することが義務づけられています。ブラウザの上段、左端のペインは、このクラスカテゴリの一覧を表示するためのものです。クラスカテゴリ名は、メソッドのカテゴリと同様に、各クラス(あるいはそのインスタンスが)システム内でどのような役割りを期待されているのか、あるいはそれらがどういった位置づけにあるのかを知るのに、よい手がかりになるでしょう。一般にクラスカテゴリ名は、「大分類-小分類」というルールで付けられています。

 ここでいったんブラウザの説明は終えて、次回は、システムブラウザと同様にSmalltalkシステムに欠かすことができないツールである「インスペクタ」を紹介します。

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


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

This page has been visited 1002 times.