Skip to content.

Sections
Personal tools
You are here: Home » コミュニティ » masarl memorial » homepage3.nifty.com » masarl » article » nifty-logs » Niftyの過去ログ集 - PowerPlant と Mix-in アーキテクチャ

Niftyの過去ログ集 - PowerPlant と Mix-in アーキテクチャ

Document Actions

PowerPlant と Mix-in アーキテクチャ


僕が過去絶賛していた Macintosh のアプリケーション・フレームワーク,PowerPlant の紹介です.このフレームワークは,当時多重継承について懐疑的だった僕の考えを一変させるものでした.今では Java の interface で Mix-in は当たり前になってるかもしれませんが・・.PowerPlant と同様,Javaの Swing もすばらしい設計ですね(そしてすばらしく遅い・・(笑)).PowerPlantは遅いってことはありませんよ.たぶん.

01047/01047 BYI20012  まさーる        RE:PowerPlant
( 9)   96/09/16 11:39  01038へのコメント

Junichi Suzuki さん、こんにちは。

>>この名前は、PowerPlantというフレームワークからとりました(Attachment/
>>Attachableクラス)。PowerPlantって知っておられます?
>
>いえ,知らなかったです.どんなフレームワークなんでしょうか?

ぼくが個人的に絶賛しているMacintoshのアプリケーションフレームワークです。
Metroworks社のCodeWarriorというコンパイラに付いてきます。

MacAppはよくOO本で紹介されているのでここの会議室の方はご存知かと思いま
すが、PowerPlantはまだ歴史的に浅いのでMacプログラマー以外の方にはあまり
知られてないかもしれません。

特徴としては

・デザインパターンをかなり意識している
・多重継承ベース
・Mixin-Classの多用
・ネーミングがかなり統一されている

ということが挙げられるかと思います。

もう、クラス階層図をみた瞬間にそのクラス設計のすばらしさに感動してしまい
ました。Mixin-Classと多重継承がこれほど強力なものだと思ったことはありま
せん。

これを読んで共感されたPowerPlantユーザの方々、ぜひコメントを^^;


                                     96/09/16(月) まさーる(BYI20012)

結局,PowerPlantユーザのコメントはなかったですが,今度は Mix-in アーキテクチャの解説をしました.

01066/01067 BYI20012  まさーる        RE^3:PowerPlant
( 9)   96/09/17 14:21  01065へのコメント

Tucker! さん、こんにちは。

>|もう、クラス階層図をみた瞬間にそのクラス設計のすばらしさに感動してしまい
>|ました。Mixin-Classと多重継承がこれほど強力なものだと思ったことはありま
>|せん。
>
> これものすごく興味あります。具体的にはどのように実現しているのでしょうか。

PowerPlantの入門マニュアルによると、PowerPlantはMixin-Achitectureによる
設計で、

「PowerPlantのクラスライブラリは、一本の巨大な木ではなく、小さな木が集ま
った森のようなものだ」

といってます。つまり、単一継承のObjectから始まる巨大な木による一枚岩的な
ライブラリではなく、小さなツリーを作り、必要なところはMixinクラスとして
融合している、というわけです(ぜんぜん具体的じゃないな)。

こうすることで、このフレームワークは非常にわかりやすくなり、部分的に再利
用できるようになります。こういうことは、理論的にはわかってたつもりだった
んですが、実際にそう設計されているフレームワークに出会ったことがなかった
ので感動してしまったんだと思います(あとは、ネーミングセンスとか)。

それから、ぼくのフレームワークの評価基準としてその中に使われているデザイ
ンパターンがどれだけ見えてくるか、ということがあります。

このフレームワークはMixinクラスで機能を分離しているため、階層図とクラス
名をみればある程度どのパターンを使っているかわかります。たとえば、
Attachable/AttachmentはMacAppのAdornerに相当するな、とか、Listener/
BroadcasterはObserverのパターンだろう、ActionはCommandのパターンだな、
View/PaneはCompositeのパターンを使っているんだろう、という風に(もちろ
ん、最終的には各クラス仕様を見て確認しなければなりませんが)。

このほかにも、C++のデストラクタを利用したスタック変数専用の便利なクラス
がいろいろ用意されているので、C++プログラマの方は得るところが多いと思い
ます。

                                     96/09/17(火) まさーる(BYI20012)

Tucker! さんは,C++のテンプレート機能を使った「修飾」というプログラミング方法を開発した人なのでこの話題に興味を持たれたようです(というより,「修飾」というプログラミングスタイルがあってそれをC++のテンプレート機能で実現してみせた,という方が正しいかな?).でも単純に多重継承を使って Mix-in を実現しているだけですから,Tucker! さんの期待するものとは違っていたのかも.

01070/01071 BYI20012  まさーる        RE^5:Mixinの実現方法
( 9)   96/09/17 21:25  01068へのコメント

Tucker! さん、こんにちは。

> この融合の仕方なんですが、どうやって融合しているんでしょうか。
>"Editable"というMixinクラスと、"Text"クラスがあったとして、それを融
>合して"EditableText"クラスを作るのって、
>
>       Editable    Text
>                 |            |
>                 +-----+------+
>                       A
>                       |
>                  EditableText
>
> っていうふうにしているんでしょうか。

そうです。

> これってEditableクラスはTextクラスをどうやってアクセスするんでしょう? 
>(できるのかな? できないですよねえ?)

確かにできませんが...
でもどうしてEditableクラスはTextクラスをアクセスしないといけないんでしょ
う?(ぼくがなにか勘違いしてるのかな)


>|このほかにも、C++のデストラクタを利用したスタック変数専用の便利なクラス
>|がいろいろ用意されているので、C++プログラマの方は得るところが多いと思い
>|ます。
>
> スタック変数用のクラスですか? どんなんでしょう。

単にプログラムを簡単にするためのクラスのことです(OOとは関係ありませ
ん)。この種のクラスは "Stなんとか"(StackのSt)という名前づけルールになっ
ていて、ある処理内のオート変数としてしか宣言してはいけません。

例えばハンドルを使うとき、まずハンドルの状態を保存したあとロックし、使い
おわったあとは必ずハンドルの状態を元にもどさなければならない、という場
合、StHandleLockerというスタック変数を生成してコンストラクタでハンドル状
態の保存とロック、デストラクタでハンドル状態の復帰、という具合にします。

もっと単純なものだと、StValueChangerっていうのがありますね。こいつはある
変数について、コンストラクタで元の値を保存、その後コンストラクタの引数に
ある新しい値を代入しておき、デストラクタで元の値に自動的に復帰するような
しくみになってます。(ソースを引用すれば一発でわかると思うんですが、それ
はまずいですよね。C++プログラマの方には簡単な練習問題です)


                                     96/09/17(火) まさーる(BYI20012)

最後のスタック変数用のクラスのネーミングとか,PowerPlantはネーミングもすばらしいんですよね.

参考資料