2012-03-31 4 views
8

Ich werde ein Beispiel verwenden, um dies zu veranschaulichen:Bei objektorientierter Programmierung welches Objekt sollte die Viele-zu-Viele-Beziehung beibehalten? (Falls vorhanden)

class Company { 

} 

class Person { 

} 

Company und Person halten eine viele zu viele Beziehung. Eine Person kann zu mehreren Companies gehören und eine Company kann mehrere People halten.

Würde ich dann eine dritte Klasse erstellen müssen:

class CompanyPerson { 

} 

oder sollte das Unternehmen handhaben:

class Company { 
    function add_person() { 

    } 
} 

oder vielleicht die Person sollte?

class Person { 
    function add_to_company() { 

    } 
} 
+0

möglich Duplikat [Modellierung Eltern-Kind-Beziehungen mit Klassen] (http://stackoverflow.com/questions/4089582/modelling- Eltern-Kind-Beziehungen mit Klassen –

Antwort

2

Die Eigenschaften gemeinsam eine zufällige Kombination aus einer Person und Company Instanz kann eine „Assoziationsklasse“ modelliert werden.

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

Die Idee ist, dass jedes zufällige Paar von Objekten bestehend aus Person und Company eine Beziehung hat, und diese Beziehung ist selbst ein Objekt. Es ist weder Person noch Company, aber das Zeug mit der Verbindung zwischen einer bestimmten Person und Company Instanz verbunden.

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

Ich habe dies in Lisp mit einigen Makros zum Definieren einer Assoziationsklasse für ein bestimmtes Klassenpaar und einer globalen schwachen Hashtabelle zum Zuordnen von Objektpaaren zu ihrem Assoziationsklassenobjekt (für eine gegebene Person und Firma war es möglich, die Assoziation abzurufen, und diese Assoziation würde verschwinden, wenn diese Objekte zu Müll werden würden).

Die tatsächliche Verbindung zwischen bestimmten Unternehmen und Menschen ist einfach, mit 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 jede Person eine Rolle innerhalb einer Company (sagen wir mal). Wir können keine role Variable in einem Person haben, weil es viele Rollen w.r.t viele Firmen 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 den Verband gehen: Problem gelöst.

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 finden, dass Sie die tatsächliche Beziehung Person < -> Firma modellieren müssen, und Sie erstellen eine separate Klasse, um das darzustellen. Jetzt können Sie Eigenschaften wie das Datum des Beginns der Beschäftigung, das Datum, an dem sie endete usw. hinzufügen.

0

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

daran denke, was ein ORM (Doktrin für PHP, Java Hybernate forn) hat:

In diesem Fall auf einer databse Schicht erhalten Sie 3 Tabellen:

Company, User und Company_user (Join-Tabelle beetween Benutzer und Firma, die angibt, welcher Benutzer welcher Firma angehört).

Auch können Sie diese Situation Karte nur mit zwei DB-Tabellen:

Company, Benutzer und Benutzer Sie eine Referenz zeigt auf Unternehmen haben. Anhand dieser Referenz können Sie also sagen, zu welcher Firma der Benutzer gehört.

schließlich auf einem Klasse-Design ich denke:

  • Klasse companuy eine Reihe von Benutzern halten kann (Liste der Benutzer, die die Gesellschaft)
  • Klasse Benutzer einen Verweis auf Unternehmen halten können (das Unternehmen des Benutzer bleongs zu)
0

dies auf dem Anwendungsfall abhängig ist, aber in der Regel viel zu viele Objekt Beziehung kann

class CompanyPersonRelationship { 
    public $company; 
    public $person; 
} 
unter Verwendung einer Referenzklasse eingesetzt werden, So, jetzt

, beiden Unternehmen und Personen können verfolgen ihre Beziehung liegt

class Company { 
    public $persons = array(); 
} 

class Person { 
    public $companies = array(); 
} 
Verwandte Themen