Intrinsic/Extrinsic
2008.05.22
って英単語知ってます? 辞書で引くと、
Intrinsic=本質的な、内在する Extrinsic=外来的な、非本質的な
というくらいな意味なんですけども、要するに
- Intrinsic=あるモノの中にある、それがそれであるような、本質的なモノ
- Extrinsic=あるモノの中にあっても、それが本来備えるモノではないこと
というくらいに理解すればいいんじゃないかな。まあ、ちょっと気取った英単語ななので、知らなくってもどうということはないんですけどね。で、この単語、実は GoF で非常に印象的に使われているんです。その部分はというと、「FlyWeight」パターンのところで、ネット上の文章でも、この語をそのまま使って FlyWeight を解説しているケースを見かけます。
....とはいえ、この Intrinsic/Extrinsic の区別は、別に FlyWeight 専用のもののわけではないです。どんなクラス・オブジェクトでも、Intrinsic な情報、Extrinsic な情報という風な見方で見ることができる...というのが今回のネタです。
たとえば、コンストラクタ引数として渡してオブジェクトを生成するような情報は、そのオブジェクトの「Intrinsicな情報」だと言えます。それに対して、そのオブジェクトが「何かする」メソッドの引数として渡すような情報は、「Extrinsicだ」と言えるわけです。こういうケースでは典型的なので、はっきりと区別ができますが、そうじゃない微妙な情報もいろいろあります。
- 1. インスタンスによって設定されていたり、いなかったりするインスタンス変数。
- 2. 何かさせる直前で引数代わりにセットされる情報。
- 3. Intrinsic な内部情報を二重化してもっているタイプの情報(キャッシュとか)
まあ、特に「白黒ハッキリつけよう」と思うわけではないですから、曖昧なものはとりあえず曖昧としておきましょう。しかし、「そのクラスにとって、この情報は Intrinsic か、それとも Extrinsic か?」というのは、クラスを作るときに結構重要な視点になります。ですから、それをキレイに言い表すコトバとして、Intrinsic/Extrinsic を有効に使えれば....なんていう提案です。どうです? FlyWeight 専用じゃちょっともったいないでしょう!
余談:Intrinsic っていうと私がまず連想するのは、XIntrinsics だったりします。これは、X-Window の上で、低レベルな Xlib ライブラリと、高レベルなツールキットの間に立って、「いろいろなウィジットを作るための道具」であるライブラリのことを言います。この XIntrinsics は純然たるCで書かれた非オブジェクト指向言語でのライブラリなのですが、ウィジット自体はちょっとしたオブジェクト指向味の「オブジェクト」だったりします。親ウィジットの属性を継承できたりしちゃうのです。まあ、Cなのでここらへん、構造体の入れ子でうまく書けるようになっているのですが、このXIntrinsics では、「ウィジット(全体の枠組みを示す)クラス」を表すデータと、「(個々の)ウィジットのインスタンス」を表すデータをうまく分離しています。さまざまなコールバック情報などを大量に抱え込んだ「ウィジットクラス」がその「ウィジットにとって Intrinsic」で、シンプルに自分が使うプロパティだけを持った「ウィジットのインスタンス」が「そのウィジットにとっての Extrinsic」というあたりなのでは...と名前の由来をようやく今になって気がついた...みたいです。
投稿者 : 杉浦 こずえ | 投稿日時 : 2008.05.22 21:25





