これらの関係を想像してみてください。
- 1Aには多くのBがあります
- 1Bには多くのCがあります。
逆に:
- Cには1つのBがあります
- Bには1Aがあります
- 推移性により、Cは1Aを持ちます
DBでこの関係をモデル化するには、次のようにします。
TableA
a_id
TableB
b_id
a_id (fk to TableA)
TableC
c_id
b_id (fk to TableB)
OOでこの関係をモデル化するには、次のようにします。
objA
objB
objC
そして...--objBはobjAへの参照を持っています-objCはobjBへの参照を持っています
objCにobjAのメソッドを呼び出す必要のあるメソッドがある場合、どうしますか?
オプション1。
b.getA().runMethodX()
私が知っている多くのpplはこれを行うでしょうが、getA()は純粋なOOの意味でのBの動作ではないため、これは良くないことも学びました。そうすることは、手続き型プログラミングを行うのと同じです。同意する同意しません?
オプション2。
コンストラクターインジェクション/セッターを介してobjCがobjAとobjBを直接参照するようにします
これは良い考えですか?しかし、objCが参照しているobjBもobjAを参照しています。これで大丈夫ですか?または、循環オブジェクト参照の場合でない限り、それは許容されますか?
オプション3。
問題のメソッドをobjAに移動し、パラメーターでobjCを渡します。
これがオプションと見なされるかどうかはわかりません。すべての場合に機能するとは限りません。objCのメソッドを、その状態でのみ機能する最小限に減らし、objAが前後に実行する必要があることをすべて実行するようにします。
オプション4. (委任)
runMethodXinA()をBに追加すると、
a.runMethodX()
Cコール
b.runMethodXinA()
私は以前にこの方法を試しましたが、BはAと同じ数の方法を持っている可能性が高く、BとAの両方に1つの方法がない場合はDRYに違反しますか?
あなたは何ですか?他のオプションはありますか?コメント?提案?