Das Hauptproblem hierbei ist, dass die Kapselung weder ein fest definiertes Konzept ist noch warum sie nützlich ist. Einige Untersuchungen zeigen, dass die Art und Weise, wie Menschen die Verkapselung sehen, eine hohe Meinung hat und dass viele Menschen sie mit Abstraktion verwechseln.
Die erste Definition, die Sie finden werden, ist
Kapselung ist ein Konzept, das die Daten und Funktionen, die die Daten manipulieren, miteinander verbindet ...
Wenn dies Ihre Definition ist, können die meisten Sprachen Daten und Funktionen, die mit diesen Daten arbeiten, in Klassen, Module, Bibliotheken, Namespaces usw. gruppieren.
Aber ich würde argumentieren, dass dies nicht der Hauptzweck der Kapselung ist, da diese Definition weitergeht:
... und das schützt sowohl vor Störungen von außen als auch vor Missbrauch.
Wikipedia stimmt auch darin überein :
Ein Sprachmechanismus zum Einschränken des direkten Zugriffs auf einige der Objektkomponenten.
Jetzt müssen wir uns fragen, was unter "Interferenz und Missbrauch" zu verstehen ist und warum der direkte Zugriff auf die Daten eingeschränkt werden sollte. Ich glaube, es gibt zwei Gründe.
Erstens liegt es im Interesse des Entwicklers, den Umfang zu beschränken, in dem Daten mutiert werden können. Viel zu oft muss vor dem Einstellen des Werts eine Logik vorhanden sein. Und nur eine begrenzte Anzahl von Stellen zu haben, an denen Wert festgelegt werden kann, ist äußerst wertvoll. In OOP-Sprachen kann dies mithilfe von Klassen erfolgen. In "veränderlichen" funktionalen Sprachen dienen Verschlüsse demselben Zweck. Und weil wir wissen, dass Klassen = Schließungen sind , ist es sogar fraglich, ob veränderbare funktionale Sprachen ein anderes "Paradigma" als OOP sind.
Aber was ist mit unveränderlichen Sprachen? Es hat kein Problem, Variablen zu mutieren. Hier kommt das zweite Problem ins Spiel: Durch Bindungsfunktionen und Daten können diese Daten in einem gültigen Zustand gehalten werden. Stellen Sie sich vor, Sie haben eine unveränderliche Struktur für Email
. Diese Struktur hat ein einzelnes string
Feld. Wir haben Anforderungen, dass, wenn Sie einen Wert vom Typ haben, Email
dieses Feld eine gültige Adresse enthält. In der OOP-Kapselung kann dies leicht erreicht werden, indem dieses Feld deklariert private
wird, nur die Get
Methode bereitgestellt wird undconstructor method
Dies ist nur erfolgreich, wenn die als Zeichenfolge übergebene Adresse gültig ist. Ähnliches gilt für Verschlüsse. Für eine unveränderliche Sprache müsste man sagen, dass die Struktur nur durch eine bestimmte Funktion initialisiert werden kann und eine solche Funktion fehlschlagen kann. Und mir ist keine Sprache bekannt, die diesen Kriterien entspricht (vielleicht kann mich jemand in Kommentaren aufklären).
Letzte Ausgabe ist, was unter Sprache "Unterstützung" der Kapselung zu verstehen ist. Auf der einen Seite gibt es Sprachen, mit denen die Kapselung erzwungen werden kann, sodass der Code nicht kompiliert wird, wenn die Kapselung unterbrochen wird. Auf der anderen Seite bietet die Sprache möglicherweise eine Möglichkeit zur Kapselung, erzwingt sie jedoch nicht, sodass der Entwickler sie selbst erzwingen kann. Im zweiten Fall kann jede Sprache mit Strukturen und Funktionen funktionieren. Dynamische Sprachen und Haskell kommen mir in den Sinn. Und ich würde sagen, dass es nicht viele Sprachen gibt, die auf die andere Seite des Spektrums fallen. Sogar C #, das wirklich gut darin ist, die Kapselung für seine Objekte zu erzwingen, kann mithilfe von Reflexion umgangen werden. Aber zu sehen, dass in C # als massiver Code-Geruch angesehen wird, und kein vernünftiger C # -Entwickler würde dies bereitwillig tun.