Was ist die Verwendung von Assoziation, Aggregation und Komposition?


20

Ich habe viele Theorien über die Verkapselung und die drei Techniken zu ihrer Implementierung durchlaufen, nämlich Assoziation, Aggregation und Komposition.

Was ich gefunden habe ist :

Verkapselung

Bei der Kapselung werden die Felder in einer Klasse privat gemacht und der Zugriff auf die Felder über öffentliche Methoden ermöglicht. Wenn ein Feld als privat deklariert ist, kann niemand außerhalb der Klasse auf es zugreifen, wodurch die Felder innerhalb der Klasse ausgeblendet werden. Aus diesem Grund wird die Kapselung auch als Ausblenden von Daten bezeichnet.

Die Kapselung kann als eine Schutzbarriere beschrieben werden, die verhindert, dass auf den Code und die Daten von einem anderen Code, der außerhalb der Klasse definiert ist, zufällig zugegriffen wird. Der Zugriff auf Daten und Code wird über eine Schnittstelle streng kontrolliert.

Der Hauptvorteil der Kapselung besteht in der Möglichkeit, unseren implementierten Code zu ändern, ohne den Code anderer zu beschädigen, die unseren Code verwenden. Mit dieser Funktion verleiht Encapsulation unserem Code Wartbarkeit, Flexibilität und Erweiterbarkeit.

Verband

Assoziation ist eine Beziehung, in der alle Objekte einen eigenen Lebenszyklus haben und es keinen Eigentümer gibt. Nehmen wir ein Beispiel für Lehrer und Schüler. Mehrere Schüler können einem Lehrer und ein Schüler mehreren Lehrern zugeordnet werden. Es besteht jedoch kein Eigentumsrecht zwischen den Objekten und beide haben ihren eigenen Lebenszyklus. Beide können unabhängig voneinander erstellen und löschen.

Anhäufung

Die Aggregation ist eine spezielle Form der Zuordnung, bei der alle Objekte einen eigenen Lebenszyklus haben, der Besitz jedoch vorhanden ist und ein untergeordnetes Objekt nicht zu einem anderen übergeordneten Objekt gehören kann. Nehmen wir ein Beispiel einer Abteilung und eines Lehrers. Ein einzelner Lehrer kann nicht mehreren Abteilungen angehören, aber wenn wir die Abteilung löschen, wird das Lehrerobjekt nicht zerstört. Wir können es uns als eine Beziehung vorstellen, die eine Beziehung hat.

Zusammensetzung

Komposition ist wieder eine spezialisierte Form der Aggregation, und wir können dies als "Todesbeziehung" bezeichnen. Es ist eine starke Art der Aggregation. Das untergeordnete Objekt hat keinen Lebenszyklus. Wenn das übergeordnete Objekt gelöscht wird, werden auch alle untergeordneten Objekte gelöscht. Nehmen wir noch einmal ein Beispiel für die Beziehung zwischen Haus und Zimmern. Das Haus kann mehrere Räume enthalten, aber es gibt kein unabhängiges Leben eines Raums und jeder Raum kann nicht zu zwei verschiedenen Häusern gehören. Wenn wir das Haus löschen, wird der Raum automatisch gelöscht.

Die Frage ist:

Nun, das sind alles Beispiele aus der Praxis. Ich suche nach einer Beschreibung, wie diese Techniken im tatsächlichen Klassencode verwendet werden. Ich meine, worum geht es bei der Verwendung von drei verschiedenen Verkapselungstechniken , wie diese Techniken implementiert werden könnten und wie man wählt, welche Technik zur Zeit anwendbar ist.


1
Bitte beachten Sie, dass Aggregation, Komposition und Assoziation keine Techniken zur Implementierung der Kapselung sind. Eine Kapselung kann auch dann existieren, wenn es nur eine Klasse / ein Objekt gibt. Die Kapselung ist nur eine wesentliche Funktion in der Objektorientierung, um die Daten Ihres Objekts auszublenden.
Maxood

