[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: データベースに格納するデータオブジェクトに持つ機能(Re:CADのクラス構造)




前橋です。

Shinさん:
>>・Shapeの各サブクラスのデータメンバは、全部publicにするかア
>>  クセサを付けるかして「まる見え」にしなきゃいけない。
>
>データベースに格納するデータであるからにはそのデータに対する(直接
>/間接を問わない)操作(参照)は行えないとまずいですね.
>draw()を使わないアプリケーションもあるという話なので、そういう人
>にとってはdraw()だけが公開されていても何もできないことになります.

結局そうなりますよね。で、こっちはしょうがないからあきらめる
として、

>>・いざ描画するときには、長〜いelse ifの連なりで、いちいち
>>  instanceofでクラスを調べるの?
>>
>>ということになっちゃいます。これはこれで悲し過ぎます。特にふたつめ。
>
>draw(Shape)というメソッドの実装が一つしかなければそうなりかねませ
>んね.

こちらはあまりにも悲し過ぎますので。

>>・ShapeRunTimeというabstractクラスを作って、そのインスタンス
>>  をShapeインスタンスが保持するようにする。
>>・ShapeRunTimeを継承して、ShapeRunTimeForDrawerを作り、
>>  「drawするアプリケーション」では、Shapeにそいつをくっつけ
>>  ておく。他のことするアプリケーションは、それぞれ
>>  ShapeRunTimeForXXXXを作る。
>>・「drawするアプリケーション」は、ShapeRunTimeをダウンキャス
>>  トして使う(ここが美しくない)。
>>・ShapeRunTimeForDrawerには、abstractなメソッドとして、
>>  draw()を入れておく。ShapeRunTimeForDrawerを継承して
>>  LineRunTimeForDrawerなどを作る。draw()の実装はそこに書く。
>
>これではデータベースに格納されたオブジェクトが持っている
>ShapeRunTimeのオブジェクトによって、各アプリケーションが使いたい
>機能を持っていたり持っていなかったりします.
># Shapeに持たせてしまっては...

あああああ、説明不足ですみません。そうではなくて、
ShapeRunTimeは、Javaのシリアライザで言うなら、transientな
メンバのつもりでした。

で、Shapeのインスタンスを生成(またはデシリアライズ)するとき
に、アプリケーションに応じて必要なShapeRunTimeを生成して、そ
こにくっつけるわけです。

ついでに、ShapeRunTimeは、インタフェースではなくてクラスです。
実行時のみに必要なデータメンバの格納場所にもするためです。
その場合、ShapeRunTime共通のデータもあるでしょうし、Drawer専
用のものなら、ShapeRunTimeForDrawerに突っ込めばいいのです。

>私は、こういうのを用意して、
>
>interface ShapeFunction {
>	public void draw2D();
>	public void draw3D();
>	public void otherXXXX();//その他の汎用的そうな機能?
>}
...
>使わないメソッドがShapeFunctionの実装クラスに存在することもありま
>すがそれは問題視することもないと思います.

うーん、ShapeFunctionはシリアライズ対象外ですから、データベー
スに格納されたモノについては、影響を与えなくて、それはそれで
意味のあることだと思うのですけれども。

使わないメソッドがShapeFunctionにあるということは、あっちの
アプリを改造すると、こっちのアプリにも影響が出るということに
なりませんか? javacの場合リコンパイルが要るかどうかはよく知
りませんけど。

結局、これを問題視するかしないかという問題になりますかね。

たとえば、データ構造をシリアライズしてファイルに格納する場合、
そのデータフォーマット(つまり、Shapeの構造)が公開されていれば、
それを利用するアプリケーションは、いろんな会社が競合して開発
する可能性もあります。そういう場合は、アプリ毎の独立性をなに
がなんでも確保しなければならないでしょうし。

>前橋さん案は、
>interface ShapeRunTime {
>}
>interface ShapeRunForDraw2D extends ShapeRunTime {
>	public void draw2D();
>}
>interface ShapeRunForDraw3D extends ShapeRunTime {
>	public void draw3D();
>}
>interface ShapeRunForXXXX extends ShapeRunTime {
>	public void XXXX();
>}
>で、使う時にShapeRunForDraw2D/3D/XXXX等にキャストが必要というパタ
>ーンですね.
>Shapeが上記のどのinterfaceを実装したクラスを返すかが(利用者に)わ
>からないのが問題かなあ.って事がいいたかったのです.

ShapeRunTimeForXXXは利用者毎に分類してあるわけですから、ある
利用者に必要なShapeRunTimeは一種類の決め打ちでいいわけで...

------------------------------------------------------------
  前橋 和弥                             maebashi@xxxxxxxxxx
  中部ソフトエンジニアリング(株)
    〒450 名古屋市中村区名駅4-10-25(名駅IMAIビル 5F)
    Tel:(052)583-4511(代) 内線 252 Fax:(052)583-4566
------------------------------------------------------------