Verkapselung gegen Abstraktion?

Hier sind die kurzen Definitionen von Kapselung und Abstraktion.

Abstraktion:

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

Verkapselung:

Es geht darum, den Zustand des Objekts mit Hilfe von Modifikatoren wie privat, öffentlich, geschützt etc. zu verbergen.

Was wir mit Modifikatoren wie private , public verbirgt auch unnötige Details aus der Außenwelt, die nichts anderes ist als ein Abstraktionskonzept

Aus der obigen Erklärung ergibt sich also, dass Kapselung ein Teil der Abstraktion ist oder wir sagen können, dass es sich um eine Teilmenge der Abstraktion handelt. Warum aber wird der Verkapselungsbegriff erfunden, wenn wir ihn nur mit Abstraktion behandeln können? Ich bin mir sicher, dass es einen großen Unterschied geben sollte, der sie unterscheidet, aber das meiste Material im Netz sagt fast dasselbe für beide.

Obwohl diese Frage in diesem Forum schon früher gestellt wurde, poste ich sie erneut mit bestimmten Zweifeln. Einige Antworten sagen auch, Abstraktion ist ein Konzept und Kapselung ist die Implementierung. Aber ich kaufe das nicht – Wenn es wahr ist, dann kann ich denken, dass diese zwei verschiedenen Konzepte bereitgestellt werden, um uns zu verwirren.

Update: – Nach 5 Jahren habe ich meine eigene Antwort gefunden, die auf den Antworten in diesem Beitrag und unter den Antworten basiert

  1. Unterschied zwischen Abstraktion und Verkapselung?
  2. Verkapselung vs Abstraktion reale Welt Beispiel

Kapselung ist eine Strategie, die als Teil der Abstraktion verwendet wird. Verkapselung bezieht sich auf den Zustand von Objekten – Objekte verkapseln ihren Zustand und verstecken ihn von außen; Externe Benutzer der class interagieren mit ihr über ihre Methoden, können aber nicht direkt auf den classnstatus zugreifen. Daher abstrahiert die class die Implementierungsdetails bezüglich ihres Status.

Abstraktion ist ein allgemeinerer Begriff, der auch (unter anderem) durch Unterklassen erreicht werden kann. Zum Beispiel ist die Schnittstelle List in der Standardbibliothek eine Abstraktion für eine Sequenz von Items, die durch ihre Position indiziert sind. Konkrete Beispiele für eine List sind eine ArrayList oder eine LinkedList . Code, der mit einer List interagiert, abstrahiert über das Detail, welche Art von Liste er verwendet.

Abstraktion ist oft nicht möglich, ohne den zugrundeliegenden Zustand durch Kapselung zu verbergen – wenn eine class ihren inneren Zustand freilegt, kann sie ihre inneren Abläufe nicht ändern und kann daher nicht abstrahiert werden.

Abstraktion ist das Konzept, etwas in einfacheren Begriffen zu beschreiben, dh die Details zu abstrahieren, um sich auf das Wesentliche zu konzentrieren (dies zeigt sich beispielsweise auch in der abstrakten Kunst, in der sich der Künstler auf die Bausteine ​​von Bildern wie Farbe oder Formen). Dieselbe Idee übersetzt sich in OOP, indem eine inheritanceshierarchie verwendet wird, bei der abstraktere Konzepte an der Spitze stehen und konkretere Ideen auf der Basis ihrer Abstraktionen aufbauen. Auf seiner abstraktesten Ebene gibt es überhaupt keine Implementierungsdetails und vielleicht sehr wenige Gemeinsamkeiten, die hinzugefügt werden, wenn die Abstraktion abnimmt.

Als Beispiel könnte oben eine Schnittstelle mit einer einzelnen Methode verwendet werden, dann die nächste Ebene, die mehrere abstrakte classn enthält, die einige der Details über die oberste Ebene ausfüllen oder nicht, aber Verzweigungen, indem sie ihre eigenen abstrakten Methoden hinzufügen Dann gibt es für jede dieser abstrakten classn konkrete classn, die Implementierungen aller übrigen Methoden bereitstellen.

Verkapselung ist eine Technik . Es kann oder darf nicht in der Abstraktion helfen, aber es geht sicherlich um das Verstecken und / oder Organisieren von Informationen. Es verlangt, dass Daten und functionen in irgendeiner Weise gruppiert werden – natürlich verlangt eine gute OOP-Praxis, dass sie nach Abstraktion gruppiert werden. Es gibt jedoch andere Verwendungen, die nur die Wartbarkeit usw. unterstützen.

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

