クラスBとCの集合体であるクラスAがある場合、Aの方が良いですか
- BとCのIDを保存する
- BとCのオブジェクト全体をロードして保存します(編集、オブジェクトB / Cを参照して保存します。つまり、BとCのIDを保存するのではなく、オブジェクトBとCをインスタンス化します。
- IDを保存し、メソッドBとCをプルするメソッドを提供します
これはパフォーマンス要件やその他の要件によって異なると思いますが、一般的なガイドラインや考えを探しています。
クラスBとCの集合体であるクラスAがある場合、Aの方が良いですか
これはパフォーマンス要件やその他の要件によって異なると思いますが、一般的なガイドラインや考えを探しています。
メモリ内で実行される典型的なプログラムでは、ほとんどの場合、オブジェクトは参照によってポインターとして格納されるため、B と C の ID を格納しています。詳細を自分で処理しないだけで、言語によってそれらが隠されます。
「オブジェクト全体」の読み込みと保存は、疑わしい概念です。あなたが言語に依存しないようにしようとしていることは知っていますが、オブジェクト指向を「取得」するのに最初に役立ったのは、ほぼすべてのオブジェクトが独自のライフサイクルを持つ必要があるということです。
オブジェクト B を「含む」オブジェクト A があり、オブジェクト B への参照をオブジェクト C に渡す場合、オブジェクト A はオブジェクト C について何かを知る必要がありますが、これはまったく問題ありません。オブジェクト A がオブジェクト C について何も知らないように、オブジェクト B のライフサイクルを解放することは、OO を機能させる中心的な概念の 1 つです。
したがって、オブジェクト全体を保存することでそれが意味するものである場合は、いいえ、決してそうしないでください。
これは、データベースやその他のストレージにも当てはまります。あるオブジェクトが別のオブジェクトを破壊する責任があるとしても、他のオブジェクトのデータを含むことはめったにありません。
そして(「メソッド」ではなく「オブジェクトBとCをプルする」と言うつもりだったと思いますが)、別のオブジェクトからオブジェクトを渡すことができるという概念も非常に便利であり、通常、1つの注意点があります。
オブジェクトは、それ自体の外側で何が起こっているかを制御できないことに注意してください。渡されたり、メソッドが半ランダムな順序で呼び出されたりする可能性があります。したがって、オブジェクトをできるだけ安全に保つことが役立ちます。何かが間違った順序で呼び出された場合、または無効な変数が渡された場合、または何らかの理由で無効な状態になったことに気付いた場合は、Fail Early と Fail LOUD を実行して、間違いを犯したプログラマーがそれを呼び出すようにします。
また、不正な状態に入るのをできるだけ難しくしたいと考えています。これは、オブジェクトを小さくシンプルに保ち、可能な限り変数を final にし、パラメーターの呼び出し順序が重要な場所をあまり多く持たないようにすることを意味します。
私はデフォルトのアプローチとして、オブジェクト全体 (およびそのサブオブジェクト) を読み込んで保存する傾向があります。
これにより、読み込み時間が長くなったり、メモリ フットプリントが大きくなったり、またはその両方が発生したりすることがあります。次に、読み込まれたすべてのオブジェクトが実際に使用されているかどうか、または多くのオブジェクトが作成されてアクセスされていないかどうかを判断する必要があります。
すべてのオブジェクトが使用されている場合は、サブセットを読み込み、それらを処理し、破棄し、次のサブセットを読み込んですべてをメモリに収めるために、より創造的なアプローチが必要になります。または、単にメモリを追加購入してアプリで利用できるようにすることもできます。
オブジェクトの多くが使用されていない場合、最善の方法は、必要に応じてサブオブジェクトを遅延ロードすることです。
これは状況によって異なります。オブジェクトがメモリに残っている場合は、A に B と C を含める方がオブジェクト指向 (かつ簡単) です。オブジェクトを永続化する必要がある場合は、A が ID を格納するのがより簡単で効率的であることがわかりました。 B と C。
場合によります、
B と C が重く、読み込みと構築に費用がかかる場合は、それらが必要であると確信できるまで読み込みを延期することをお勧めします (Lazy Initialize)。
シンプルで軽量な場合は、いつでも構築したいだけで、ID を取得できます。