Verkapselung gegen Abstraktion?


137

Hier sind die kurzen Definitionen von Kapselung und Abstraktion.

Abstraktion:

Der Abstraktionsprozess in Java wird verwendet, um bestimmte Details auszublenden und nur die wesentlichen Merkmale des Objekts anzuzeigen. Mit anderen Worten, es handelt sich um die Außenansicht eines Objekts (Schnittstelle). Das einzige gute Beispiel, das ich dafür auf verschiedenen Websites sehe, ist die Schnittstelle.

Verkapselung:

Es geht im Grunde darum, den Zustand des Objekts mit Hilfe von Modifikatoren wie privat, öffentlich, geschützt usw. zu verbergen. Wir legen den Zustand nur bei Bedarf durch öffentliche Methoden offen.

Was wir mit Modifikatoren wie erreichen private, publicverbirgt auch unnötige Details vor der Außenwelt, die nichts anderes als ein Abstraktionskonzept ist

Aus der obigen Erklärung geht hervor, dass die Kapselung ein Teil der Abstraktion ist, oder wir können sagen, dass es sich um eine Teilmenge der Abstraktion handelt. Aber warum wird dann der Kapselungsbegriff erfunden, wenn wir uns nur mit Abstraktion befassen können? Ich bin mir sicher, dass es einen großen Unterschied geben sollte, der sie auszeichnet, aber das meiste Material im Netz sagt für beide fast dasselbe aus.

Obwohl diese Frage auch schon früher in diesem Forum aufgeworfen wurde, poste ich sie mit besonderen Zweifeln erneut. Einige Antworten sagen auch, dass Abstraktion ein Konzept ist und Kapselung Implementierung ist. Aber ich kaufe das nicht - Wenn es wahr ist, dann kann ich mir vorstellen, dass diese beiden unterschiedlichen Konzepte uns verwirren.

Update: - Nach 5 Jahren habe ich meine eigene Antwort gefunden, die auf den Antworten in diesem und den folgenden Beiträgen basiert

  1. Unterschied zwischen Abstraktion und Kapselung?
  2. Kapselung gegen Abstraktion Beispiel aus der realen Welt

Die oben definierte Kapselung ist ein Werkzeug der Abstraktion, aber ich neige dazu, sie als das zu betrachten, was eine Klasse kapselt (Funktionalität / Daten unabhängig vom Zugriff), wobei Abstraktion eher das Gefühl ist, Sie von Bedenken konkreter Implementierungen zu entfernen, dh unabhängig davon, wie es ist erledigt und was genau getan wird, ist aus Wikipedia machbarAn 'abstraction' (noun) is a concept that acts as a super-categorical noun for all subordinate concepts, and connects any related concepts as a group, field, or category.
TI

Bei der Kapselung werden eher die relevanten Details (Daten und Verhaltensweisen, die mit den Daten arbeiten) in Bezug auf den Kontext gebunden. Dies kann auch ohne Zugriffsspezifizierer erreicht werden private public, da diese nur Informationen / Daten verbergen, die wir tun, da dies eine gute Vorgehensweise zum Schutz der Daten der Instanz ist.
user3227986

Antworten:


98

Kapselung ist eine Strategie, die als Teil der Abstraktion verwendet wird. Kapselung bezieht sich auf den Zustand von Objekten - Objekte kapseln ihren Zustand und verbergen ihn von außen; Externe Benutzer der Klasse interagieren über ihre Methoden mit ihr, können jedoch nicht direkt auf den Klassenstatus zugreifen. Die Klasse abstrahiert also die Implementierungsdetails, die sich auf ihren Status beziehen.

Abstraktion ist ein allgemeinerer Begriff, der auch (unter anderem) durch Unterklassen erreicht werden kann. Beispielsweise ist die Schnittstelle Listin der Standardbibliothek eine Abstraktion für eine Folge von Elementen, die nach ihrer Position indiziert sind. Konkrete Beispiele für a Listsind a ArrayListoder a LinkedList. Code, der mit einem ListAbstract interagiert, über das Detail, welche Art von Liste verwendet wird.