Sie sind unterschiedliche Konzepte.

  • Abstraktion ist der process, alle unnötigen / unwichtigen Attribute eines Objekts zu verfeinern und nur die Eigenschaften beizubehalten, die für Ihre Domain am besten geeignet sind.

    ZB für eine Person: Sie beschließen, Vor- und Nachname und SSN zu behalten. Alter, Größe, Gewicht usw. werden als irrelevant ignoriert.

    Abstraktion ist, wo Ihr Design beginnt.

  • Die Kapselung ist der nächste Schritt, in dem sie Operationen erkennt, die für die Attribute geeignet sind, die Sie während des Abstraktionsprozesses erhalten haben. Es ist die Verknüpfung der Daten mit der Operation, die auf sie wirken.
    Dh Daten und Methoden werden gebündelt.

Die Kapselung versteckt unnötige Daten in einer Kapsel oder Einheit

Abstraktion zeigt das wesentliche Merkmal eines Objekts

Kapselung wird verwendet, um sein Mitglied von außerhalb der class und der Schnittstelle zu verbergen. Verwendung 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 Daten in einer Einheit oder Kapsel, dh class.

Abstraktion ist genau das Gegenteil von Encapsulation.

Abstraktion wird verwendet, um dem Benutzer wichtige und relevante Daten zu zeigen. Bestes Beispiel aus der realen Welt In einem Handy sehen Sie ihre verschiedenen Arten von functionen wie Kamera, MP3-Player, Anruffunktion, Aufnahmefunktion, Multimedia usw. Es ist Abstraktion, weil Sie nur relevante Informationen statt ihrer internen Technik 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(); } 

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

Die Assemblersprache kann man sich als eine Abstraktion des Maschinencodes vorstellen – Assembly 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, Sprünge zu denken die richtige Adresse usw.

Die API Ihres Betriebssystems ist eine Abstraktion des zugrunde liegenden Rechners. Ihr Compiler bietet eine Abstraktionsschicht, die Sie vor den Details der Assemblersprache schützt. Der TCP / IP-Stack, der in Ihrem Betriebssystem integriert ist, abstrahiert die Details der Übertragung von Bits über ein Netzwerk. Wenn Sie bis zum unbehandelten Silizium hinuntergehen, haben die Leute, die Ihre CPU entworfen haben, Schaltpläne verwendet, die in “Dioden” und “Transistoren” geschrieben wurden, die Abstraktionen darüber sind, wie Elektronen durch Halbleiterkristalle wandern.

In der Software ist alles eine Abstraktion. Wir bauen Programme, die einen Aspekt der Realität simulieren oder modellieren, aber unsere Modelle abstrahieren immer notwendigerweise einige Details der “echten Sache”. Wir bauen Schicht auf Schicht auf Schichten von Abstraktionen, weil wir nur so etwas erreichen können. (Stellen Sie sich vor, Sie wollten beispielsweise einen Sudoku-Löser erstellen, und Sie mussten ihn nur mit Halbleiterkristallen entcasting. “OK, ich brauche hier ein Stück N-Silizium …”)

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

Beantworte meine eigene Frage nach 5 Jahren, da ich noch weitere Details brauche

Abstraktion:

Technische Definition: – Abstraktion ist ein Konzept, um unnötige Details (komplex oder einfach) zu verbergen und nur die wesentlichen Merkmale des Objekts zu zeigen. Es gibt keine Umsetzung hier ist es nur ein Konzept

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

Auch wenn ich sage, dass meine Firma ein Medium / Gerät benötigt, damit Mitarbeiter sich per Sprachanruf mit dem Kunden verbinden können. Dann spreche ich auch abstrakt, aber auf etwas niedrigerem Niveau als Gerät / Medium kann Telefon oder Skype oder etwas anderes sein etc

Jetzt, wenn ich sage, dass meine Firma etwas Telefon benötigt, damit Angestellte Verbindung zum Kunden durch Sprachanruf herstellen können. Dann spreche ich auch abstrakt, aber auf etwas niedrigerem Niveau, da Telefon von jeder Firma wie iphone oder samsung oder nokia etc sein kann

