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

[jfriends] Re: [jfriends] RDBとオブジェクト指向のギャップについて



「白やぎさん」 \\ (°)(°)|      http://www.inac.co.jp/shiroyagi/     
==========================================================(株)アイナック====

こんにちは、石黒です。

Forteというオブジェクト指向の開発環境でRDBを使って開発した経験があります。

そもそも想定があまり良くないように思います。
オブジェクト指向では、何をクラスにするかは重要な問題で、妥当なクラスを発見
するのに苦労するわけです。
ユースケースを書いたりして、一生懸命妥当なクラスを探そうとするわけです。

今回の例では、はじめにクラスありきという状況なので、使うときに不便が生じる
のは当然のようなきがします。
別にRDBにからんだ話でなくとも、悪いクラス分けありきで物を作ろうとすると、同
じような問題にぶち当たるのではないでしょうか。

A,Bから同時に情報を得たい場合が多いならば、その得たい情報を提供するクラ
スを設計し、実装するのが妥当だと思います。

上流のオブジェクト指向から見た参考意見です。
以上


> 小薮です。
> 特にJavaに関する質問というわけではないですが、
> 皆様のご意見お聞かせください。
>
> 【想定】
> A,Bという2つのエンティティクラスがあり、それぞれRDBで
> 永続化します。DB上には2つのテーブルがあり、それぞれ
> A,Bに対応していて、1レコード=1インスタンスです。
>
> Aのインスタンスのメソッドaは、Bのインスタンスのメソッドbを
> 呼び出します。Aはbのインスタンスを特定できるようなDB上のキーを
> 持っています。
>
> class A {
>         String keyOfB = 初期値;
>         // その他属性
>         public void someMethod() {
>                 B aB = new B(keyOfB);
>                 aB.b();
>         }
>
>         A(String keyOfA) {
>                 //コンストラクタ
>                 //DBから項目を読み出してオブジェクトを初期化
>         }
> }
>
> class B {
>         public void b() {
>                 //処理
>         }
>
>         B(String keyOfB) {
>                 //コンストラクタ
>                 //DBから項目を読み出してオブジェクトを初期化
>         }
> }
>
> ここで、
> A aA = new A(keyOfA);
> aA.someMethod();
> のような処理をすると、RDBに対してAの初期化とBの初期化、
> あわせて2回のアクセスを行うことになります。
>
> 【問題点】
> このような処理は、従来ですとテーブルのJOINを行って、
> 一度のアクセスでデータを取得するのが普通だと思います。
> それに比べて上記の方法は、性能が落ちるはずです。
> A,Bだけならいいのですが、C,D,E・・・とたくさんあったり、
> またA,B,C・・の組が何組もあったり、といった場合には
> 性能劣化が無視できない可能性があります。
>
> どうにかしてJOINで一度にとってこようと思うと、
> 何かしらオブジェクト指向的でないコードを書かざるを
> 得ないように思います。
>
> 【目標】
> 性能が優先される場合、なんらかの形で柔軟性や可読性を犠牲に
> せざるを得ないようにも思いますが、それでも被害は最小限に
> 止めたいものです。
>
> 【質問】
> 皆様はこういう時どうしてらっしゃいますか?
> 定番の手法があるものでしょうか?
>
> -----------------------------------
> koyabu@xxxxxxxxxx