Eine Abstraktion ist oft nicht möglich, ohne den zugrunde liegenden Zustand durch Kapselung zu verbergen. Wenn eine Klasse ihren internen Zustand enthüllt, kann sie ihr Innenleben nicht ändern und kann daher nicht abstrahiert werden.


8
Kapselung bedeutet, dass eine Gruppe verwandter Eigenschaften, Methoden und anderer Elemente als eine einzelne Einheit oder ein einzelnes Objekt behandelt wird. msdn.microsoft.com/en-us/library/dd460654.aspx
Raberana

1
Einkapselung führt zu Abstraktion.
Martin

124

Abstraktion ist das Konzept, etwas einfacher zu beschreiben, dh die Details zu abstrahieren, um sich auf das Wesentliche zu konzentrieren (Dies zeigt sich auch in der abstrakten Kunst, wo sich der Künstler beispielsweise auf die Bausteine ​​von Bildern konzentriert, wie z Farbe oder Formen). Dieselbe Idee wird in OOP übersetzt, indem eine Vererbungshierarchie verwendet wird, in der abstraktere Konzepte oben stehen und konkretere Ideen unten auf ihren Abstraktionen aufbauen. Auf der abstraktesten Ebene gibt es überhaupt keine Implementierungsdetails und möglicherweise nur sehr wenige Gemeinsamkeiten, die hinzugefügt werden, wenn die Abstraktion abnimmt.

Im oberen Bereich befindet sich beispielsweise eine Schnittstelle mit einer einzelnen Methode. In der nächsten Ebene werden dann mehrere abstrakte Klassen bereitgestellt, die möglicherweise einige Details zur obersten Ebene ausfüllen oder nicht, aber durch Hinzufügen eigener abstrakter Methoden verzweigen Dann sind für jede dieser abstrakten Klassen konkrete Klassen, die Implementierungen aller verbleibenden Methoden bereitstellen.

Verkapselung ist eine Technik . Es kann zur Unterstützung der Abstraktion dienen oder auch nicht, aber es geht sicherlich um das Verstecken und / oder die Organisation von Informationen. Es erfordert, dass Daten und Funktionen auf irgendeine Weise gruppiert werden - natürlich erfordert eine gute OOP-Praxis, dass sie durch Abstraktion gruppiert werden. Es gibt jedoch andere Verwendungszwecke, die nur die Wartbarkeit usw. unterstützen.


13
Ihre Definition von Abstraktion ist die beste, die ich je gesehen habe, und ich habe das Gefühl, dass sie zum ersten Mal in meinem Kopf geklickt hat und Sinn ergibt. Ich weiß, es ist mehr als 3 Jahre her, seit du das gepostet hast, aber danke.
Casey Crookston

1
Wow ... Abstraktion ... ausgedrückt in Bezug auf Kunst ... Rot könnte Wut sein, das ist alles, was wir wissen mussten! Vielen Dank für diese Ansicht des Konzepts :-)
SlowLearner

Die Einkapselung wird verwendet, um "lose Kopplung und hohe Kohäsion" zu erreichen.
Sortierer

28

Kapselung ist ein Teil der Abstraktion oder wir können sagen, es ist eine Teilmenge der Abstraktion

Sie sind verschiedene Konzepte.

  • Bei der Abstraktion werden alle nicht benötigten / unwichtigen Attribute eines Objekts verfeinert und nur die für Ihre Domain am besten geeigneten Eigenschaften beibehalten.

    ZB für eine Person: Sie entscheiden sich, Vor- und Nachname und SSN beizubehalten. Alter, Größe, Gewicht usw. werden als irrelevant ignoriert.

    Bei der Abstraktion beginnt Ihr Design.

  • Die Kapselung ist der nächste Schritt, bei dem Operationen erkannt werden, die für die Attribute geeignet sind, die Sie während des Abstraktionsprozesses beibehalten haben. Es ist die Zuordnung der Daten zu der Operation, die auf sie einwirkt.
    Dh Daten und Methoden werden gebündelt.

