it-swarm.com.de

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

Ich lese "Java-Parallelität in der Praxis" und es heißt: "Glücklicherweise können dieselben objektorientierten Techniken, mit denen Sie gut organisierte, wartbare Klassen schreiben können - wie Kapselung und Ausblenden von Daten - auch Thread-sicher erstellen Klassen."

Das Problem Nr. 1 - Ich habe noch nie von versteckten Daten gehört und weiß nicht, was es ist.

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

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

29
dhblah

Das Verstecken von Daten und Informationen ist ein weiter gefasster Begriff, der in der Informatik und im Software-Engineering zu finden ist. Es bezieht sich auf die Tatsache, dass der Teil eines Computerprogramms, der sich möglicherweise ändert, nicht von anderen Modulen/von Clients aus zugänglich sein darf.

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

Also Kapselung kann als ein Weg gesehen werden, um Daten zu erreichen, die sich in objektorientierten Systemen verstecken.

19
m3th0dman

Kapselung und Ausblenden von Daten sind verwandte Begriffe. Es ist wichtig zu verstehen, dass sie in Bezug auf Abstraktion entstehen. Booch et. al. in Objektorientierte 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 zu diesem Verhalten führt. Die Kapselung wird meistens durch das Verbergen von Informationen (nicht nur das Verstecken von Daten) erreicht. Dabei werden alle Geheimnisse eines Objekts verborgen, die nicht zu seinen wesentlichen Merkmalen beitragen. In der Regel wird die Struktur eines Objekts sowie die Implementierung seiner Methoden ausgeblendet.

6
theD

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

Von Wikipedia :

In einer Programmiersprache wird die Kapselung verwendet, um auf einen von zwei verwandten, aber unterschiedlichen Begriffen und manchmal auf die Kombination davon zu verweisen:

  • Ein Sprachmechanismus zum Einschränken des Zugriffs auf einige Komponenten des Objekts.
  • Ein Sprachkonstrukt, das das Bündeln 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 bereitstellen, die Kapselung als ein Merkmal der zur Objektorientierung orthogonalen Sprache betrachten.

Die zweite Definition ist durch die Tatsache motiviert, dass in vielen OOP Sprachen das Ausblenden von Komponenten nicht automatisch erfolgt oder überschrieben werden kann; Daher wird das Verstecken von Informationen von denjenigen, die die zweite Definition bevorzugen, als separater Begriff definiert.

4

Sie werden in der Diskussion oft synonym verwendet, und ich denke oft, dass sie zusammenarbeiten, um denselben Zweck zu erreichen, und obwohl Folgendes möglicherweise nicht vollständig korrekt ist, kann es eine sinnvolle Unterscheidung liefern, wenn eine Unterscheidung getroffen werden muss:

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

Ich sehe, dass das Konzept des Versteckens von Daten dem 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 Schutzvorrichtungen wären Sichtbarkeitsklauseln, Typdefinitionen, Vererbung und dergleichen. Nebenwirkungen, die Sie von den strukturell geschützten Objekten nutzen können, hängen wiederum von Sprache und Laufzeit ab: möglicherweise Objektaktivierung, Referenzanzahl oder ähnliches.

2
JustinC

Sie werden oft, vielleicht normalerweise, synonym verwendet. Beachten Sie jedoch, dass das obige Booch-Zitat besagt: "Kapselung wird am häufigsten durch Verstecken von Informationen erreicht ...", d. H. Am häufigsten, aber nicht immer in jedem Fall.

Beachten Sie, dass Python erlaubt das Aufrollen von Daten in Klassen, aber keine privaten Variablen. Man könnte also sagen, dass Python bietet Kapselung ohne Verstecken von Daten.

Sie könnten dasselbe in Java) tun, indem Sie alle Ihre Mitgliedsvariablen public festlegen. Abgesehen davon, dass Sie jedem einen Herzinfarkt zufügen, verlieren Sie den Vorteil, dass Daten ausgeblendet werden. Das heißt, die Semantik eines Objekts wird beibehalten, indem der Zugriff auf seinen Status eingeschränkt wird.

0
Rob

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

Data Hiding ist, wo Person ein Namensfeld hat, aber zumindest theoretisch weiß niemand . Das Feld ist privat ohne öffentliche Zugriffsmethoden. Clients können einen Namen aus einem Datenbankeintrag, XML, HTTP POST usw. übergeben, aber die interne Arbeitsweise der Person, die mit dem Namen umgeht, ist eine "Black Box". Zukünftige Implementierungen von Person können sich ändern, z. B. um zu einem firstName und einem lastName zu wechseln.

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

0
user949300