Was ist der Unterschied zwischen "Verstecken von Daten" und "Kapselung"?

29

Ich lese "Java-Parallelität in der Praxis" und es heißt: "Zum Glück können Sie mit den gleichen objektorientierten Techniken, mit denen Sie gut organisierte, wartbare Klassen schreiben können, wie beispielsweise Kapselung und Ausblenden von Daten, auch thread-sicherere Klassen erstellen Klassen."

Das Problem Nr. 1 - Ich habe noch nie etwas über das Verstecken von Daten gehört und weiß nicht, was es ist.

Das Problem Nr. 2 - Ich dachte immer, dass die Kapselung privat oder öffentlich ist und dass sich die Daten tatsächlich verstecken.

Können Sie bitte erklären, was das Verbergen von Daten ist und wie es sich von der Kapselung unterscheidet?

Dhblah
quelle
2
Code lesen Komplette 2. Ausgabe . Es wird viele Ihrer Fragen beantworten.
Shiplu Mokaddim
Informationen zum Ausblenden von Informationen finden Sie unter: javaworld.com/jw-05-2001/jw-0518-encapsulation.html
Dave Jarvis,
Dieser Link bietet nützliche Einblicke in diese Informationen. Durch das Ausblenden eines Konstruktionsprinzips wird festgelegt, dass eine Konstruktionsentscheidung vor dem Rest des Systems verborgen werden soll, um eine unbeabsichtigte Kopplung zu verhindern. Es sollte darüber informieren, wie Sie Dinge einkapseln, muss es aber natürlich nicht. Die Kapselung ist eine Programmiersprachenfunktion.
Abhijeet

Antworten:

19

Das Verbergen von Daten und Informationen ist ein weiter gefasster Begriff aus der Informatik und der Softwaretechnik. Es bezieht sich auf die Tatsache, dass der Teil eines Computerprogramms, der sich ändern kann, nicht von anderen Modulen / von Clients aus zugänglich sein darf.

Einkapselung ist ein Begriff, der im objektorientierten Paradigma vorkommt und sich darauf bezieht, die Daten in privaten Feldern zu halten und sie nur durch Methoden zu ändern.

Daher kann die Einkapselung als ein Weg gesehen werden, Daten in objektorientierten Systemen zu verstecken .

m3th0dman
quelle
1
Danke für deine Antwort. Ich verstehe immer noch nicht, warum, wenn das Verbergen von Daten dasselbe ist, aber nur ein bisschen breiter als die Kapselung, in dem Buch davon gesprochen wird, als ob sie von ähnlicher Breite wären und einander nicht einschließen.
Dhblah
Die Autoren unterscheiden sich wahrscheinlich vom Verstecken von Daten und Informationen in dem Sinne, dass das Verstecken von Daten nur die Datenstrukturen - die privaten Felder - verbirgt, während sich das Verstecken von Informationen möglicherweise darauf bezieht, Implementierungsdetails (zum Beispiel verwendete Algorithmen) zu kapseln, die nur über Schnittstellen erfolgen.
m3th0dman
2
Sie können eines haben, ohne das andere zu haben - schauen Sie sich Python an, wo überhaupt keine Daten versteckt sind (kein privates oder geschütztes Attribut).
Latty
@ Lattyware's Punkt ist sehr wahr und wichtig. Man kann auch eine Verkapselung haben (nach Ihrer Definition, gegen die ich aufgrund dessen, was ich hier beschreibe, Einwände habe), ohne etwas zu verbergen, nämlich indem man blind für jedes Mitglied einen trivialen Getter und Setter blendet. Das verbirgt nichts und verhindert nichts, erfüllt aber die übliche Definition der Verkapselung des Buchstabens.
1
Bei der Kapselung werden Daten nicht im privaten Bereich aufbewahrt, da sich mehr Informationen verstecken. Kapselung ist im Allgemeinen das Konzept, Informationen / Daten und Methoden in einer Klasse zusammenzufassen (zu kapseln).
nbro
6

Kapselung und Ausblenden von Daten sind verwandte Begriffe. Es ist wichtig zu verstehen, dass sie in Bezug auf Abstraktion entstehen . Booch et. al. in objektorientierter Analyse und Design mit Anwendungen erklärt,

Abstraktion und Kapselung sind komplementäre Konzepte: Die Abstraktion konzentriert sich auf das beobachtbare Verhalten eines Objekts, während sich die Kapselung auf die Implementierung konzentriert, die dieses Verhalten hervorruft. Die Kapselung wird am häufigsten durch das Ausblenden von Informationen (nicht nur durch das Ausblenden von Daten) erreicht. Dabei werden alle Geheimnisse eines Objekts ausgeblendet, die nicht zu seinen wesentlichen Merkmalen beitragen. In der Regel wird die Struktur eines Objekts sowie die Implementierung seiner Methoden ausgeblendet.

theD
quelle
5

Das Erstellen einer Klasse umfasst das Konzept der Kapselung. Wenn Sie eine Klasse erstellen, fügen Sie Daten und Verhalten in die Klasse ein, und die Klasse wird zu einer Einheit, die wir ein Objekt nennen. Das Verbergen von Daten ist also Teil der Kapselung.

Aleko Gharibashvili
quelle
4

Aus Wikipedia :

In einer Programmiersprache bezieht sich die Kapselung auf einen von zwei verwandten, aber unterschiedlichen Begriffen und manchmal auf die Kombination davon:

  • Ein Sprachmechanismus zum Einschränken des Zugriffs auf einige der Objektkomponenten.
  • Ein Sprachkonstrukt, das die Bündelung von Daten mit den Methoden (oder anderen Funktionen) erleichtert, die mit diesen Daten arbeiten.