1
"Ein einzelner Lehrer kann NICHT mehreren Abteilungen angehören" wirklich? Haben Sie nicht bemerkt, dass Ihre Ressource den Inhalt geändert hat?
KNU

Ich habe es geschafft, mithilfe von Composition DDD-Aggregatwurzeln und deren Entitäten beim domänengesteuerten Entwurf zu identifizieren. Eine neue Verwendung für eine alte Konvention.
Jonn

Antworten:


12

Die Unterscheidung zwischen Assoziation, Aggregation und Komposition, wie Sie sie beschreiben, ist ein Erbe, das auf die alten Zeiten der manuellen Speicherverwaltung zurückgeht. Beispielsweise muss in C ++ der von Objekten verwendete Speicher manuell freigegeben werden, und es ist daher von größter Bedeutung, den Lebenszyklus zusammengesetzter Objekte sorgfältig zu gestalten. Während die Unterscheidung zwischen Aggregation und Komposition in vielen Lehrbüchern noch gelehrt wird, ist sie beim Programmieren in Umgebungen mit automatischer Speicherverwaltung im Wesentlichen irrelevant. Wenn Sie eine Müllabfuhr haben, sind alle nur Kompositionen, Punkt.

Die Einkapselung ist dagegen ein viel allgemeineres Prinzip als das, was Sie beschreiben. Es geht in erster Linie darum, Daten und die Funktionen, die diese Daten verarbeiten, in einem Modul zu bündeln. Eine Möglichkeit, dies zu implementieren, besteht darin, den Status des Moduls privat zu halten und Änderungen an diesem Status durch öffentliche Dienste offenzulegen. Der Client kann also nicht alleine auf den Status zugreifen, sondern muss dem Modul seine Absicht mitteilen, indem er Nachrichten sendet. Die Kapselung ist also nicht auf Objekte beschränkt, sondern gilt auch für Dienste. Eine Möglichkeit, Objekte zu betrachten, besteht darin, sie als Services zu betrachten.

Hier ist ein Beispiel für die Verkapselung

public class Counter {
    private int n = 0;
    public int inc() { return n++; }
}

oder dasselbe unter Verwendung von Lambda-Funktionen

var counter = (function() {
    var n = 0;
    var inc = function() { return n++; }
    return inc;
})();

In beiden Fällen werden die Daten, dh die Variable n, zusammen mit der Funktion gebündelt inc, die auf sie angewendet wird. Und auf keine andere Funktion kann jemals zugegriffen nwerden. Daher haben wir ein gekapseltes Modul, das das Zählen als Service ermöglicht.

NB: Das Offenlegen des gesamten inneren Zustands eines Objekts durch Zugriffsmethoden ist eine Verletzung der Kapselung. Leider ist es ein so häufiger Verstoß, dass viele ihn mit einem guten objektorientierten Design verwechseln werden.


2
Die automatische Speicherverwaltung hat nichts mit Objektbeziehungen zu tun. Ein Objektdiagramm selbst sagt dem Programmierer, wie die Klassen, ihre Schnittstellen und Methoden gemäß den Anforderungen des betrachteten Systems zu codieren sind.
Maxood

2
Es gibt auch eine Überlegung außerhalb des Gedächtnisses. Beim Datenentwurf oder vielleicht bei der Serialisierung. In der Komposition müssen Sie möglicherweise andere Fremdschlüsseleinschränkungen in einem RDBMS haben oder möglicherweise ändern, wie Sie mit der Serialisierung eines Objekts umgehen, wenn es zusammengesetzte untergeordnete Objekte oder zusammengesetzte untergeordnete Objekte oder zugeordnete Objekte hat.
Chris

8

Bei der Kapselung werden die Felder in einer Klasse privat gemacht und der Zugriff auf die Felder über öffentliche Methoden ermöglicht. Wenn ein Feld als privat deklariert ist, kann niemand außerhalb der Klasse auf es zugreifen, wodurch die Felder innerhalb der Klasse ausgeblendet werden. Aus diesem Grund wird die Kapselung auch als Ausblenden von Daten bezeichnet.

    public class Test{

    private String name;

       private int age;

       public int getAge(){
          return age;
       }

       public String getName(){
          return name;
       }
    }

