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