Encapsulation: – Es geht im Wesentlichen darum, den Zustand (die Information) eines Objekts mit Hilfe von Modifikatoren wie privat, öffentlich, geschützt usw. zu verbergen. Wir stellen den Zustand durch öffentliche Methoden nur dann zur Verfügung, wenn dies erforderlich ist.

Was es praktisch bedeutet: – Jetzt, wenn ich sage, dass meine Firma etwas iphone braucht, damit Angestellte sich durch Sprachanruf mit Kunden verbinden können. Jetzt spreche ich über irgendein konkretes Objekt (wie iphone). Auch wenn ich hier nicht in die Kleinigkeit des Iphone gehe, aber iphone hat einige staatliche / concrecrete Informationen / Implementierung, die damit verbunden sind, wo Gerät / Medium nicht hat. Wenn ich konkretes Objekt sage, bedeutet das eigentlich jedes Objekt, dem eine Implementierung / Information (nicht vollständig wie eine Java-abstrakte class) zugeordnet ist.

Das iPhone hat hier also die Verkapselung als Strategie benutzt, um seinen Zustand / seine Informationen zu verbergen und nur die zu entlarven, von denen er denkt, dass sie offen gelegt werden sollten. Sowohl die Abstraktion als auch die Kapselung verbirgt daher einige unnötige Details, aber die Abstraktion auf der Konzept-Ebene und die Kapselung tatsächlich auf der Implementierungsebene

Dies ist der core basierend auf Antworten in diesem Beitrag und unter denen

  1. Unterschied zwischen Abstraktion und Verkapselung?
  2. Verkapselung vs Abstraktion reale Welt Beispiel

Kapselung – das Verbergen von Komponenten der class, um direkten Zugriff von außen zu verhindern. Dies wird erreicht, indem der “private” Modifier verwendet wird, um den direkten Zugriff auf einige classnmitglieder (Datenfeld oder Methode) von anderen classn oder Objekten zu verhindern, während der Zugriff auf diese privaten Mitglieder durch öffentliche Mitglieder (Schnittstelle) bereitgestellt wird. Das schützt die Teilnehmer als menschliche Organe, die unter der Haut oder einem Schild verborgen sind.

Abstraktion – Beim Schreiben eines OOP-Programms muss ein Grundsatz befolgt werden, der besagt: “Sie müssen in die class nur Komponenten aufnehmen, die für die Aufgabe des Programms interessant sind”. Zum Beispiel: Der Objektschüler hat viele Charaktere als ein Mensch: Name, Alter, Gewicht, Haarfarbe, Augenfarbe, etc. Wenn Sie jedoch eine class in OOP erstellen, um mit Schülern zu arbeiten, sollten Sie nur die wirklich richtigen Zeichen verwenden wichtig für Studenten database: Name, Alter, Spezialität, Level, Noten … etc. in C ++ können Sie abstrakte class erstellen, indem Sie den Modifizierer “virtual” mit allen Methoden in der class und das wird es direkt unbrauchbar machen, aber Sie können leiten Sie andere classn daraus ab und erstellen Sie eine Implementierung für seine Mitglieder, indem Sie die erforderlichen Mitglieder basierend auf der Aufgabe hinzufügen.

So habe ich es verstanden:

In der objektorientierten Programmierung haben wir etwas, das classn genannt wird . 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 ein.

Es (class) kümmert sich nicht um die Sichtbarkeit ihrer eigenen oder ihrer Inhalte. Wenn wir den Zustand oder einige Methoden verbergen , wird Information ausgeblendet .

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

Alle sind anders, oder? Aber wir mischen sie zusammen, um gute objektorientierte Programme zu schreiben. Ich hoffe es hilft 🙂

Abstraktion beschreibt eine kontextspezifische, vereinfachte Darstellung von etwas; Es ignoriert kontextunrelevante Details und enthält kontext-wichtige Details.

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


Nimm zum Beispiel Menschen. Im Kontext der Chirurgie ignoriert eine nützliche Abstraktion die religiösen Überzeugungen einer Person und schließt den Körper der Person ein. Außerdem kapseln die Menschen ihre Erinnerungen mit den Denkprozessen, die diese Erinnerungen verwenden. Eine Abstraktion braucht keine Verkapselung; zum Beispiel verbirgt ein Bild einer Person weder ihre Teile noch bündelt sie Prozeduren mit ihrem Zustand. Und die Verkapselung braucht keine assoziierte Abstraktion zu haben; Zum Beispiel verkapseln echte Menschen (nicht abstrakte) ihre Organe mit ihrem Stoffwechsel.

