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?
java
design
object-oriented
Dhblah
quelle
quelle
Antworten:
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 .
quelle
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,
quelle
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.
quelle
Aus Wikipedia :
quelle
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.
quelle
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.quelle
In OO ist Encapsulation der Ort, an dem Informationen in einem Objekt gespeichert werden. Beispiel: a
Person
hat aname
und 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
Person
ein 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 afirstName
und a umzuschaltenlastName
.In einer idealen Welt ist das Verbergen von Daten der Kapselung überlegen, aber nicht alle Welten sind ideal. :-)
quelle