Siehe diese Frage auch .

Assoziation gibt die Beziehung zwischen Objekten an. Beispiel: Computer verwendet Tastatur als Eingabegerät.

Eine Zuordnung wird verwendet, wenn ein Objekt möchte, dass ein anderes Objekt einen Dienst für dieses Objekt ausführt.

Aggregation ist ein Sonderfall der Assoziation. Eine gerichtete Assoziation zwischen Objekten. Wenn ein Objekt ein anderes Objekt hat, haben Sie eine Aggregation zwischen ihnen.

Beispiel: Der Raum hat einen Tisch, aber der Tisch kann ohne den Raum existieren.

    class Room {

      private Table table;

      void setTable(Table table) {
        this.table = table;
      }

    }

Die Zusammensetzung ist ein Sonderfall der Aggregation. Die Zusammensetzung ist restriktiver. Wenn zwischen zwei Objekten eine Komposition besteht, kann das zusammengesetzte Objekt nicht ohne das andere Objekt existieren. Diese Einschränkung gibt es nicht in Aggregation. zB: Räume in einem Haus, die nach der Lebensdauer des Hauses nicht mehr existieren können.

    class House {

      private  Room room;

      House(Room roomSpecs) {
        room = new Room(roomSpecs);
      }

    }

Komposition ist eine Entwurfstechnik zum Implementieren von Hat-A-Beziehungen in Klassen, entweder durch Vererbung oder durch Objektkomposition zur Wiederverwendung von Code.

Eine der besten Methoden bei der Java-Programmierung ist die Verwendung der Komposition anstelle der Vererbung


Wie beantwortet dies die gestellte Frage?
gnat

1

Die Verwendung dieser Techniken führt normalerweise zu Entwurfspraktiken wie SOLID oder verschiedenen Entwurfsmustern .

Der Sinn der Verwendung von Mustern, Praktiken und dergleichen besteht darin, eine Lösung für ein bestimmtes Problem zu beschreiben, die auch wartbar und erweiterbar ist. Sie müssen einfach genug Erfahrung haben, um zu bestimmen, wo Sie welches Muster oder welche Technik anwenden sollen.


1

Ich bin ehrlich gesagt der Meinung, dass diese Begriffe, die im akademischen Bereich gelehrt werden, im Kontext der Objektorientierung und der Klassengestaltung von Bedeutung sind. Diese Konzepte helfen uns sehr, ein System von Grund auf zu modellieren. Assoziation, Aggregation und Komposition gehören ausschließlich zum Klassendiagramm von UML und sind völlig unabhängig von technologischen Einschränkungen wie Speicherproblemen.

Darüber hinaus müssen Sie auch die übergeordneten oder Geschäftsziele des zu modellierenden Systems berücksichtigen. Wir haben Objekte wie House und Room in unserem System in Betracht gezogen, können aber keine starke Beziehung herstellen (über Komposition). Wenn ich beispielsweise ein Immobiliensystem modelliere, muss ich möglicherweise wissen, welcher Raum zu welchem ​​Haus gehört. Aber lassen Sie mich ein Vermessungs- oder Volkszählungssystem modellieren, bei dem ich wissen möchte, wie viele Menschen in jedem Raum des Hauses in einem bestimmten Bereich leben, dann muss ich einen Raum nicht über Komposition mit einem Haus verknüpfen.

Ein anderes Beispiel könnte ein Obstgarten und eine bestimmte Art von Obst sein. Nehmen wir an, ich kann einen Obstgarten nur in Betracht ziehen, wenn darin Apfelbäume gepflanzt sind. Das Fazit ist, dass die Anforderungen des Gesamtsystems sehr wichtig sind.

