Was ist der Unterschied zwischen Abstraktion und Kapselung? [Duplikat]

7

Was genau ist der Unterschied zwischen Kapselung und Abstraktion in Java? Alle kurzen Beispiele würden ebenfalls geschätzt werden.

    
quelle

4 Antworten

8

Abstraktion und Verkapselung sind zwei großartige Geschmacksrichtungen, die gut zusammen schmecken.

Kapselung minimiert das, was Sie dem Benutzer Ihres Codes zur Verfügung stellen. Dieser "Benutzer" kann der Rest Ihres Codes sein oder der Code, den Sie veröffentlichen.

Es gibt einige eindeutige Vorteile für die Kapselung:

  • Der Benutzer Ihres Codes hängt nicht von Teilen Ihres Programms ab, die sich wahrscheinlich ändern. Wenn Sie Ihr Programm ändern, müssen sie ihren Code nicht ändern
  • Sie haben mehr Kontrolle darüber, wie sich Code und Status während der Laufzeit Ihres Programms ändern. Sie müssen weniger Szenarien handhaben und weniger unerwartete Probleme haben, um
  • zu beheben

Ich kenne Java nicht, aber hier ist ein kleines Beispiel für die Kapselung in C #:

%Vor%

Anstatt numberOfSpots auszugeben, wird es in der Klasse eingekapselt und über die Methode ToString verfügbar gemacht.

Abstraktion verwendet Erweiterungspunkte, um die Auswahl auf einen anderen Teil zu verschieben, von dem der genaue Code ausgeführt wird. Diese Wahl kann an anderer Stelle in Ihrem Programm, in einem anderen Programm oder dynamisch zur Laufzeit getroffen werden.

Die Abstraktion hat auch starke Vorteile:

  • Wenn Sie Ihren Code ändern, der eine Abstraktion implementiert, muss der Benutzer der Abstraktion seinen Code nicht ändern. Solange sich die Abstraktion nicht ändert, müssen die Benutzer ihren Code nicht ändern.
  • Wenn Sie Code schreiben, der eine Abstraktion verwendet, können Sie einmal Code schreiben, der gegen jeden neuen Code wiederverwendbar ist, der diese Abstraktion implementiert. Sie können weniger Code schreiben, um mehr zu tun.

Eine häufig verwendete Abstraktion in C # ist IEnumerable . Listen, Arrays, Wörterbücher und jede andere Art von Auflistungsklassen implementieren alle IEnumerable . Die foreach -Schleifenstruktur und die Gesamtheit der LINQ-Bibliothek basieren auf dieser Abstraktion:

%Vor%

Sie können auch Ihre eigenen Abstraktionen schreiben:

%Vor%

Sie können beide zusammen verwenden, wie ich es mit IAnimal und IsHealthy getan habe. IAnimal ist eine Abstraktion, und nur eine get Zugriffsmethode und keine set Zugriffsmethode auf IsHealthy ist eine Kapselung.

    
Merlyn Morgan-Graham 11.02.2011, 09:01
quelle
6

Diese beiden Konzepte sind ziemlich unterschiedlich.

Abstraktion ist die Übung, eine Basisklasse "abstrakt" zu machen und dann ihre Funktionalität zu erweitern. Eine abstrakte Klasse ist etwas, das in einer konkreten Sache nicht existiert; Sein einziger Zweck ist es, erweitert zu werden. Denken Sie daran, wenn Sie Klassen schreiben, um verschiedene Arten darzustellen. Alle deine verschiedenen Arten könnten eine abstrakte Tierklasse erweitern, da sie alle gemeinsame Eigenschaften als Tiere haben. Allerdings würden Sie niemals ein Animal-Objekt instantiieren, da jedes Tier, das Sie auf der Welt sehen, ein Eichhörnchen, ein Hund oder ein Fisch ist ... oder eine Art konkrete Umsetzung dieser Basis, abstrakte Tierklasse.

Bei der Kapselung werden Ihre Klassenvariablen privat gemacht und dann der Zugriff auf sie von Methoden zum Abrufen und Festlegen ermöglicht. Der Zweck davon ist die Art, wie auf Ihre Daten zugegriffen wird und wie sie implementiert wird. Wenn Sie zum Beispiel eine Variable mit einer Anforderung haben, die bei jeder Änderung eine zweite Variable um 1 erhöht, dann würden Sie diese Funktionalität einkapseln; Auf diese Weise ist Ihr Code zuverlässiger, weil Sie nicht jedes Mal daran denken müssen, diese Regel einzuhalten, wenn Sie auf die ursprüngliche Variable zugreifen.

Wenn Sie bestimmte Codebeispiele benötigen, würde ich Ihnen empfehlen, nur eine Google-Suche durchzuführen, da es viele Beispiele gibt. Hier sind zwei:

Ссылка Ссылка

    
user470714 11.02.2011 07:54
quelle
4

Die Kapselung soll Ihre Membervariablen oder Methoden vor der Außenwelt schützen.

