Imaginer ces relations:2x un à de nombreuses relations dans OO
- 1 A a beaucoup B
- 1 B a beaucoup Cassiopéens ...
À l'inverse:
- C a 1 B
- B a 1A
- Par transitivité, C a 1 A
Pour modéliser cette relation dans DB, nous avons:
TableA
a_id
TableB
b_id
a_id (fk to TableA)
TableC
c_id
b_id (fk to TableB)
Pour modéliser cette relation OO, nous avons:
objA
objB
objC
Et. .. - objB fait référence à objA - objC fait référence à objB
Si objC a rencontré hod qui a besoin d'appeler une méthode d'objA, que ferez-vous?
Option 1.
b.getA().runMethodX()
Beaucoup ppl que je connais serait cela, mais je l'ai aussi appris que ce n'est pas bon parce Geta() est pas un comportement de B dans un sens pur OO . Cela revient à faire de la programmation procédurale. D 'accord en désaccord?
Option 2.
Soit objc a une référence directe à objA et objB par injection constructeur/poseur
Est-ce une bonne idée? mais alors objB que objC a aussi référence à objA. Est-ce correct? Ou tant qu'il ne s'agit pas de références d'objets cycliques, est-ce acceptable?
Option 3.
Déplacer la méthode en question objA et passer objc dans le paramètre.
Je ne suis pas sûr si cela considère comme une option. Je pense que ça ne marchera pas dans tous les cas. Avoir la méthode dans objC réduire au strict minimum qui ne fonctionne que sur ses états, et laissez objA faire ce que objA doit faire avant ou après.
Option 4. (Délégation)
ajouter runMethodXinA() à B, il appelle
a.runMethodX()
C appelle
b.runMethodXinA()
J'ai essayé cette méthode avant, mais B finirai très probablement par avoir autant de méthodes comme A, et n'a pas 1 méthode dans les deux B et A viole DRY?
Quelles sont vos raisons? D'autres options? Commentaires? Suggestions?
Veuillez également poster l'option 5. :) – Henry
@ [Henry]: l'option 5 dépend de la connaissance des objets A, B et C, ce que je n'ai pas - Je trouve le "besoin" de l'objet C d'appeler les méthodes de l'objet A hautement suspectes, l'option 5 est probablement "Do not Do That" ;-) –