HINWEIS: Ich teile dies. Es ist nicht so, dass hier keine gute Antwort ist, sondern weil ich es leicht verstehe.

Antworten:

Wenn eine class konzeptualisiert ist, welche Eigenschaften können wir in dem Kontext haben? Wenn wir eine class Tier im Kontext eines Zoos entcasting, ist es wichtig, dass wir ein Attribut als animalType haben, um häuslich oder wild zu beschreiben. Dieses Attribut ist möglicherweise nicht sinnvoll, wenn wir die class in einem anderen Kontext entcasting.

Ähnlich, was sind die Verhaltensweisen, die wir in der class haben werden? Abstraktion wird auch hier angewendet. Was ist notwendig, um hier zu haben und was wird eine Überdosis sein? Dann haben wir einige Informationen aus der class abgeschnitten. Dieser process wendet Abstraktion an.

Wenn wir nach dem Unterschied zwischen Kapselung und Abstraktion fragen, würde ich sagen, dass die Kapselung Abstraktion als Konzept verwendet. Also, ist es nur Verkapselung? Nein, Abstraktion ist sogar ein Konzept, das Teil von inheritance und Polymorphie ist.

Hier finden Sie weitere Erläuterungen zu diesem Thema.

Versuchen wir, auf eine andere Weise zu verstehen.

Was passiert, wenn Abstraktion nicht vorhanden ist und was passieren kann, wenn die Kapselung nicht da 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 functionen zugreifen. Nehmen Sie ein Beispiel eines Fernsehers, wenn Sie nicht die Möglichkeit haben, sich einzuschalten, den Kanal zu wechseln, die Lautstärke zu erhöhen oder zu verringern usw., was ist dann der Fernseher und wie benutzen Sie ihn?

Wenn Encapsulation nicht vorhanden oder nicht ordnungsgemäß implementiert ist, können Sie das Objekt missbrauchen. Dort können Daten / Komponenten missbraucht werden. Nehmen Sie das gleiche Beispiel für TV. Wenn die Lautstärke des Fernsehgeräts nicht gekapselt ist, kann der Lautstärkeregler durch Unterschreiten oder Überschreiten des Grenzwerts (0-40 / 50) missbraucht werden.

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

Gutes Beispiel, Divider ist eine class, die zwei Instanzvariablen Dividend und Divisor und eine Methode getDividedValue hat.

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

Das Objekt-interne Verhalten könnte also geschützt werden, indem eine Ausnahme durch eine Methode ausgetriggers wird.

Kapselung (Binding Daten und Code)

  • Kapselung ist der Mechanismus, der den Code und die Daten, die er manipuliert, miteinander verbindet und vor Störungen und Missbrauch schützt.

  • In einer objektorientierten Sprache können Code und Daten so kombiniert werden, dass eine in sich geschlossene “Black Box” entsteht. Wenn Code und Daten auf diese Weise miteinander verknüpft werden, wird ein Objekt erstellt. Mit anderen Worten, ein Objekt ist das Gerät, das die Kapselung unterstützt.

  • Die Verkapselung führt zu dem Konzept der Datenverbergung, aber das Konzept der Verkapselung darf nicht auf das Verstecken von Informationen beschränkt sein.

  • Kapselung stellt eindeutig die Fähigkeit dar, verwandte Daten und functionen in einer einzigen, autonomen Einheit, einer class, zu bündeln.

Abstraktion (Ausblenden der gespeicherten Daten und Ausblenden der function)

  • Die Datenabstraktion ist ein process, bei dem die wesentlichen Merkmale ohne Implementierungsdetails dargestellt werden.

  • Abstraktion ist eine der mächtigsten und wichtigsten functionen der objektorientierten Programmierung.

  • Die Grundidee hinter der Datenabstraktion besteht darin, eine klare Trennung zwischen den Eigenschaften des Datentyps und den zugehörigen Implementierungsdetails zu geben. Diese Trennung wird erreicht, damit die Eigenschaften des abstrakten Datentyps für die Benutzeroberfläche sichtbar sind und die Implementierungsdetails verborgen sind.

  • Abstraktion trennt die logischen Eigenschaften von Implementierungsdetails. Zum Beispiel ist das Fahren des Autos eine logische Eigenschaft und das Design des Motors ist das Implementierungsdetail.