Können wir sagen, dass Abstraktion eine Art Designkonzept ist und Encapsulation hauptsächlich Bedenken hinsichtlich der Implementierung von Design hat, auf die wir uns während der Abstraktion geeinigt haben?
M Sach

1
In der Kapselung definieren Sie Operationen, die auf Ihre Daten angewendet werden können / müssen. Dies kann auch Teil des Entwurfs sein. B. SSN abrufen, aber nicht ändern
Cratylus

25

Durch die Kapselung werden unnötige Daten in einer Kapsel oder Einheit versteckt

Die Abstraktion zeigt ein wesentliches Merkmal eines Objekts

Die Kapselung wird verwendet, um das Mitglied vor einer externen Klasse und Schnittstelle zu verbergen. Verwenden von Zugriffsmodifikatoren, die in c # bereitgestellt werden, wie öffentlich, privat, geschützt usw. Beispiel:

Class Learn
{
  private int a;         // by making it private we are hiding it from other
  private void show()   //class to access it
  {
   console.writeline(a);
  }
}

Hier haben wir Wrap-Daten in einer Einheit oder Kapsel, dh Klasse.

Abstraktion ist genau das Gegenteil von Verkapselung.

Die Abstraktion wird verwendet, um dem Benutzer wichtige und relevante Daten anzuzeigen. Bestes Beispiel aus der realen Welt In einem Mobiltelefon sehen Sie die verschiedenen Arten von Funktionen wie Kamera, MP3-Player, Anruffunktion, Aufnahmefunktion, Multimedia usw. Es handelt sich um eine Abstraktion, da Sie nur relevante Informationen anstelle des internen Engineerings sehen.

 abstract class MobilePhone
    {
        public void Calling();       //put necessary or essential data
        public void SendSMS();       //calling n sms are main in mobile
    }

    public class BlackBerry : MobilePhone   // inherited main feature
    {
        public void FMRadio();            //added new
        public void MP3();
        public void Camera();
        public void Recording();

    }

Genau. Diese Jungs sind irgendwie Gegensätze. good oop neigt dazu, die Dinge zu abstrahieren, die sich nicht ändern, und [die Töne, die sich ändern, zusammenzufassen] [1]. [1]: Principles-wiki.net/…
Ray Tayek

15

Abstraktion ist ein sehr allgemeiner Begriff, und Abstraktion in Software ist nicht auf objektorientierte Sprachen beschränkt. Eine Wörterbuchdefinition: "der Akt, etwas als allgemeine Qualität oder Eigenschaft zu betrachten, abgesehen von konkreten Realitäten, bestimmten Objekten oder tatsächlichen Instanzen".

Die Assemblersprache kann als Abstraktion des Maschinencodes betrachtet werden. Die Assemblierung drückt die wesentlichen Details und die Struktur des Maschinencodes aus, befreit Sie jedoch davon, über die verwendeten Opcodes, das Layout des Codes im Speicher nachzudenken und Sprünge zu machen die richtige Adresse usw.

Die API Ihres Betriebssystems ist eine Abstraktion des zugrunde liegenden Computers. Ihr Compiler bietet eine Abstraktionsebene, die Sie vor den Details der Assemblersprache schützt. Der in Ihr Betriebssystem integrierte TCP / IP-Stack abstrahiert die Details der Übertragung von Bits über ein Netzwerk. Wenn Sie bis zum Rohsilizium gehen, haben die Leute, die Ihre CPU entworfen haben, dazu Schaltpläne verwendet, die in Form von "Dioden" und "Transistoren" geschrieben wurden. Dies sind Abstraktionen darüber, wie Elektronen durch Halbleiterkristalle wandern.

