Was ist der genaue Unterschied zwischen Kapselung und Abstraktion?
Antworten
Zu viele Anzeigen?Abstraktion ist ein verallgemeinerter Begriff, d.h. Kapselung ist eine Teilmenge von Abstraktion.
Abstraktion
Verkapselung
Damit wird ein Problem auf der Entwurfsebene gelöst.
Die Kapselung löst ein Problem auf der Implementierungsebene.
blendet die unnötigen Details aus, zeigt aber die wesentlichen Informationen.
Sie versteckt den Code und die Daten in einer einzigen Einheit, so dass die Daten vor der Außenwelt geschützt werden können.
Konzentriert sich auf den externen Ausguck.
Der Schwerpunkt liegt auf der internen Arbeit.
Konzentrieren wir uns darauf, was ein Objekt tut, und nicht darauf, wie es das tut.
Konzentrieren wir uns darauf, wie ein Objekt etwas tut.
Beispiel: Äußeres Erscheinungsbild des Mobiltelefons, z. B. mit Bildschirm und Tasten.
Beispiel: Innere Details des Handys, wie Taste und Bildschirm über Schaltkreise miteinander verbunden sind.
Beispiel: Die Lösungsarchitekt ist die Person, die die hochrangigen abstrakt technischen Entwurf der gesamten Lösung, der dann an den Kunden weitergegeben wird. Entwicklungsteam para Umsetzung .
Hier fungiert der Lösungsarchitekt als Abstraktum und das Entwicklungsteam als Verkapselung.
Beispiel: Verkapselung (Vernetzung) von Nutzdaten
Bild mit freundlicher Genehmigung
Abstraktion (oder Modularität) - Typen ermöglichen es dem Programmierer, auf einer höheren Ebene als der des Bits oder Bytes zu denken und sich nicht um die Implementierung auf niedriger Ebene zu kümmern. So können Programmierer zum Beispiel eine Zeichenkette als eine Menge von Zeichenwerten betrachten und nicht als eine bloße Anordnung von Bytes. Auf einer noch höheren Ebene ermöglichen Typen den Programmierern, über Schnittstellen zwischen zwei Subsystemen beliebiger Größe nachzudenken und diese auszudrücken. Dies ermöglicht mehr Lokalisierungsebenen, so dass die für die Interoperabilität der Teilsysteme erforderlichen Definitionen konsistent bleiben, wenn diese beiden Teilsysteme miteinander kommunizieren. Quelle
Viele gute Antworten wurden oben gegeben, aber ich werde hier meinen (Java-)Standpunkt darlegen.
Datenkapselung bedeutet einfach, dass der Zugriff auf logisch gruppierte Daten in einer Klasse verpackt und kontrolliert wird. Es ist im Allgemeinen mit einem anderen Schlüsselwort verbunden - Verstecken von Daten . Dies wird in Java erreicht durch Zugriffsmodifikatoren .
Ein einfaches Beispiel wäre die Definition einer privaten Variable und der Zugriff auf sie mit Getter- und Setter-Methoden oder die Privatisierung einer Methode, die nur innerhalb der Klasse verwendet wird. Der Benutzer muss nichts über diese Methoden und Variablen wissen.
Nota : Es sollte nicht mißverstanden werden, daß es bei der Verkapselung nur um das Verstecken von Daten geht. Wenn wir von Verkapselung sprechen, sollte die Betonung auf der Gruppierung, Verpackung oder Bündelung von zusammengehörigen Daten und Verhalten liegen.
Datenabstraktion auf der anderen Seite ist das Konzept der Verallgemeinerung, so dass die darunter liegende komplexe Logik für den Benutzer nicht sichtbar ist. In Java wird dies erreicht durch die Verwendung von Schnittstellen y abstrakt Klassen.
Beispiel.
Nehmen wir an, wir haben eine Schnittstelle Tier und sie hat eine Funktion makeSound() . Es gibt zwei konkrete Klassen Hund y Katze die diese Schnittstelle implementieren. Diese konkreten Klassen haben eigene Implementierungen der Funktion makeSound(). Nehmen wir nun an, wir haben ein Tier (das wir von einem externen Modul erhalten). Alles, was der Benutzer weiß, ist, dass das Objekt, das er empfängt, ein Tier ist, und es liegt in der Verantwortung des Benutzers, den Tierlaut auszugeben. Ein brachialer Weg ist die Überprüfung des empfangenen Objekts auf identifizieren. sein Typ, dann Typisierung zu dieser Tierart und dann aufrufen makeSound() darauf. Ein besserer Weg ist jedoch Abstrakte Sache aus . Verwenden Sie Tier als polymorphe Referenz und rufen Sie makeSound() auf. Unter Laufzeit Je nachdem, was der tatsächliche Objekttyp ist, wird die richtige Funktion aufgerufen.
Mehr Details aquí .
Die komplexe Logik befindet sich in der Platine, die in einem Touchpad gekapselt ist, und eine schöne Schnittstelle (Tasten) wird bereitgestellt, um sie dem Benutzer zu vermitteln.
PS: Die obigen Links führen zu meinem persönlichen Blog.
Dies sind etwas unscharfe Begriffe, die nicht nur in der Informatik und der Programmierung vorkommen. Ich möchte einige zusätzliche Überlegungen anstellen, die anderen helfen könnten, diese wichtigen Konzepte zu verstehen.
Kurze Antwort
Verkapselung - Verstecken und/oder Einschränken des Zugangs zu bestimmten Teilen eines Systems bei gleichzeitiger Offenlegung der erforderlichen Schnittstellen.
Abstraktion - Die Betrachtung von etwas, das bestimmte Merkmale aufweist, losgelöst von konkreten Realitäten, spezifischen Objekten oder tatsächlichen Instanzen, wodurch die Komplexität reduziert wird.
Die wichtigsten Ähnlichkeit ist, dass diese Techniken sollen das Verständnis und den Nutzen verbessern.
Die wichtigsten Unterschied ist das Abstraktion ist ein Mittel, um Dinge einfacher darzustellen (oft um die Darstellung allgemeiner anwendbar zu machen), während Kapselung eine Methode ist, um die Art und Weise zu ändern, wie andere Dinge mit etwas interagieren.
Lange Antwort
Verkapselung
Hier ist ein Beispiel für die Kapselung, das hoffentlich die Dinge klarer macht:
Hier haben wir eine Arduino Uno, und ein Arduino Uno in einem Gehäuse. Ein Gehäuse ist eine großartige Darstellung dessen, worum es bei der Verkapselung geht.
Die Kapselung zielt darauf ab, bestimmte Komponenten vor äußeren Einflüssen und Erkenntnissen zu schützen sowie Komponenten freizulegen, mit denen sich andere Dinge verbinden sollen. In Bezug auf die Programmierung bedeutet dies Informationsverschleierung obwohl Zugriffsmodifikatoren die den Umfang, in dem bestimmte Variablen und/oder Eigenschaften gelesen und geschrieben werden können, verändern.
Darüber hinaus zielt die Kapselung aber auch darauf ab, diese externen Schnittstellen viel effektiver bereitzustellen. In unserem Arduino-Beispiel könnten dies die schönen Tasten und der Bildschirm sein, die die Interaktion des Benutzers mit dem Gerät wesentlich vereinfachen. Sie bieten dem Benutzer einfache Möglichkeiten, das Verhalten des Geräts zu beeinflussen und nützliche Informationen über seinen Betrieb zu erhalten, was sonst sehr viel schwieriger wäre.
In der Programmierung bedeutet dies die Gruppierung verschiedener Komponenten zu einem trennbaren Konstrukt, wie z. B. einer function
, class
, oder object
. Dazu gehört auch die Bereitstellung von Mitteln zur Interaktion mit diesen Konstrukten sowie von Methoden zur Gewinnung nützlicher Informationen über sie.
Die Kapselung hilft dem Programmierer in vielerlei Hinsicht, nicht zuletzt durch die verbesserte Wartbarkeit und Testbarkeit des Codes.
Abstraktion
Obwohl viele andere Antworten hier Abstraktion als Verallgemeinerung definiert haben, denke ich persönlich, dass diese Definition fehlgeleitet ist. Ich würde sagen, dass die Verallgemeinerung eigentlich eine spezifische Art der Abstraktion, nicht andersherum. Mit anderen Worten: Alle Verallgemeinerungen sind Abstraktionen, aber alle Abstraktionen sind no notwendigerweise Verallgemeinerungen.
Ich stelle mir die Abstraktion folgendermaßen vor:
Würden Sie sagen, dass das Bild dort ein Baum ist? Die Chancen stehen gut, dass Sie das tun würden. Aber ist es realmente einen Baum? Nun, natürlich nicht! Es ist eine Ansammlung von Pixeln, die wie etwas aussehen, das wir einen Baum nennen könnten. Man könnte sagen, dass er eine Abstraktion eines echten Baumes darstellt. Beachten Sie, dass mehrere visuelle Details des Baumes weggelassen wurden. Außerdem wächst er nicht, verbraucht kein Wasser und produziert keinen Sauerstoff. Wie sollte er auch? Er ist nur eine Ansammlung von Farben auf einem Bildschirm, dargestellt durch Bytes in Ihrem Computerspeicher.
Und das ist die Essenz der Abstraktion. Es ist ein Weg, die Dinge zu vereinfachen, damit sie leichter zu verstehen sind. Jede Idee, die Ihnen durch den Kopf geht, ist eine Abstraktion der Realität. Ihr geistiges Bild von einem Baum ist genauso wenig ein echter Baum wie dieses JPEG.
Bei der Programmierung könnten wir dies zu unserem Vorteil nutzen, indem wir eine Tree
Klasse mit Methoden für simuliertes Wachstum, Wasserverbrauch und Sauerstoffproduktion. Unsere Kreation soll unsere Erfahrungen mit echten Bäumen widerspiegeln und nur die Elemente enthalten, die uns für unsere spezielle Simulation wirklich wichtig sind. Wir verwenden die Abstraktion als eine Möglichkeit, unsere Erfahrungen mit Bytes und Mathematik darzustellen.
Abstrakte Klassen
Die Abstraktion in der Programmierung ermöglicht es uns auch, Gemeinsamkeiten zwischen mehreren "konkreten" Objekttypen (Typen, die tatsächlich existieren) zu berücksichtigen und diese Gemeinsamkeiten innerhalb einer einzigen Einheit zu definieren. Zum Beispiel, unser Tree
Klasse kann von einer abstract class Plant
die mehrere Eigenschaften und Methoden hat, die auf alle unsere pflanzenähnlichen Klassen anwendbar sind, aber beseitigt diejenigen, die für jede Pflanzenart spezifisch sind. Dadurch kann die Duplizierung von Code erheblich reduziert und die Wartbarkeit verbessert werden.
Der praktische Unterschied zwischen einer abstract class
und einfach class
ist, dass es konzeptionell keine "echten" Instanzen des abstract class
. Es würde keinen Sinn machen, eine Plant
Objekt, weil das nicht spezifisch genug ist. Jedes "echte" Plant
ist auch eine spezifischere Art von Plant
.
Wenn wir unser Programm realistischer gestalten wollen, sollten wir auch die Tatsache berücksichtigen, dass unsere Tree
Klasse könnte selbst zu abstrakt sein. In Wirklichkeit ist jede Tree
ist eine spezifischere Art von Tree
so dass wir Klassen für diese Typen erstellen können, wie z. B. Birch
, Maple
usw., die von unserem, vielleicht jetzt abstract
, Tree
Klasse.
JVM
Ein weiteres gutes Beispiel für Abstraktion ist die Virtuelle Java-Maschine (JVM) die einen virtuellen oder abstrakten Computer bereitstellt, auf dem Java-Code ausgeführt werden kann. Es entfernt im Wesentlichen alle plattformspezifischen Komponenten eines Systems und bietet eine abstrakte Schnittstelle für "Computer" ohne Rücksicht auf ein bestimmtes System.
Der Unterschied
Die Kapselung unterscheidet sich von der Abstraktion dadurch, dass sie nichts damit zu tun hat, wie "echt" oder "genau" etwas ist. Sie tut es nicht entfernen Komponenten einer Sache, um sie zu vereinfachen oder besser anwendbar zu machen. Vielmehr kann es ausblenden bestimmte Komponenten, um einen ähnlichen Zweck zu erreichen.
- Durch die Abstraktion können Sie sich darauf konzentrieren, was das Objekt tut, und nicht, wie es es tut.
- Verkapselung bedeutet, dass die internen Details oder die Mechanik, wie ein Objekt etwas tut, verborgen werden.
Wenn Sie ein Auto fahren, wissen Sie, was das Gaspedal bewirkt, aber Sie kennen vielleicht nicht den Vorgang dahinter, weil er gekapselt ist.
Lassen Sie mich ein Beispiel in C# geben. Angenommen, Sie haben eine ganze Zahl:
int Number = 5;
string aStrNumber = Number.ToString();
können Sie eine Methode wie Number.ToString() verwenden, die Ihnen die Zeichendarstellung der Zahl 5 liefert und diese in einem String-Objekt speichert. Die Methode sagt Ihnen, was sie tut, und nicht, wie sie es tut.
Verkapselung : Versteckt unerwünschte/unerwartete/angemessene Implementierungsdetails vor den eigentlichen Nutzern des Objekts. z.B..
List<string> list = new List<string>();
list.Sort(); /* Here, which sorting algorithm is used and hows its
implemented is not useful to the user who wants to perform sort, that's
why its hidden from the user of list. */
Abstraktion : Ist eine Möglichkeit der Verallgemeinerung und somit ein gemeinsamer Weg, um mit Objekten von großer Vielfalt zu arbeiten. z.B.
class Aeroplane : IFlyable, IFuelable, IMachine
{ // Aeroplane's Design says:
// Aeroplane is a flying object
// Aeroplane can be fueled
// Aeroplane is a Machine
}
// But the code related to Pilot, or Driver of Aeroplane is not bothered
// about Machine or Fuel. Hence,
// pilot code:
IFlyable flyingObj = new Aeroplane();
flyingObj.Fly();
// fighter Pilot related code
IFlyable flyingObj2 = new FighterAeroplane();
flyingObj2.Fly();
// UFO related code
IFlyable ufoObj = new UFO();
ufoObj.Fly();
// **All the 3 Above codes are genaralized using IFlyable,
// Interface Abstraction**
// Fly related code knows how to fly, irrespective of the type of
// flying object they are.
// Similarly, Fuel related code:
// Fueling an Aeroplane
IFuelable fuelableObj = new Aeroplane();
fuelableObj.FillFuel();
// Fueling a Car
IFuelable fuelableObj2 = new Car(); // class Car : IFuelable { }
fuelableObj2.FillFuel();
// ** Fueling code does not need know what kind of vehicle it is, so far
// as it can Fill Fuel**