Die Verkapselung ist eine der Säulen des objektorientierten Designs. Sie müssen Ihre Daten und die Vorgänge, die Sie mit Ihren Daten ausführen, bündeln. Außerdem müssen Sie bestimmte Attribute Ihres Objekts vor der Außenwelt verbergen, damit dieses Objekt in einem gültigen Zustand überleben kann. Wenn zwei Objekte interagieren, müssen sie über eine Schnittstelle miteinander interagieren. Und genau dafür sorgt die Kapselung, wenn wir unser OO-System entwerfen.

So werden diese Konzepte auf den Code angewendet:

ASSOCIATION: Association gibt die Beziehung zwischen Objekten an. Der Programmierer erfährt, welche Methoden in seine Klassen geschrieben werden müssen, damit sie miteinander interagieren. Sie finden verschiedene Beispiele für Code- und Klassendiagramme, um die Zuordnung zu verstehen. In Ihrem Beispiel von Teach and Student besteht eine Beziehung zwischen Lehren und Unterrichten durch . Sie schreiben also einfach eine Reihe von Methoden (technisch Schnittstelle genannt), über die Sie herausfinden können, welcher Schüler welche Lehrer hat und welcher Lehrer welche Schüler hat. Die Zuordnung ermöglicht es dem Systemmodellierer auch, dem Datenbankdesigner die Attribute und Felder mitzuteilen, die in der Datenbank aufbewahrt werden müssen.

ZUSAMMENSETZUNG: Wenn ein Objekt ein integraler Bestandteil eines anderen Objekts ist, muss ich diese Beziehung möglicherweise im Konstruktor des anderen Objekts angeben. In Ihrem Szenario mit Häusern und Zimmern können Sie beispielsweise den folgenden Code eingeben, wenn Sie wissen möchten, welcher Raum zu welchem ​​Haustyp gehört.

class House{
          string _HouseType;   
     public:    
    void setHouseType(string house_type)
     {
        this. _HouseType = house_type;
     } 

     string getHouseType()
    {
       return _HouseType;
    }
};



 House HouseObject = new House();


class Room{

 public: 
 Room(string HouseType) {
       this._HouseType = HouseObject.getHouseType();  //as in my system a room cannot exist without a house

 } 

};

Der Programmierer stellt außerdem sicher, dass beim Aufrufen von Destruktoren des Objekts auch der Destruktor des anderen Objekts aufgerufen wird. Das ist entscheidend.

AGGREGATION: Sagen wir, wenn die Beziehung zwischen Objekten schwach ist, dann würde es für den Programmierer bedeuten, stattdessen eine Instanzvariable zu verwenden, um die Beziehung anzuzeigen. Und dann schreiben Sie eine Mutator-Funktion (Setter), um diesem Objekt einen Wert von einem anderen zu geben.

class Department{

 string dept_name;

public:
   void setDeptName(string name)
   {
        this.dept_name=name;
   }

   string getDeptName()
   {
        return dept_name; 
   }

};



 Department DepartmentObject = new Department();

class Teacher{

 string dept_name;

public:

  setDeptName(string name)
  {
     this.dept_name = DepartmentObject.getDeptName();  //You only need to invoje this method when needed (aggregation)
  }
}

};

1

OK, lassen Sie uns dies auf einige Kernmerkmale abbilden, anstatt auf abstrakte Konzepte, die erst Sinn machen, wenn Sie verstehen, was sie bedeuten. Wie einige Kommentatoren stimme ich der akzeptierten Antwort nicht zu. Ich sage, dies sind Konzepte, die unabhängig von der Speicherverwaltung sind.

Verkapselung

Sie möchten die Komplexität vor dem Kunden verbergen und nur das veröffentlichen, was aus Sicht des Kunden wichtig ist, um dem Kunden die Arbeit zu erleichtern. Als Bonus bekommen Sie die Gewissheit, dass nichts mit dem gekapselten Code zu tun haben kann. Solange Sie die Benutzeroberfläche und die Funktionalität respektieren, können Sie Dinge überarbeiten und sicher sein, dass Sie nichts kaputt machen. Die Abhängigkeit bezieht sich nur auf die veröffentlichte Schnittstelle.