In der Software ist alles eine Abstraktion. Wir erstellen Programme, die einen Aspekt der Realität simulieren oder modellieren, aber notwendigerweise abstrahieren unsere Modelle immer einige Details der "realen Sache". Wir bauen Schicht für Schicht Abstraktionen auf, weil nur so etwas erreicht werden kann. (Stellen Sie sich vor, Sie wollten beispielsweise einen Sudoku-Löser herstellen und mussten ihn nur mit Halbleiterkristallen entwerfen. "OK, ich brauche hier ein Stück Silizium vom N-Typ ...")

Im Vergleich dazu ist "Einkapselung" ein sehr spezifischer und begrenzter Begriff. Einige der anderen Antworten auf diese Frage haben bereits gute Definitionen dafür gegeben.


14

Beantwortung meiner eigenen Frage nach 5 Jahren, da ich der Meinung bin, dass noch weitere Details erforderlich sind

Abstraktion:

Technische Definition: - Abstraktion ist ein Konzept, um unnötige Details (komplex oder einfach) zu verbergen und nur die wesentlichen Merkmale des Objekts anzuzeigen. Hier gibt es keine Implementierung, es ist nur ein Konzept

Was es praktisch bedeutet: - Wenn ich sage, mein Unternehmen benötigt ein Medium / Gerät, damit sich die Mitarbeiter mit dem Kunden verbinden können. Dies ist die reinste Form der Abstinenz (wie die Schnittstelle in Java), da dieses Gerät / Medium Telefon oder Internet oder Skype oder persönlich oder per E-Mail usw. sein kann. Ich gehe nicht auf das Wesentliche von Gerät / Medium ein

Selbst wenn ich sage, dass mein Unternehmen ein Medium / Gerät benötigt, damit Mitarbeiter per Sprachanruf eine Verbindung zum Kunden herstellen können. Dann spreche ich auch abstrakt, aber auf einer etwas niedrigeren Ebene, da Gerät / Medium Telefon oder Skype oder etwas anderes sein kann usw.

Wenn ich jetzt sage, mein Unternehmen benötigt ein Telefon, damit die Mitarbeiter per Sprachanruf eine Verbindung zum Kunden herstellen können. Dann spreche ich auch abstrakt, aber auf einer etwas niedrigeren Ebene, da das Telefon von jeder Firma wie iPhone oder Samsung oder Nokia usw. Sein kann

Kapselung: - Es geht im Wesentlichen darum, den Zustand (Informationen) eines Objekts mit Hilfe von Modifikatoren wie privat, öffentlich, geschützt usw. zu verbergen. Wir legen den Zustand nur bei Bedarf durch öffentliche Methoden offen.

Was es praktisch bedeutet: - Wenn ich jetzt sage, mein Unternehmen benötigt ein iPhone, damit die Mitarbeiter per Sprachanruf eine Verbindung zum Kunden herstellen können. Jetzt spreche ich über ein konkretes Objekt (wie das iPhone). Auch wenn ich hier nicht auf das Wesentliche des iPhones eingehe, hat das iPhone einen Status / eine konkrete Information / Implementierung, die mit einem Gerät / Medium nicht verbunden ist. Wenn ich konkretes Objekt sage, bedeutet dies tatsächlich jedes Objekt, mit dem eine Implementierung (Info wie Java Abstract Class) / Informationen (nicht vollständig wie Java Abstract Class) verbunden ist.

Das iPhone hat hier also tatsächlich die Kapselung als Strategie verwendet, um seinen Status / seine Informationen zu verbergen und nur diejenigen freizulegen, von denen es glaubt, dass sie offengelegt werden sollten. Sowohl die Abstraktion als auch die Kapselung verbergen also einige unnötige Details, aber die Abstraktion auf Konzeptebene und die Kapselung tatsächlich auf Implementierungsebene

Dies ist der Kern der Antworten in diesem und den folgenden Beiträgen

  1. Unterschied zwischen Abstraktion und Kapselung?
  2. Kapselung gegen Abstraktion Beispiel aus der realen Welt