Abstraktion ist der Weg zu einer spezifischen Implementierung. Das ist die zu verwendende Implementierung, die dem Benutzer unbekannt ist.

    
GuruKulki 11.02.2011 07:49
quelle
3

Kapselung ist Teil der Abstraktion. Der Begriff der Abstraktion besteht darin, ein Objekt zu erzeugen, das ein anderes Objekt repräsentiert. In der Regel ist das ursprüngliche Objekt komplexer als die Abstraktion. Eine Abstraktion ist also eine Repräsentation, in der Regel als Gedächtnisstütze, für Terminologie / Kommunikation etc. Denken Sie daran: Abstrakte Kunst ist eine Repräsentation von etwas anderem. Ein Lenkrad, Schalthebel und 2/3 Pedale sind eine Abstraktion, wie ein Auto funktioniert.

Grundsätzlich erlaubt die Abstraktion, etwas Komplexes mit vielen Details als etwas viel Einfacheres darzustellen. Meiner Meinung nach bezieht sich dies auf das "Chunking" in der Kognitionswissenschaft. Wir sind nicht in der Lage, komplexe Dinge in unserem Kopf zu behalten, also vereinfachen wir es, indem wir abstrahieren und dann die Abstraktion benutzen. Design Patterns sind ein weiteres großartiges Beispiel. Anstatt über Details zu sprechen, können wir über das Command, State oder Strategy Pattern etc. sprechen.

Die Verkapselung ist Teil der Bildung / Schaffung einer Abstraktion. Je kleiner die Oberfläche eines Objekts ist, desto einfacher ist es zu abstrahieren. Sie müssen nicht wissen, wie ein Motor und ein Getriebe arbeiten, um ein Auto zu fahren, Sie müssen nur ihre Abstraktionen verstehen (Gangschaltung und Beschleuniger). Die Details von Motor und Getriebe sind gekapselt (in die Schnittstelle), um die Abstraktion zu erzeugen.

Für die Abstraktion wird Kapselung benötigt, weil eine Abstinenz nicht mit allen realen Details und Komplexität umgehen kann (sonst ist es keine Abstraktion). Der Schalthebel ist also eine unvollständige Darstellung (oder ein Modell) eines Getriebes, ist aber für den täglichen Gebrauch ausreichend. Die Verkapselung kann man sich als 'Verstecken von Details' vorstellen, was für eine einfachere Darstellung notwendig ist.

Es ist auch wichtig, das Konzept einer "Schnittstelle" zu diskutieren. In den meisten Fällen sind die Begriffe "Schnittstelle" und "Abstraktion" in diesem Fall weniger austauschbar. Eine Schnittstelle ist der Teil eines Systems, mit dem der Benutzer handelt oder interagiert. Die Schnittstelle zu einem Auto ist das Lenkrad, Schalthebel und Pedale usw. Die Abstraktion erzeugt eine Schnittstelle. Sie beschäftigen sich nicht direkt mit dem Motor / Getriebe, Sie beschäftigen sich mit ihren jeweiligen Schnittstellen.

Ein weiterer Grund für die Kapselung ist, dass wir uns mit einem unvollständigen Modell / einer unvollständigen Abstraktion beschäftigen, dass wir die vollständige Komplexität des Originals nicht verstehen und dass wir nicht mit allen Variablen vertraut sind (weil wir das nicht tun) verstehe das vollständige Modell). Dies ist wichtig für die Entkopplung, denn ohne Abstraktion würden interagierende Komponenten zu viel voneinander wissen. Denken Sie darüber nach, denn jedes Auto hat ein Lenkrad, Pedale und Schalthebel, Sie können jedes Auto fahren, unabhängig von Motortyp usw. Auch das Getriebe ist vom Motor abstrahiert. Sonst würde jede kundenspezifische Maschine ein kundenspezifisches Getriebe benötigen.

Ähnlich ist eine Klasse eine Abstraktion. Die Klasse repräsentiert ein komplexes Modell, über ihre Schnittstelle - die öffentlichen Mitglieder der Klasse. Diese Schnittstelle wird durch Kapselung erstellt. Die Klasse stellt ihren Mitarbeitern eine vereinfachte Schnittstelle ihrer komplexeren Implementierung zur Verfügung. Sie können es sich auch als eine Situation, die man wissen muss, vorstellen. Die Mitarbeiter der Klasse müssen nicht genau wissen, wie es funktioniert. Genauso wie Sie nicht wissen müssen, wie ein Motor funktioniert, um ein Auto zu fahren.

Kapselung, Schnittstellen und Abstraktion spielen eine entscheidende Rolle für die Kohäsion und Kopplung und damit für die Aufrechterhaltung Ihres Codes. Wenn Sie keine guten Abstraktionen erstellen und das Prinzip "Need to know" verletzen, dann wird Ihr Code verwickelt, fragil und ein Albtraum, den es zu ändern gilt, weil es kein "Puffern" gibt. Das OO-Konzept von 'tell do not ask' bezieht sich auch darauf.

    
Joshua Lewis 11.02.2011 08:48
quelle

Tags und Links