Die Verkapselung ist eine der wichtigsten Säulen der Objektorientierung. Es ist kein Muster, es ist ein Prinzip und es kann für Logik und Daten gleichermaßen gelten. Es ist nur ein grundlegender Vorteil, Klassen an erster Stelle zu verwenden, und nicht etwas, das Sie explizit in einem Diagramm oder Konstruktionsdokument sehen würden.

Verband

Dies ist ein sehr loses Konzept, das im Grunde nur eine Abhängigkeit zwischen Objekten beschreibt. Ein Objekt kennt die Existenz eines anderen Objekts und kann seine Funktionalität irgendwann nutzen. In einem Diagramm weist die Zuordnung darauf hin, dass eine Abhängigkeit besteht und das Ändern eines Objekts sich auf das andere auswirken kann. Es ist keine Technik, die angewendet werden muss, wenn Sie ein Problem zu lösen haben. Es ist eher eine Tatsache des Lebens, die Sie berücksichtigen sollten, wenn sie vorhanden ist. Es ist eine Beziehung. Wie eine Rechnung mit einer Orders-Eigenschaft. Sowohl Bestellung als auch Rechnung haben einen eigenen Lebenszyklus. Bei der einen geht es um Waren und bei der anderen um die Bezahlung, was sie im Wesentlichen unabhängig macht. Es ist jedoch wichtig zu wissen, für welche Waren bezahlt wird.

Eindämmung

Ich füge dies hinzu, weil es in die Reihe gehört und die Aggregation aussagekräftiger machen wird. Ich höre den Begriff nicht mehr oft in einem SE-Kontext, aber ich denke, er ist immer noch nützlich. Einschließung impliziert Einkapselung, bezieht sich jedoch ausschließlich auf Objektinstanzen, die für die einschließende Klasse privat sind. Die Funktionalität der enthaltenen Objekte wird selektiv über öffentliche Schnittstellen verfügbar gemacht. Die enthaltende Klasse steuert den Lebenszyklus der kontrollierten Objekte. Sie verwenden dies, wenn Sie einige Features einer vorhandenen Klasse benötigen, um die enthaltende Klasse funktionsfähig zu machen. Dies kann ein XML-Parser sein, und der Client der enthaltenden Klasse kann möglicherweise nie etwas in Bezug auf XML sehen oder wissen. Stellen Sie sich das enthaltene Objekt als Metapher als Backoffice-Mitarbeiter vor. Kunden treffen diese Leute nie, aber sie werden benötigt, um den Service zu erbringen.

Anhäufung

Dies ist mit Ausnahme der Lebenszykluskontrolle und der Sichtbarkeit der aggregierten Objekte sehr ähnlich. Die aggregierten Objekte sind bereits in einem anderen Kontext verfügbar und werden von einer anderen Entität verwaltet. Der Aggregator bietet lediglich eine Fassade, ein Portal zu den aggregierten Objekten. Wenn der Client das Aggregat adressiert, erhält er die Schnittstelle des Aggregatobjekts selbst und keine Umhüllung. Der Punkt des Aggregats ist das Anbieten einer logischen Gruppierung von Dingen. Stellen Sie sich einen Zugangspunkt zu Diensten oder einem anderen Wrapper-Objekt vor.

Zusammensetzung

Es scheint mir, dass dies der aktuellere Begriff für Eindämmung ist, möglicherweise weil er in einem populären Buch relativ neuer Herkunft geprägt wurde. Wenn sich das Containment auf die technischen Aspekte von Objektbeziehungen konzentriert, wird die Komposition in der Regel im Rahmen von Entwurfsentscheidungen verwendet, insbesondere als flexiblere Alternative für die Vererbung.

Es sagt nicht viel über die Art der Objektbeziehungen oder die Eigentümerschaft aus, sondern zeigt lediglich an, dass die Funktionalität implementiert wird, indem die Funktionalität vorhandener Klassen kombiniert wird. Daher würde ich behaupten, dass es nicht zu dieser Serie gehört, da es nichts über die technischen Aspekte einer Implementierung aussagt, wo die anderen es tun.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.