5

Kapselung - Der Vorgang des Ausblendens von Komponenten der Klasse, um einen direkten Zugriff von außen zu verhindern. Dies wird erreicht, indem der Modifikator "privat" verwendet wird, um den direkten Zugriff auf einige Klassenmitglieder (Datenfeld oder Methode) von anderen Klassen oder Objekten aus zu verhindern, während öffentliche Mitglieder Zugriff auf diese privaten Mitglieder erhalten (Schnittstelle). Dadurch werden die Klassenmitglieder als menschliche Organe geschützt, die unter der Haut oder einem Schild versteckt / eingekapselt sind.

Abstraktion - Beim Schreiben eines OOP-Programms muss ein Prinzip befolgt werden, das besagt, dass "Sie nur Komponenten in die Klasse aufnehmen müssen, die für die Aufgabe des Programms interessant sind". Beispiel: Der Objektschüler hat viele Zeichen als Mensch: Name, Alter, Gewicht, Haarfarbe, Augenfarbe usw. Wenn Sie jedoch eine Klasse in OOP erstellen, um mit Schülern zu arbeiten, sollten Sie nur die Zeichen einschließen, die wirklich vorhanden sind Angelegenheit für die Schülerdatenbank: Name, Alter, Spezialität, Stufe, Noten ... usw. In C ++ können Sie eine abstrakte Klasse erstellen, indem Sie den Modifikator "virtuell" mit beliebigen Methoden in der Klasse verwenden. Dadurch wird sie direkt direkt unbrauchbar, aber Sie können Leiten Sie andere Klassen daraus ab und erstellen Sie eine Implementierung für die Mitglieder, indem Sie die erforderlichen Mitglieder basierend auf der Aufgabe hinzufügen.


4

So habe ich es verstanden:

In der objektorientierten Programmierung gibt es sogenannte Klassen . Wofür sind sie? Sie sollen einen Zustand speichern und einige Methoden speichern, um diesen Zustand zu ändern, dh sie kapseln den Zustand und seine Methoden.

Es (Klasse) kümmert sich nicht um die Sichtbarkeit seiner eigenen oder seiner Inhalte. Wenn wir den Status oder einige Methoden ausblenden , werden Informationen ausgeblendet .

Nehmen wir nun das Szenario einer Vererbung . Wir haben eine Basisklasse und einige abgeleitete (geerbte) Klassen. Also, was macht die Basisklasse hier? Es abstrahiert einige Dinge aus den abgeleiteten Klassen.

Alle sind unterschiedlich, oder? Aber wir mischen sie, um gute objektorientierte Programme zu schreiben. Ich hoffe es hilft :)


3

Abstraktion beschreibt eine kontextspezifische, vereinfachte Darstellung von etwas; Es ignoriert kontextunabhängige Details und enthält kontextbezogene Details.

Die Kapselung beschränkt den Zugriff von außen auf Teile von etwas und bündelt den Status dieses Dings mit den Prozeduren, die den Status verwenden.


Nehmen wir zum Beispiel Leute. Im Zusammenhang mit der Operation ignoriert eine nützliche Abstraktion die religiösen Überzeugungen einer Person und schließt den Körper der Person ein. Darüber hinaus kapseln Menschen ihre Erinnerungen mit den Denkprozessen, die diese Erinnerungen verwenden. Eine Abstraktion muss nicht gekapselt sein. Zum Beispiel verbirgt ein Gemälde einer Person weder ihre Teile noch bündelt es Prozeduren mit ihrem Zustand. Und der Kapselung muss keine Abstraktion zugeordnet sein. Zum Beispiel verkapseln echte Menschen (keine abstrakten) ihre Organe mit ihrem Stoffwechsel.


1

HINWEIS: Ich teile dies. Es ist nicht gemein, dass hier keine gute Antwort ist, sondern weil ich leicht verstanden habe.

Antworten:

Wenn eine Klasse konzeptualisiert wird, welche Eigenschaften können wir angesichts des Kontexts in ihr haben. Wenn wir eine Klasse Tier im Kontext eines Zoos entwerfen, ist es wichtig, dass wir ein Attribut als animalType haben, um Haus oder Wild zu beschreiben. Dieses Attribut ist möglicherweise nicht sinnvoll, wenn wir die Klasse in einem anderen Kontext entwerfen.

Was sind die Verhaltensweisen, die wir in der Klasse haben werden? Auch hier wird die Abstraktion angewendet. Was muss man hier haben und was wird eine Überdosis sein? Dann haben wir einige Informationen aus der Klasse abgeschnitten. Dieser Prozess wendet die Abstraktion an.

Wenn wir nach dem Unterschied zwischen Kapselung und Abstraktion fragen, würde ich sagen, dass Kapselung Abstraktion als Konzept verwendet. Also ist es nur Kapselung. Nein, Abstraktion ist sogar ein Konzept, das als Teil von Vererbung und Polymorphismus angewendet wird.

Gehen Sie hier für weitere Erklärung zu diesem Thema.


1

Versuchen wir es anders zu verstehen.

Was kann passieren, wenn die Abstraktion nicht vorhanden ist und was kann passieren, wenn die Kapselung nicht vorhanden ist?

Wenn Abstraktion nicht vorhanden ist, können Sie sagen, dass das Objekt weniger verwendet wird. Sie können das Objekt weder identifizieren noch auf Funktionen zugreifen. Nehmen Sie ein Beispiel für ein Fernsehgerät. Wenn Sie keine Option zum Einschalten, Wechseln des Kanals, Erhöhen oder Verringern der Lautstärke usw. haben, wozu dient das Fernsehgerät und wie verwenden Sie es?

Wenn die Kapselung nicht vorhanden ist oder nicht ordnungsgemäß implementiert wird, können Sie das Objekt missbrauchen. Dort können Daten / Komponenten missbraucht werden. Nehmen Sie das gleiche Beispiel für ein Fernsehgerät. Wenn die Lautstärke des Fernsehgeräts nicht gekapselt ist, kann der Lautstärkeregler missbraucht werden, indem er unter oder über seinen Grenzwert (0-40 / 50) hinausgeht.


1

Die Kapselung schützt das interne Verhalten eines Objekts / einer Instanz vor einer externen Entität. Daher sollte eine Kontrolle bereitgestellt werden, um zu bestätigen, dass die gelieferten Daten das interne System der Instanz / des Objekts nicht schädigen, um seine Existenz zu überleben.

Ein gutes Beispiel: Divider ist eine Klasse mit zwei Instanzvariablen Dividend und Divisor sowie einer Methode getDividedValue.

Können Sie bitte denken, wenn der Divisor auf 0 gesetzt ist, wird das interne System / Verhalten (getDivided) unterbrochen.

Das interne Verhalten des Objekts könnte also durch Auslösen einer Ausnahme durch eine Methode geschützt werden.


0

In einem einfachen Satz kann ich sagen: Das Wesen der Abstraktion besteht darin, wesentliche Eigenschaften zu extrahieren und dabei unwesentliche Details wegzulassen. Aber warum sollten wir unwesentliche Details weglassen? Der Hauptmotivator ist die Verhinderung des Risikos von Veränderungen. Sie können davon ausgehen, dass Abstraktion mit Kapselung identisch ist. Kapselung bedeutet jedoch das Einschließen eines oder mehrerer Elemente in einen Container, ohne Details zu verbergen. Wenn Sie argumentieren, dass "alles, was gekapselt wurde, auch versteckt war". Dies ist offensichtlich nicht wahr. Obwohl Informationen beispielsweise in Datensatzstrukturen und Arrays eingekapselt sind, werden diese Informationen normalerweise nicht ausgeblendet (es sei denn, sie werden über einen anderen Mechanismus ausgeblendet).

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.