何某日和

「カメラ」のち「ハンダゴテ」ところにより「プログラミング」 ── そんな私“かめきち”のウェブサイト

Smalltalk小技集

目次

オブジェクト指向言語「Smalltalk」における、便利か否かよくわからない小技たちを掲載しています。(VisualWorksを利用しています。)

Vol.1 : Category Search ─ カテゴリ名(プロトコル名)を検索する

 クラス名や変数名を決める時、既に使われている名前としてどのようなものがあるかを検索したりします。 カテゴリ(プロトコル)名を決める時も、同じように検索に掛けたいのですが、どうもカテゴリ名検索の機能が見当たらず。。。 以下のようにして、カテゴリ名を検索してみました。

変数keywordに検索文字列(「*private*」など)を入れて、インスペクトしてみてください。きっと検索結果が表示されるはず。

| keyword aCollection |
keyword := '*private*'.
aCollection := OrderedCollection new.
Object withAllSubclasses do:
    [:aClass |
    aClass organization categories do:
        [:aCategory |
        (keyword match: aCategory asString)
            ifTrue: [(aCollection includes: aCategory)
                ifFalse: [aCollection add: aCategory]]]].
^aCollection
CategorySearchのプログラムをInspect it 得られた結果(検索条件に合致するカテゴリ名一覧)

Vol.2 : Message Search ─ とあるオブジェクトが応答できる全てのメッセージを知る

 あるオブジェクトが応答できるメッセージの一覧。これを探そうとしてリファクタリングブラウザを開いてみるも、 そのオブジェクトのクラスで実装されているメッセージしかリストアップされません。 そこで、対象のオブジェクトのクラス階層を遡ることで、そのオブジェクトの応えられる全てのメッセージを探しだしてやろうというものです。

変数anObjectに検査対象のオブジェクト('hoge'やselfなど)を束縛して、インスペクトしてみてください。きっとメッセージの一覧が得られるはず。

| anObject aCollection |
anObject := 'hoge'.
aCollection := Set new.
anObject class withAllSuperclasses
    do: [:aClass | aCollection addAll: aClass selectors].
^aCollection asSortedCollection
MessageSearchのプログラムをInspect it 得られた結果(オブジェクトが応えられる全メッセージの一覧)