プール辞書とはこういう物かっ!..な?(ギンガナム風)
実際,インスタンス変数,クラスインスタンス変数,クラス変数,一時変数,ワークスペース変数,グローバル変数はおなじみですが,ブール辞書はまったく使ったことがないです.
確かに私もプール辞書を使ったことは一度もなかったり。
というか私、そもそもプール辞書というものをよく解っていません。(←ぉ) なので、例によってお仕事ビルドの合間に ちょっとお勉強です。(人はそれをサボリと言う...)
* * *
プール辞書 というのは、「複数のクラスで共用できるクラス変数(みたいなもの)」を辞書に納めて、その辞書に名前を付けたもの・・・でいいのかな?
「プール」という響きがなにやら怪しげで、しかもどんな物だかの想像を妨げることこの上ないのですが、クラスに #classPool というメッセージを送ると、
Object subclass: #Puyo instanceVariableNames: '' classVariableNames: 'Bayoeen BrainDamned DiAcute Fire IceStorm' poolDictionaries: '' category: 'Compile'
Puyo classPool "print it==>" a Dictionary (#Bayoeen->nil #BrainDamned->nil #DiAcute->nil #Fire->nil #IceStorm->nil )
てな具合に、クラス変数の辞書を返してくれることから連想させて、この返ってくる辞書 と同じような物に名前をつけて、複数のクラスからアクセスできるようにしたのが プール辞書――て風に考えると、頭の中の収まりが良いかしら。
クラス変数とクラスインスタンス変数が紛らわしい話的にには、そもそもクラス変数という名前からして罠なので、クラスプール の方が 良い名前に思えるし、だから自然な命名なのかな、と一瞬おもってしまうのですけれど、いあいあ、やっぱりわかりにくいですよ、コレ。
* * *
プール辞書を使うには、クラス定義のメッセージ の poolDictionaries: セレクタに 使いたいプール辞書の名前を列挙すれば OK です。具体例を挙げると、
ChainAttackVoice = Dictionary new. ChainAttackVoice at: #Fire put: 'ふぁいや〜!'; at: #IceStorm put: 'あいすすとーむ!'; at: #DiAcute put: 'だいあきゅーと!'; at: #BrainDamned put: 'ぶれいんだむど!'; at: #Bayoeen put: 'ばよえ〜ん!'.
な辞書を、
Object subclass: #ArleNadja instanceVariableNames: '' classVariableNames: '' poolDictionaries: 'ChainAttackVoice' category: 'Training'
で、ArleNadja クラスの poolDictionares に書いてあげると、そのメソッド定義で、
ArleNadja >> bayoeen ^Bayoeen "←辞書の要素に対して まるでクラス変数のようにアクセスできる!"
と書いてもエラーにならないで、
ArleNadja new bayoeen "print it==>"'ばよえ〜ん!'
が めでたく動く、そんな感じです。むー、プラガブル・クラス変数?
ただ、プール辞書自体は多分単なるグローバル変数で、別にアクセス制限が掛かるとか、そういうことは無さそうなのですよね。糖衣構文系?
* * *
というわけで、プール辞書は多分「クラス変数のさらに強い版があったら便利なんじゃない?」と言う思いつきが実を結んだものだと 私は想像したのだけれど・・・、これ、実際どっかで重宝してるのかしらん。