In objektorientierter Programmierung welches Objekt sollte die Viele-zu-Viele-Beziehung beibehalten? (wenn es einen gibt)

8

Ich werde ein Beispiel verwenden, um dies zu veranschaulichen:

%Vor%

Company und Person halten eine Beziehung von vielen zu vielen. A Person kann zu mehreren Companies gehören und eine Company kann mehrere People enthalten.

Müsste ich dann eine dritte Klasse erstellen:

%Vor%

oder sollte das Unternehmen damit umgehen:

%Vor%

oder vielleicht Person sollte?

%Vor%     
Matt 31.03.2012, 06:18
quelle

4 Antworten

2

Es hängt vollständig von Ihrem Nutzungsszenario ab.

Wenn Sie nur die Personen finden müssen, die für ein Unternehmen arbeiten, speichern Sie die Personenliste im Unternehmen. Wenn Sie nur die Firmen finden müssen, für die Leute arbeiten, dann speichern Sie sie dort.

Früher oder später werden Sie wahrscheinlich feststellen, dass Sie die tatsächliche Beziehung Person & lt; - & gt; Unternehmen modellieren müssen, und Sie werden eine separate Klasse erstellen, um das darzustellen. Jetzt können Sie Eigenschaften hinzufügen wie das Datum, an dem die Beschäftigung begann, das Datum, an dem sie endete usw.

    
Ian Mercer 31.03.2012 06:28
quelle
2

Die Eigenschaften, die für eine zufällige Kombination einer Person und Company Instanz gemeinsam sind, können mithilfe einer "association class" modelliert werden.

Dafür gibt es eine Notation in UML, und es ist nicht schwer, ein solches Konzept in einer erweiterbaren Programmiersprache zu erstellen.

Die Idee ist, dass jedes beliebige Objektpaar, das aus einem Person und einem Company besteht, eine Beziehung hat und diese Beziehung selbst ein Objekt ist. Es ist weder Person noch Company , sondern das Objekt, das mit der Verbindung zwischen einer bestimmten Person und Company Instanz verbunden ist.

Dieses Zeug (Eigenschaften, Methoden) bildet eine Klasse: die Person-Company Assoziationsklasse.

Ich habe dies in Lisp mit einigen Makros zur Definition einer Assoziationsklasse für ein bestimmtes Klassenpaar und einer globalen schwachen Hash-Tabelle für die Zuordnung von Objektpaaren zu ihrem Assoziationsklassenobjekt (für eine bestimmte Person und Firma) gemacht Es war möglich, die Assoziation abzurufen, und diese Assoziation würde verschwinden, wenn diese Objekte zu Müll werden.

Die tatsächliche Verbindung zwischen bestimmten Unternehmen und Personen ist einfach, z. Listen oder andere assoziative Datenstrukturen. Ein Personenobjekt kann eine Liste von Firmen haben und umgekehrt. Die Assoziationsklassen-Idee adressiert das Problem, wo das Person-Company-Zeug zu platzieren ist. Zum Beispiel hat jedes Person eine Rolle innerhalb eines Company (sagen wir mal). Wir können keine role -Variable in einem Person haben, weil sie viele Rollen in vielen Unternehmen haben kann. Wir können sicherlich keine role in der Firma haben, weil es nicht einmal eine Person ist; Es hat Leute damit zu tun, die Rollen haben. Die Rolle kann in die Assoziation eingehen: Problem gelöst.

    
Kaz 31.03.2012 06:25
quelle
0

Nun, ich glaube nicht, dass Sie eine dritte Klasse brauchen.

Denken Sie daran, was ein ORM (Doctrin für PHP, Hybernate forn Java) tut:

In diesem Fall haben Sie auf einer Datenbankebene 3 Tabellen:

Firma, Benutzer und Firmenbenutzer (Join-Tabelle zwischen Benutzer und Firma, die angibt, welcher Benutzer zu welcher Firma gehört).

Sie können diese Situation auch nur mit zwei db -Tabellen abbilden:

Firma, Benutzer und Benutzer haben eine Referenz, die auf die Firma verweist. Anhand dieser Referenz können Sie also die Firma angeben, zu der der Benutzer gehört.

Endlich zu einem Klassenentwurf denke ich:

  • Klasse companuy kann eine Reihe von Benutzer (Liste der Benutzer der Firma)
  • halten
  • Klassenbenutzer können einen Verweis auf die Firma (die Firma, auf die sich der Benutzer bezieht) halten
ab_dev86 31.03.2012 06:30
quelle
0

Dies hängt vom Anwendungsfall ab, aber im Allgemeinen können viele bis viele Objektbeziehungen mithilfe einer Referenzklasse bereitgestellt werden

%Vor%

Jetzt können sowohl Unternehmen als auch Person ihre Beziehung verfolgen

%Vor%     
Starx 31.03.2012 06:31
quelle

Tags und Links