プール辞書とはこういう物かっ!..な?(ギンガナム風)

Potential - 勉強編: プール辞書さんより、

実際,インスタンス変数,クラスインスタンス変数,クラス変数,一時変数,ワークスペース変数,グローバル変数はおなじみですが,ブール辞書はまったく使ったことがないです.

確かに私もプール辞書を使ったことは一度もなかったり。

というか私、そもそもプール辞書というものをよく解っていません。(←ぉ) なので、例によってお仕事ビルドの合間に ちょっとお勉強です。(人はそれをサボリと言う...)


* * *


プール辞書 というのは、「複数のクラスで共用できるクラス変数(みたいなもの)」を辞書に納めて、その辞書に名前を付けたもの・・・でいいのかな?

「プール」という響きがなにやら怪しげで、しかもどんな物だかの想像を妨げることこの上ないのですが、クラスに #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==>"'ばよえ〜ん!'

が めでたく動く、そんな感じです。むー、プラガブル・クラス変数?

ただ、プール辞書自体は多分単なるグローバル変数で、別にアクセス制限が掛かるとか、そういうことは無さそうなのですよね。糖衣構文系?


* * *


というわけで、プール辞書は多分「クラス変数のさらに強い版があったら便利なんじゃない?」と言う思いつきが実を結んだものだと 私は想像したのだけれど・・・、これ、実際どっかで重宝してるのかしらん。