[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