[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends] Re: データベースに格納するデータオブジェクトに持つ機能(Re:CADのクラス構造)
前橋です。
Shin さん:
>ShapeサブクラスがShapeRunTimeを知っているわけではなく(データベー
>スから取り出してから外から付けるとのことなので)、各組織がそこの独
>自の実装を付けるわけですね.
そうです。
>その場合、
>In article <37cdd7be.3692.87cced020f2c6377@xxxxxxxxxx>
>Shin wrote:
>> :
>> otherYYYY(shape); // 特殊な操作の場合
>> :
>と前橋さん案は同じことかと思います.
ええっ、ちと異論が(^^;
>まず、LineRunTimeForDrawer等をShapeのサブクラスたちに関連付ける処
>理が必要なわけですが、これを行うには結局、
>if (shape instanceof Line) {
> shape.runtime = new LineRunTimeForDrawer();
>} else if () {
>}
>みたいな事が必要になってしまいます.
ええと、Lineのコンストラクタでくっつければいいかと思ってたん
ですが(Javaのデシリアライザってコンストラクタ呼ぶんだっけ)、
よく考えたら、Lineのコンストラクタが「draw()するアプリケーショ
ン」に依存してはいけないですね。
でも、オブジェクトを構築するアプリによって、くっつけるオブジェ
クトを変えることぐらいは、手があると思うんですけれども。それ
こそShapeRunTimeの生成インタフェースをグローバル変数渡しにし
てでも。
>で、Shapeにメンバを持つ形だとその後Drawerを使う時に、
>
>(LineRunTimeForDrawer)(shape.runtime).draw();
>
>なんてしないといけないので、それなら、
ダウンキャストは、(RunTimeForDrawer)shape.runtime
まででいいと思うのですが、如何?
これなら、少なくともLineかRectかという else if の山は書かな
くてすみます。
>利用者は「ShapeRunTimeというクラスをサブクラス化して、独自の実装
>を書き、Shapeに実行時に自分で設定して、narrowing castして機能を呼
>び出す」という約束を守れるのでしょうか?
サブクラスを定義して、Shapeにくっつける所までちゃんとやれば、
ダウンキャストでヘマすれば例外でコケるので、守らざるを得ない
というか(^^;
あ、draw()を呼ぼうとした時点でコンパイラに怒られるから、実行
時まで待つ必要はありませんね。
>別の観点から見て、ShapeRunTimeには実行時のみ使える基本機能も持た
>せることが考えられますよね.
>それと同程度にdraw()インターフェイスの必要性があれば、
>ShapeRunTime#draw()という(抽象)インターフェイスも書いておけば、
>narrowing cast無しで呼び出せます.
これは、そうだと思います。そして、各アプリの特化したものだけ、
ShapeRunTimeのサブクラスに実装すればいいわけです。
>>使わないメソッドがShapeFunctionにあるということは、あっちの
>>アプリを改造すると、こっちのアプリにも影響が出るということに
>>なりませんか? javacの場合リコンパイルが要るかどうかはよく知
>>りませんけど。
>うーんとこの場合のShapeFunction実装クラスは、Shapeサブクラスと同
>様に複数のアプリケーションから使われるクラスライブラリの位置付け
>ですね.
了解しました。
> アプリケーションに独自の実装は...の部分(上に引用しました)
>にもあるようにShapeFunctionとは独立して作らざるを得ないと思います.
先程のotherYYYY()ですね。で、LineやRectをinstanceofするelse
if の山についてはあきらめる、ということですか。
そうすると、Shapeにruntimeを持つ必要もなくなるのですが...
でも、どっちみち、transientなメンバは何やかやで要りそうな気
がします。たとえば、Windowsなら、CPenなんてオブジェクトがあっ
て、こいつで描画属性を指定するわけですが、実装によっては、実
行時には各ShapeにCPenを保持させときたいと思うかも知れません。
>ある利用者しか使わない実装ですと、ShapeRunTimeのサブクラスである
>必要性もとくにない気がするという点と、
># 複数扱うかもしれないShapeと一対一にくっつけて同時に引き渡したり
># できることに意義があるということならわかります.
Shapeはたいてい大量にあるでしょうし、Shapeの実行時属性は
Shapeごとに持ってないと管理が大変ですし...
Shapeが具体的にLineかRectかってことにより動作を変えよう、な
んてことも考えると...
># アプリケーション側で同時には一つずつしかShapeRunTimeサブクラス
># 相当の機能を使わないなら、先に書いたような単なるメソッドで良い
># と思います.
ええと、ShapeRunTime(のサブクラス)のインスタンスは、Shapeの
インスタンスの数だけ作るつもりでした。
>私の案はアプリケーション側の行う実装ではなく、Shapeに関連するクラ
>スライブラリの設計に関する話だったというあたりですね.
そういうことでしたら、了解です。
------------------------------------------------------------
前橋 和弥 maebashi@xxxxxxxxxx
中部ソフトエンジニアリング(株)
〒450 名古屋市中村区名駅4-10-25(名駅IMAIビル 5F)
Tel:(052)583-4511(代) 内線 252 Fax:(052)583-4566
------------------------------------------------------------