2016-04-25 11 views
4

Ich bin in der Situation, wenn zwei Klassen (nennen wir A und B) sind miteinander verwandt (ihre Methoden beruhen auf den Daten des anderen), aber die IS-A Beziehung ist nicht angemessen. Ich könnte Komposition verwenden, so dass beide Objekte Felder haben, die das andere Objekt speichern. Aber das scheint mir hässlich zu sein. Was ich derzeit tun, ist eine andere Klasse C enthält, die Objekte aus A und B über Zusammensetzung zu schaffen, und wenn ich eine Methode der Klasse A nennen wollen passiere ich das Objekt B. Meine Probleme mit diesem Ansatz:Objekte, die für beide Seiten brauchen einander

  • Ich brauche ein Objekt zum anderes zu übergeben, so dass es statt dem OOP-Ansatzes ein einfaches Funktionsargument zu ähneln beginnt vorbei, wo das Objekt kapselt seine Daten
  • wenn ich ändern müssen etwas, ich könnte den Code beiden Klassen ändern muß A und B, die für die Wiederverwendung von Code nicht ein guter Punkt ist

Was empfehlen Sie?

Beispiel

class Mesh: 
    method: plot(this, Solver) 
      { 
      plot data from class Solver // need to pass a Solver object, so the class is not self-contained 
      } 
    method: intersect(this, Domain) 
      { 
      do sth // depends on Domain, so we need to pass it 
      } 

class Domain: 
    method: plot(this) 
      { 
      plot data from own data // no problem 
      } 
    method: selectVertex(this, Mesh) 
      { 
      do sth // depends on Mesh, so we need to pass it 
      } 

Danke, Zoltan

+0

Im Allgemeinen ist es keine gute Idee, zwei Objekte voneinander abhängig zu machen. Aber es ist schwer, mehr zu sagen, ohne dass Sie konkrete Informationen/Code zur Verfügung stellen. –

+0

Gegenseitige Zusammensetzung ist keine gute Idee eher ein Hinweis, dass Ihre Klassen so verwandt sind, und vielleicht müssen sie nur eine Klasse mit den Attributen von A und B sein. Aber ohne einen konkreten Code ist schwierig. –

+0

Ja, sie sind verwandt, aber wenn sie eine Klasse wären, hätte ich die Versuchung, fast alles in eine Klasse einzuordnen, was in OOP nicht sehr vorteilhaft ist. –

Antwort

0

„Alle Probleme in der Informatik können außer für das Problem der zu viele Schichten Indirektionsebene von einem anderen Dereferenzierungsebene gelöst werden“ - David Wheeler.

Sie haben versucht, eine weitere Indirektionsebene hinzuzufügen, aber das Problem wurde nicht gelöst. Es gibt also etwas, das grundsätzlich falsch ist.

Hier ist meine Sicht:

Wenn Sie zwei Objekte, die voneinander abhängig für beide Seiten kann es bedeuten, dass zwei Klassen zusammen in eine größere Klasse zusammengefasst werden sollten, was wiederum ein größeres Objekt erzeugt, die Funktionalitäten hat von beiden.

Warum nicht? Es gibt viele Möglichkeiten, Ihr Domain-Geschäft objektorientiert zu modellieren, und Ihr Ansatz ist möglicherweise nicht mehr geeignet, wenn Ihr Domain-Geschäft wächst.

Verwandte Themen