Was ist der Unterschied zwischen Assoziation, Aggregation und Zusammensetzung? Bitte erläutern Sie die Implementierung.
oop
uml
associations
aggregation
composition
Standardgebietsschema
quelle
quelle
Antworten:
Für zwei Objekte,
Foo
undBar
können die Beziehungen definiert werdenAssoziation - Ich habe eine Beziehung zu einem Objekt.
Foo
VerwendetBar
Komposition - Ich besitze ein Objekt und bin für dessen Lebensdauer verantwortlich. Wenn
Foo
stirbt, stirbt auchBar
Aggregation - Ich habe ein Objekt, das ich von jemand anderem ausgeliehen habe. Wenn
Foo
stirbt,Bar
kann weiterleben.quelle
Bar
Objekt kann weiterleben.Ich weiß, dass diese Frage als C # markiert ist, aber die Konzepte sind ziemlich allgemeine Fragen wie diese Weiterleitung hier. Also werde ich hier meinen Standpunkt darlegen (ein bisschen voreingenommen aus Java-Sicht, wo ich mich wohler fühle).
Wenn wir an objektorientierte Natur denken, denken wir immer an Objekte, Klassen (Objektpläne) und die Beziehung zwischen ihnen. Objekte sind miteinander verbunden und interagieren über Methoden miteinander. Mit anderen Worten, das Objekt einer Klasse kann Dienste / Methoden verwenden, die vom Objekt einer anderen Klasse bereitgestellt werden. Diese Art von Beziehung wird als Assoziation bezeichnet. .
Aggregation und Zusammensetzung sind Teilmengen der Assoziation, dh sie sind spezifische Assoziationsfälle.
Verwirrt?
Zusammensetzungsbeispiel : Betrachten Sie das Beispiel eines Autos und eines Motors, die für dieses Auto sehr spezifisch sind (was bedeutet, dass es in keinem anderen Auto verwendet werden kann). Diese Art der Beziehung zwischen Car- und SpecificEngine- Klasse wird als Komposition bezeichnet. Ein Objekt der Car-Klasse kann ohne ein Objekt der SpecificEngine-Klasse nicht existieren, und ein Objekt der SpecificEngine hat ohne die Car-Klasse keine Bedeutung. Um es einfach auszudrücken: Die Car-Klasse "besitzt" ausschließlich die SpecificEngine-Klasse.
Aggregationsbeispiel : Betrachten Sie nun die Klasse Auto und die Klasse Rad . Das Auto braucht ein Radobjekt, um zu funktionieren. Das heißt, das Auto-Objekt besitzt das Rad-Objekt, aber wir können nicht sagen, dass das Rad-Objekt ohne das Auto-Objekt keine Bedeutung hat. Es kann sehr gut in einem Fahrrad, LKW oder einem anderen Autoobjekt verwendet werden.
Zusammenfassend -
Zusammenfassend ist Assoziation ein sehr allgemeiner Begriff, der verwendet wird, um darzustellen, wann eine Klasse die von einer anderen Klasse bereitgestellten Funktionen verwendet. Wir sagen, es ist Zusammensetzung, wenn ein übergeordnetes Klassenobjekt ein anderes untergeordnetes Klassenobjekt besitzt und dieses untergeordnete Klassenobjekt ohne das übergeordnete Klassenobjekt nicht sinnvoll existieren kann. Wenn es kann, heißt es Aggregation.
Weitere Details hier. Ich bin der Autor von http://opensourceforgeeks.blogspot.in und habe oben einen Link zum entsprechenden Beitrag hinzugefügt, um mehr Kontext zu erhalten.
quelle
Assoziation ist ein verallgemeinertes Konzept von Beziehungen. Es umfasst sowohl Zusammensetzung als auch Aggregation.
Komposition ( Mischung ) ist eine Möglichkeit, einfache Objekte oder Datentypen in eine Einheit zu packen . Kompositionen sind ein kritischer Baustein vieler grundlegender Datenstrukturen
Aggregation ( Sammlung ) unterscheidet sich von gewöhnlicher Zusammensetzung darin, dass sie kein Eigentum impliziert. Wenn in der Komposition das besitzende Objekt zerstört wird, sind es auch die enthaltenen Objekte. In der Aggregation ist dies nicht unbedingt wahr.
Trick , den Unterschied zu erinnern: hat A - A ggregation und O wn - c O mpositoin
Betrachten wir nun das folgende Bild
Analogie:
Komposition : Das folgende Bild ist eine Bildkomposition, dh es werden einzelne Bilder verwendet, um ein Bild zu erstellen.
Aggregation : Sammlung von Bildern an einem Ort
Zum Beispiel besitzt eine Universität verschiedene Abteilungen, und jede Abteilung hat eine Reihe von Professoren. Wenn die Universität schließt, werden die Abteilungen nicht mehr existieren, aber die Professoren in diesen Abteilungen werden weiterhin existieren. Daher kann eine Universität als eine Zusammensetzung von Abteilungen angesehen werden, während Abteilungen eine Ansammlung von Professoren haben. Darüber hinaus kann ein Professor in mehr als einer Abteilung arbeiten, eine Abteilung kann jedoch nicht Teil von mehr als einer Universität sein.
quelle
Abhängigkeit (Referenzen)
Dies bedeutet, dass zwischen zwei Objekten keine konzeptionelle Verbindung besteht. zB EnrollmentService-Objektreferenzen Student & Course-Objekte (als Methodenparameter oder Rückgabetypen)
Assoziation (has-a)
Es bedeutet, dass fast immer eine Verbindung zwischen Objekten besteht (sie sind assoziiert). Das Bestellobjekt hat ein Kundenobjekt
Aggregation (hat einen + ganzen Teil)
Spezielle Art der Assoziation, bei der zwischen zwei Objekten eine ganzheitliche Beziehung besteht. Sie könnten jedoch ohne einander leben.
Hinweis: Der schwierigste Teil besteht darin, die Aggregation von der normalen Assoziation zu unterscheiden. Ehrlich gesagt denke ich, dass dies für unterschiedliche Interpretationen offen ist.
Zusammensetzung (hat einen + ganzen Teil + Besitz)
Besondere Art der Aggregation. An
Apartment
besteht aus einigenRoom
s. ARoom
kann nicht ohne existierenApartment
. Wenn eine Wohnung gelöscht wird, werden auch alle zugehörigen Räume gelöscht.quelle
Aus einem Beitrag von Robert Martin in comp.object :
Die Zuordnung repräsentiert die Fähigkeit einer Instanz, eine Nachricht an eine andere Instanz zu senden. Dies wird normalerweise mit einem Zeiger oder einer Referenzinstanzvariablen implementiert, kann jedoch auch als Methodenargument oder zum Erstellen einer lokalen Variablen implementiert werden.
Aggregation [...] ist die typische Ganz / Teil-Beziehung. Dies ist genau das Gleiche wie eine Zuordnung mit der Ausnahme, dass Instanzen keine zyklischen Aggregationsbeziehungen haben können (dh ein Teil kann nicht sein Ganzes enthalten).
Die Tatsache, dass dies eine Aggregation ist, bedeutet, dass die Instanzen des Knotens keinen Zyklus bilden können. Dies ist also ein Baum von Knoten, kein Diagramm von Knoten.
Die Zusammensetzung [...] ist genau wie die Aggregation, außer dass die Lebensdauer des "Teils" vom "Ganzen" gesteuert wird. Diese Steuerung kann direkt oder transitiv sein. Das heißt, das "Ganze" kann die direkte Verantwortung für das Erstellen oder Zerstören des "Teils" übernehmen, oder es kann ein bereits erstelltes Teil akzeptieren und es später an ein anderes Ganzes weitergeben, das die Verantwortung dafür übernimmt.
quelle
Wie andere sagten, ist eine Assoziation eine Beziehung zwischen Objekten, Aggregation und Zusammensetzung sind Arten von Assoziationen.
Aus Sicht der Implementierung wird eine Aggregation erhalten, indem ein Klassenmitglied als Referenz verwendet wird . Wenn Klasse A beispielsweise ein Objekt der Klasse B aggregiert, haben Sie ungefähr Folgendes (in C ++):
Die Semantik der Aggregation besteht darin, dass das zerstörte B-Objekt, wenn ein Objekt A zerstört wird, weiterhin vorhanden ist. Wenn Sie Komposition verwenden, haben Sie eine stärkere Beziehung, normalerweise indem Sie das Mitglied nach Wert speichern :
Wenn ein A-Objekt zerstört wird, wird auch das darin enthaltene B-Objekt zerstört. Der einfachste Weg, dies zu erreichen, besteht darin, das Element nach Wert zu speichern. Sie können jedoch auch einen intelligenten Zeiger verwenden oder das Element im Destruktor löschen:
Der wichtige Punkt ist, dass in einer Komposition das Containerobjekt das enthaltene besitzt , während es in der Aggregation darauf verweist .
quelle
Es ist erstaunlich, wie viel Verwirrung über die Unterscheidung zwischen den drei Beziehungskonzepten Assoziation , Aggregation und Zusammensetzung besteht .
Beachten Sie, dass die Begriffe Aggregation und Zusammensetzung in der C ++ - Community wahrscheinlich einige Zeit verwendet wurden, bevor sie als spezielle Assoziationsfälle definiert wurden in UML-Klassendiagrammen .
Das Hauptproblem ist das weit verbreitete und anhaltende Missverständnis (selbst unter erfahrenen Softwareentwicklern), dass das Konzept der Komposition eine Lebenszyklusabhängigkeit zwischen dem Ganzen und seinen Teilen impliziert, so dass die Teile ohne das Ganze nicht existieren können, wobei die Tatsache ignoriert wird, dass es auch solche gibt Fälle von Teil-Ganz-Assoziationen mit nicht teilbaren Teilen, bei denen die Teile vom Ganzen getrennt werden und die Zerstörung des Ganzen überleben können.
Soweit ich sehen kann, hat diese Verwirrung zwei Wurzeln:
In der C ++ - Community wurde der Begriff "Aggregation" im Sinne einer Klasse verwendet, die ein Attribut zum Referenzieren von Objekten einer anderen unabhängigen Klasse definiert (siehe z. B. [1]). Dies ist der Assoziationssinn in UML-Klassendiagrammen. Der Begriff "Komposition" wurde für Klassen verwendet, die Komponentenobjekte für ihre Objekte definieren, sodass bei der Zerstörung des zusammengesetzten Objekts auch diese Komponentenobjekte zerstört werden.
In UML-Klassendiagrammen wurden sowohl "Aggregation" als auch "Zusammensetzung" als Sonderfälle von Assoziationen definiert, die Teil-Ganz- Beziehungen darstellen (die in der Philosophie seit langem diskutiert werden). In ihren Definitionen basiert die Unterscheidung zwischen einer "Aggregation" und einer "Zusammensetzung" auf der Tatsache, dass es möglich ist, einen Teil zwischen zwei oder mehr Ganzen zu teilen. Sie definieren "Kompositionen" als nicht teilbare (exklusive) Teile, während "Aggregationen" ihre Teile teilen können. Darüber hinaus sagen sie etwa Folgendes: Sehr oft, aber nicht in allen Fällen, weisen Kompositionen eine Lebenszyklusabhängigkeit zwischen dem Ganzen und seinen Teilen auf, so dass die Teile ohne das Ganze nicht existieren können.
Während UML die Begriffe "Aggregation" und "Zusammensetzung" in den richtigen Kontext (von Teil-Ganz-Beziehungen) gestellt hat, ist es ihnen nicht gelungen, sie klar und eindeutig zu definieren und die Intuitionen der Entwickler zu erfassen. Dies ist jedoch nicht überraschend, da diese Beziehungen so viele verschiedene Eigenschaften (und Implementierungsnuancen) aufweisen können und die Entwickler sich nicht darüber einig sind, wie sie implementiert werden sollen.
Siehe auch meine erweiterte Antwort auf die unten aufgeführte SO-Frage vom April 2009.
Und die Eigenschaft, von der angenommen wurde, dass sie "Zusammensetzung" zwischen OOP-Objekten in der C ++ - Community definiert (und diese Überzeugung ist immer noch weit verbreitet): Die Laufzeitlebenszyklusabhängigkeit zwischen den beiden verwandten Objekten (dem Verbund und seiner Komponente) ist Nicht wirklich charakteristisch für "Komposition", da wir solche Abhängigkeiten aufgrund der referenziellen Integrität auch in anderen Arten von Assoziationen haben können.
Beispielsweise wurde das folgende Codemuster für "Zusammensetzung" in einer SO-Antwort vorgeschlagen :
Der Befragte behauptete, es sei charakteristisch für "Zusammensetzung", dass keine andere Klasse auf die Komponente verweisen / sie kennen könne. Dies gilt jedoch sicherlich nicht für alle möglichen Fälle von "Komposition". Insbesondere im Fall eines Fahrzeugmotors muss der Hersteller des Fahrzeugs, möglicherweise mit Hilfe einer anderen Klasse implementiert, möglicherweise auf den Motor verweisen, um den Besitzer des Fahrzeugs kontaktieren zu können, wenn ein Problem damit auftritt.
[1] http://www.learncpp.com/cpp-tutorial/103-aggregation/
Anhang - Unvollständige Liste wiederholt gestellter Fragen zu Zusammensetzung und Aggregation in StackOverflow
[ Apr 2009 ]
Aggregation versus Komposition [geschlossen als hauptsächlich meinungsbasiert von]
[ Apr 2009 ]
Was ist der Unterschied zwischen Komposition und Assoziationsbeziehung?
[ Mai 2009 ]
Unterschied zwischen Assoziation, Aggregation und Zusammensetzung
[ Mai 2009 ]
Was ist der Unterschied zwischen Zusammensetzung und Aggregation? [Duplikat]
[ Okt 2009 ]
Was ist der Unterschied zwischen Aggregation, Zusammensetzung und Abhängigkeit? [als Duplikat markiert]
[ Nov 2010 ]
Association vs. Aggregation [als Duplikat markiert]
[Aug 2012 ]
Implementierungsunterschied zwischen Aggregation und Komposition in Java
[ Feb 2015 ]
UML - Assoziation oder Aggregation (einfache Codefragmente)
quelle
Verband
Die Assoziation stellt die Beziehung zwischen zwei Klassen dar. Sie kann unidirektional (Einweg) oder bidirektional (Zweiweg) sein.
zum Beispiel:
Anhäufung
Aggregation ist eine Art Assoziation. Aber mit spezifischen Merkmalen. Aggregation ist die Beziehung in einer größeren "ganzen" Klasse, die eine oder mehrere kleinere "Teile" -Klassen enthält. Umgekehrt ist eine kleinere "Teil" -Klasse ein Teil der "ganzen" größeren Klasse .
zum Beispiel:
Ein Club ("ganz") besteht aus mehreren Clubmitgliedern ("Teilen"). Mitglieder haben ein Leben außerhalb des Clubs. Wenn der Verein ("ganz") sterben würde, würden Mitglieder ("Teile") nicht damit sterben. Weil ein Mitglied mehreren Clubs angehören kann ("ganz").
Komposition
Dies ist eine stärkere Form der Aggregation. "Ganz" ist für die Schaffung oder Zerstörung seiner "Teile" verantwortlich.
Zum Beispiel:
In diesem Fall würde die Schule ("ganz") sterben, die Abteilung ("Teile") würde damit sterben. Weil jeder Teil nur zu einem "Ganzen" gehören kann.
quelle
class Club(){ _member = new Member }
es als Referenz verwenden oder weitergebenclass Club(){ addMember(Member member) { this._member = member } }
Es ist wichtig zu verstehen, warum wir uns überhaupt die Mühe machen sollten, mehr als eine Beziehungslinie zu verwenden. Der naheliegendste Grund ist die Beschreibung der Eltern-Kind-Beziehung zwischen Klassen (wenn Eltern alle Kinder gelöscht haben), aber ohnmächtiger möchten wir zwischen einfacher Zuordnung und Komposition unterscheiden, um implizite Einschränkungen für die Sichtbarkeit und die Sichtbarkeit festzulegen Weitergabe von Änderungen an die verwandten Klassen, eine Angelegenheit, die eine wichtige Rolle für das Verständnis und die Reduzierung der Systemkomplexität spielt.
Die abstrakteste Art, die statische Beziehung zwischen Klassen zu beschreiben, ist die Verwendung des Assoziationslinks, der lediglich angibt, dass zwischen zwei oder mehr Klassen eine Art Link oder eine Abhängigkeit besteht.
Schwache Assoziation
ClassA kann mit ClassB verknüpft sein, um zu zeigen, dass eine seiner Methoden Parameter der ClassB-Instanz enthält oder die Instanz von ClassB zurückgibt.
Starke Assoziation
ClassA kann auch mit ClassB verknüpft werden, um zu zeigen, dass es einen Verweis auf die ClassB-Instanz enthält.
In Fällen, in denen ein Teil der Beziehung zwischen ClassA (ganz) und ClassB (part) besteht, können wir spezifischer sein und den Aggregationslink anstelle des Zuordnungslinks verwenden, um hervorzuheben, dass ClassB auch von anderen Klassen in der Anwendung aggregiert werden kann ( Daher wird Aggregation auch als Shared Association bezeichnet.
Es ist wichtig zu beachten, dass der Aggregationslink in keiner Weise angibt, dass ClassA ClassB besitzt, und dass zwischen beiden eine Eltern-Kind-Beziehung besteht (wenn Eltern alle Kinder löschen, die als Ergebnis gelöscht werden). Im Gegenteil! Der Aggregationslink, der normalerweise verwendet wird, um den Punkt hervorzuheben, dass ClassA nicht der exklusive Container von ClassB ist, da ClassB tatsächlich einen anderen Container hat.
Aggregation gegen Assoziation Die Assoziationsverknüpfung kann die Aggregationsverknüpfung in jeder Situation ersetzen, während die Aggregation die Assoziation in Situationen nicht ersetzen kann, in denen nur eine 'schwache Verbindung' zwischen den Klassen besteht, dh ClassA verfügt über Methoden, die Parameter von ClassB enthalten, ClassA jedoch nicht Verweis auf ClassB-Instanz halten.
Martin Fowler schlägt vor, dass der Aggregationslink überhaupt nicht verwendet werden sollte, da er keinen Mehrwert hat und die Konsistenz stört. Jim Rumbaugh zitiert "Betrachten Sie ihn als ein Modellierungs-Placebo".
Wir sollten spezifischer sein und den Kompositionslink in Fällen verwenden, in denen zusätzlich zu dem Teil der Beziehung zwischen ClassA und ClassB eine starke Lebenszyklusabhängigkeit zwischen beiden besteht, was bedeutet, dass beim Löschen von ClassA auch ClassB als Ergebnis gelöscht wird
Der Kompositionslink zeigt, dass eine Klasse (Container, Ganzes) das ausschließliche Eigentum an anderen Klassen (Teilen) hat, was bedeutet, dass das Containerobjekt und seine Teile eine Eltern-Kind-Beziehung darstellen.
Im Gegensatz zu Zuordnung und Aggregation kann die zusammengesetzte Klasse bei Verwendung der Zusammensetzungsbeziehung nicht als Rückgabetyp oder Parametertyp der zusammengesetzten Klasse angezeigt werden. Änderungen an der zusammengesetzten Klasse können daher nicht auf den Rest des Systems übertragen werden. Folglich begrenzt die Verwendung der Zusammensetzung das Komplexitätswachstum, wenn das System wächst.
Die Systemkomplexität kann einfach gemessen werden, indem ein UML-Klassendiagramm betrachtet und die Assoziations-, Aggregations- und Zusammensetzungsbeziehungslinien bewertet werden. Um die Komplexität zu messen, müssen Sie bestimmen, wie viele Klassen durch Ändern einer bestimmten Klasse betroffen sein können. Wenn Klasse A Klasse B verfügbar macht, kann jede Klasse, die Klasse A verwendet, theoretisch von Änderungen an Klasse B betroffen sein. Die Summe der Anzahl potenziell betroffener Klassen für jede Klasse im System ergibt die Gesamtsystemkomplexität.
Sie können mehr in meinem Blog lesen: http://aviadezra.blogspot.com/2009/05/uml-association-aggregation-composition.html
quelle
class Person() { private hand = new Hand }
. Schlafagregationspersonclass Person() { private sleep = new Sleep }
Ist der Schlüssel "neu" im Schlaf gültig? oder sollte ich es als Referenz übergeben, weil Agregation ist?class Person() { private Sleep _sleep; public addSleep(Sleep sleep) { this._sleep = sleep} }
Zusammensetzung (Wenn Sie "Ganzes" entfernen, wird auch "Teil" automatisch entfernt - "Eigentum")
Erstellen Sie Objekte Ihrer vorhandenen Klasse in der neuen Klasse. Dies wird als Komposition bezeichnet, da die neue Klasse aus Objekten vorhandener Klassen besteht.
Verwenden Sie normalerweise normale Elementvariablen.
Kann Zeigerwerte verwenden, wenn die Kompositionsklasse die Zuordnung / Freigabe automatisch übernimmt, die für die Erstellung / Zerstörung von Unterklassen verantwortlich ist.
Komposition in C ++
Ausgabe
Aggregation (Wenn Sie "Ganzes" entfernen, kann "Teil" existieren - "Kein Eigentum")
Eine Aggregation ist eine bestimmte Art von Komposition, bei der kein Besitz zwischen dem komplexen Objekt und den Unterobjekten impliziert ist. Wenn ein Aggregat zerstört wird, werden die Unterobjekte nicht zerstört.
Verwenden Sie normalerweise Zeigervariablen / Referenzvariablen, die auf ein Objekt verweisen, das außerhalb des Bereichs der Aggregatklasse liegt
Kann Referenzwerte verwenden, die auf ein Objekt verweisen, das außerhalb des Bereichs der Aggregatklasse liegt
Nicht verantwortlich für das Erstellen / Zerstören von Unterklassen
Aggregationscode in C ++
Ausgabe
quelle
Das Problem mit diesen Antworten ist, dass sie die halbe Wahrheit sind: Sie erklären, dass Aggregation und Zusammensetzung Formen der Assoziation sind, aber sie sagen nicht, ob es möglich ist, dass eine Assoziation keine von diesen ist.
Ich stelle anhand einiger kurzer Lesungen vieler Beiträge zu SO und einiger UML-Dokumente fest, dass es vier konkrete Hauptformen der Klassenassoziation gibt:
Wenn eine Beziehung zwischen zwei Entitäten keine davon ist, kann sie einfach als "Assoziation" im allgemeinen Sinne des Begriffs bezeichnet und auf andere Weise (Anmerkung, Stereotyp usw.) weiter beschrieben werden.
Ich vermute, dass die "generische Assoziation" hauptsächlich unter zwei Umständen verwendet werden soll:
quelle
Ich denke, dieser Link wird Ihre Hausaufgaben machen: http://ootips.org/uml-hasa.html
Um die Begriffe zu verstehen, erinnere ich mich an ein Beispiel in meinen frühen Programmiertagen:
Wenn Sie ein 'Schachbrett'-Objekt haben, das' Box'-Objekte enthält, handelt es sich um Komposition denn wenn das 'Schachbrett' gelöscht wird, gibt es keinen Grund mehr, dass die Boxen existieren.
Wenn Sie ein "Quadrat" -Objekt mit einem "Farb" -Objekt haben und das Quadrat gelöscht wird, ist das "Farb" -Objekt möglicherweise noch vorhanden, dh Aggregation
Beide sind Assoziationen , der Hauptunterschied ist konzeptionell
quelle
Zusammensetzung : Hier wird, sobald Sie ein Objekt (Schule) zerstören, ein anderes Objekt (Klassenzimmer), das daran gebunden ist, ebenfalls zerstört. Beide können nicht unabhängig voneinander existieren.
Aggregation : Dies ist genau das Gegenteil der obigen (
Composition
) AssoziationCompany
, bei der das andere Objekt (Employees
), das daran gebunden ist, für sich allein existieren kann, sobald Sie ein Objekt ( ) töten .Verein .
Zusammensetzung und Aggregation sind die beiden Formen der Assoziation.
quelle
quelle
In einem sehr einfachen Satz:
Aggregation und Zusammensetzung sind Teilmengen der Assoziation.
A verwendet B -> dies ist eine Aggregation
A braucht B -> ist Komposition.
Lesen Sie hier mehr .
quelle
Ich möchte veranschaulichen, wie die drei Begriffe in Rails implementiert werden. ActiveRecord ruft jede Art von Beziehung zwischen zwei Modellen auf
association
. Man würde die Begriffecomposition
undaggregation
beim Lesen von Dokumentationen oder Artikeln nicht sehr oft finden , die sich auf ActiveRecord beziehen. Eine Zuordnung wird erstellt, indem dem Hauptteil der Klasse eines der Zuordnungsklassenmakros hinzugefügt wird. Einige dieser Makrosbelongs_to
,has_one
,has_many
etc ..Wenn wir ein
composition
oder einrichten möchtenaggregation
, müssen wirbelongs_to
das eigene Modell (auch als untergeordnetes Modell bezeichnet) und /has_one
oderhas_many
das besitzende Modell (auch als übergeordnetes Modell bezeichnet) hinzufügen . Ob wir einrichtencomposition
oderaggregation
von den Optionen abhängen, die wirbelongs_to
im untergeordneten Modell an den Anruf übergeben. Vor Rails 5 konnte das Kind ohne Elternbelongs_to
erstellt werdenaggregation
, ohne dass Optionen erstellt wurden . Wenn wir eine wolltencomposition
, mussten wir dies explizit deklarieren, indem wir die Option hinzufügtenrequired: true
:In Rails 5 wurde dies geändert. Wenn Sie jetzt eine
belongs_to
Zuordnung deklarieren,composition
wird standardmäßig ein Kind erstellt , das ohne ein Elternteil nicht existieren kann. Das obige Beispiel kann also wie folgt umgeschrieben werden:Wenn wir zulassen möchten, dass das untergeordnete Objekt ohne übergeordnetes Objekt existiert, müssen wir dies explizit über die Option deklarieren
optional
quelle
Aus: Remo H. Jansen Buch „Beginn der Reaktion: Lernen von TypeScript 2.x - Zweite Ausgabe“:
Wir nennen Assoziation jene Beziehungen, deren Objekte einen unabhängigen Lebenszyklus haben, in dem kein Eigentum an den Objekten besteht. Schauen wir uns ein Beispiel eines Lehrers und eines Schülers an. Mehrere Schüler können einem einzelnen Lehrer zugeordnet werden, und ein einzelner Schüler kann mehreren Lehrern zugeordnet werden, beide haben jedoch unabhängige Lebenszyklen (beide können unabhängig voneinander erstellt und gelöscht werden). Wenn ein Lehrer die Schule verlässt, müssen wir keine Schüler löschen, und wenn ein Schüler die Schule verlässt, müssen wir keine Lehrer löschen.
Wir nennen Aggregation jene Beziehungen, deren Objekte einen unabhängigen Lebenszyklus haben, aber Eigentümer sind und untergeordnete Objekte nicht zu einem anderen übergeordneten Objekt gehören können. Nehmen wir ein Beispiel für ein Mobiltelefon und einen Mobiltelefonakku. Ein einzelner Akku kann zu einem Telefon gehören. Wenn das Telefon jedoch nicht mehr funktioniert und wir es aus unserer Datenbank löschen, wird der Akku des Telefons nicht gelöscht, da er möglicherweise noch funktionsfähig ist. In der Aggregation haben Objekte also ihren Lebenszyklus, während es Eigentum gibt
Wir verwenden den Begriff Komposition , um Beziehungen zu bezeichnen, deren Objekte keinen unabhängigen Lebenszyklus haben. Wenn das übergeordnete Objekt gelöscht wird, werden auch alle untergeordneten Objekte gelöscht. Nehmen wir ein Beispiel für die Beziehung zwischen Fragen und Antworten. Einzelne Fragen können mehrere Antworten haben, und Antworten können nicht zu mehreren Fragen gehören. Wenn wir Fragen löschen, werden Antworten automatisch gelöscht.
quelle
Assoziation ist eine Beziehung zwischen zwei getrennten Klassen, und die Assoziation kann von einem beliebigen Typ sein, z. B. eins zu eins, eins zu Mai usw. Sie verbindet zwei völlig getrennte Einheiten.
Aggregation ist eine spezielle Form der Assoziation, bei der es sich um eine unidirektionale Einwegbeziehung zwischen Klassen (oder Entitäten) handelt, z. B. Wallet- und Money-Klassen. Brieftasche hat Geld, aber Geld muss nicht unbedingt Brieftasche haben, also ist es eine einseitige Beziehung. In dieser Beziehung können beide Einträge überleben, wenn der andere endet. In unserem Beispiel bedeutet dies nicht, dass die Money-Klasse nicht existieren kann, wenn die Wallet-Klasse nicht vorhanden ist.
Die Zusammensetzung ist eine eingeschränkte Form der Aggregation, bei der zwei Entitäten (oder man kann sagen Klassen) stark voneinander abhängig sind. Für zB Mensch und Herz. Ein Mensch braucht Herz zum Leben und ein Herz braucht einen menschlichen Körper zum Überleben. Mit anderen Worten, wenn die Klassen (Entitäten) voneinander abhängig sind und ihre Lebensdauer gleich ist (wenn eine stirbt, dann auch eine andere), dann ist es eine Zusammensetzung. Herzklasse hat keinen Sinn, wenn die menschliche Klasse nicht vorhanden ist.
quelle
https://www.linkedin.com/pulse/types-relationships-object-oriented-programming-oop-sarah-el-dawody/
Zusammensetzung: ist ein "Teil" der Beziehung.
Zum Beispiel "Motor ist Teil des Autos", "Herz ist Teil des Körpers".
Assoziation: ist eine Beziehung vom Typ "hat-a"
Nehmen wir zum Beispiel an, wir haben zwei Klassen, dann werden diese beiden Klassen als "has-a" -Beziehungen bezeichnet, wenn beide Entitäten für eine Arbeit das Objekt des anderen teilen und gleichzeitig ohne gegenseitige Abhängigkeit existieren können oder beide ihre haben eigenes Leben.
Das obige Beispiel zeigt eine Zuordnungsbeziehung, da sowohl die Employee- als auch die Manager-Klasse das Objekt voneinander und beide ihren eigenen unabhängigen Lebenszyklus verwenden.
Aggregation: basiert auf einer "has-a" -Beziehung und ist eine spezielle Form der Assoziation
Zum Beispiel "Student" und "Adresse". Jeder Schüler muss eine Adresse haben, damit die Beziehung zwischen der Schülerklasse und der Adressklasse vom Typ "Has-A" ist, aber umgekehrt ist dies nicht der Fall.
quelle