Einige Programmiersprachenforscher und Akademiker verwenden die erste Bedeutung allein oder in Kombination mit der zweiten als Unterscheidungsmerkmal der objektorientierten Programmierung, während andere Programmiersprachen, die lexikalische Abschlüsse bieten, die Kapselung als Merkmal der Sprache betrachten, die orthogonal zur Objektorientierung ist.

Die zweite Definition beruht auf der Tatsache, dass das Ausblenden von Komponenten in vielen OOP-Sprachen nicht automatisch erfolgt oder überschrieben werden kann. Aus diesem Grund wird das Verbergen von Informationen von denjenigen, die die zweite Definition bevorzugen, als separater Begriff definiert.

Michael Borgwardt
quelle
Danke für deine Antwort. Nachfolgende Fragen: 1) Verfügt die Programmiersprache Java über Funktionen, auf die sich der zweite Begriff im Zusammenhang mit der Kapselung bezieht? 2) Ich verstehe nicht, warum das Überschreiben von versteckten Daten wichtig ist. In Java können Sie beispielsweise durch Reflektion auf jedes Feld (öffentlich oder privat) zugreifen.
Dhblah
@Software Engeneering Learner: Klassen als Quellcode-Konstrukte stellen den zweiten Begriff dar. Beim Ausblenden von Informationen geht es darum, dass die Einschränkung des Datenumfangs häufig auf spezifischen und getrennten Sprachmechanismen beruht.
Michael Borgwardt
2

Sie werden in der Diskussion häufig austauschbar verwendet, und ich denke oft, dass sie zusammenarbeiten, um denselben Zweck zu erreichen. Folgendes mag zwar nicht ganz korrekt sein, aber es kann eine sinnvolle Unterscheidung liefern, wenn eine Unterscheidung getroffen werden muss:

Wenn von Verkapselung die Rede ist, wird sie häufig als prozeduraler / funktionaler Mechanismus implementiert. Es gibt eine Art von Schutz für den zugrunde liegenden Zustand, und für den Zugriff durch den Schutz müssen bestimmte Protokolle befolgt werden, um Zugriff zu erhalten (den gewünschten Zustand lesen oder ändern). Die Kapselung bietet auch die Möglichkeit, dass Nebenwirkungen aufgrund des Zugriffs auftreten (z. B. kaskadierende Zustandsänderung oder Benachrichtigung / Auslösen eines Ereignisses / Ausgeben eines Signals, wenn die interessierende Sache gelesen oder geändert wird), sodass Folgeaktionen eingeleitet werden können. Auch hier stelle ich mir die Kapselung oft als ein Konzept vor, das als Prozedur implementiert wird.

Ich sehe, dass das Konzept des Versteckens von Daten in seinem Zweck der Kapselung ähnelt. Der Mechanismus ist jedoch strukturell und arbeitet auf einer anderen Ebene. In der Praxis wird der Zustand durch strukturelle Mechanismen der Sprache und der Laufzeit geschützt und beeinflusst, anstatt durch Verfahren einen Schutz- und Nebenwirkungsmechanismus bereitzustellen. Diese Arten von Schutzeinrichtungen sind Sichtbarkeitsklauseln, Typdefinitionen, Vererbung und dergleichen. Die Nebenwirkungen, die Sie durch die strukturell geschützten Objekte nutzen können, hängen wiederum von der Sprache und der Laufzeit ab: möglicherweise von der Objektaktivierung, der Referenzanzahl oder etwas in dieser Richtung.

JustinC
quelle
0

Sie werden häufig, möglicherweise normalerweise, austauschbar verwendet. Beachten Sie jedoch, dass das obige Zitat von Booch lautet: "Encapsulation is am häufigsten durch Ausblenden von Informationen erreicht ...", dh am häufigsten, aber nicht immer in jedem Fall.

Beachten Sie, dass Python das Rollup von Daten in Klassen zulässt, jedoch keine privaten Variablen. Man könnte also sagen, dass Python eine Kapselung bietet, ohne dass sich Daten verstecken.

In Java könnten Sie dasselbe tun, indem Sie alle Mitgliedsvariablen definieren public. Abgesehen davon, dass Sie jedem einen Herzinfarkt zufügen, verlieren Sie den Vorteil, dass Daten ausgeblendet werden.

rauben
quelle
0

In OO ist Encapsulation der Ort, an dem Informationen in einem Objekt gespeichert werden. Beispiel: a Personhat a nameund Kunden von Person (dh Sie) wissen, dass Person einen Namen hat, entweder über öffentliche Felder oder über Zugriffsmethoden. Und hoffentlich müssen Sie die Namen auch nicht in einem globalen Array von Namen usw. speichern. Dies ist also ein großer Schritt, um nicht verwaltbaren Spaghetti-Code zu vermeiden. Der Client muss jedoch noch etwas darüber wissen, wie Person mit Namen umgeht: z. B. durch Leerzeichen oder Kommas getrennt?

Das Ausblenden von Daten ist dort, wo Personein Namensfeld vorhanden ist , aber zumindest theoretisch weiß es niemand . Das Feld ist privat ohne öffentliche Zugriffsmethoden. Clients können einen Namen aus einem Datenbankeintrag, XML oder HTTP POST übergeben, aber die interne Arbeitsweise, wie Person mit dem Namen umgeht, ist eine "Black Box". Zukünftige Implementierungen von Person können geändert werden, um beispielsweise auf a firstNameund a umzuschalten lastName.

In einer idealen Welt ist das Verbergen von Daten der Kapselung überlegen, aber nicht alle Welten sind ideal. :-)

user949300
quelle