Ich habe viele Theorien über die Verkapselung und die drei Techniken zu ihrer Implementierung durchlaufen, nämlich Assoziation, Aggregation und Komposition.
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.
quelle
Antworten:
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
oder dasselbe unter Verwendung von Lambda-Funktionen
In beiden Fällen werden die Daten, dh die Variable
n
, zusammen mit der Funktion gebündeltinc
, die auf sie angewendet wird. Und auf keine andere Funktion kann jemals zugegriffenn
werden. 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.
quelle
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.
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.
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.
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
quelle
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.
quelle
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.
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.
quelle
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.
quelle