
Definition
Die Bedeutung des Begriffs „Einkapselung“ ist vage und von Quelle zu Quelle unterschiedlich. Es ist allgemein anerkannt, dass die Einkapselung eines der Grundprinzipien von OOP ist, obwohl einige wissenschaftliche Artikel die Einkapselung vollständig aus der Liste streichen. Zum Beispiel erwähnt John Mitchell in dem Buch „Konzepte in Programmiersprachen“ bei der Auflistung der Hauptkonzepte in OOP nur die Abstraktion - ein Begriff, der als bedeutungsnah angesehen wird, aber noch umfangreicher und übergeordneter ist. Auf der anderen Seite stellt Robert Martin in seinem Buch Pure Architecture ausdrücklich fest, dass Kapselung, Vererbung und Polymorphismus als Grundlage von OOP angesehen werden.
Die Vielfalt der Definitionen des Begriffs „Einkapselung“ lässt sich nur schwer auf einen gemeinsamen Nenner bringen. Im Allgemeinen können zwei Ansätze zur Bedeutung dieses Begriffs unterschieden werden. Die Einkapselung kann betrachtet werden als:
- Kommunikation von Daten mit Methoden, die diese Daten steuern;
- Eine Reihe von Tools zur Steuerung des Zugriffs auf Daten oder Methoden zur Verwaltung dieser Daten.
Kapselung als Verbindung
Diese Art der Interpretation des Begriffs „Einkapselung“ ist sehr einfach zu erklären. In diesem Fall zeigt jede Klasse, in der es mindestens eine Variable und eine Methode gibt, die sie steuert, dieses Prinzip deutlich.
Die Phone-Klasse kombiniert die Daten in der Variablennummer mit der Methode print_number ()
Sie können eine Klasse erstellen, die nur aus Methoden besteht (und keine Variablen enthält), was in einigen Programmiersprachen hilfreich sein kann. Es ist auch möglich, eine Klasse zu erstellen, die nur Daten ohne Methoden enthält, was in vielen Fällen vermieden werden sollte. Beide Praktiken sollten bei Bedarf angewendet werden, und ihre Beziehung zur „Vereinheitlichung“ der Kapselung ist umstritten.
Kapselung als Zugangskontrolle
Die Erläuterung des Konzepts der Einschränkung des Zugriffs auf Daten oder Methoden erfordert viel mehr Details. In diesem Zusammenhang sollte der Begriff „Zugriff“ zunächst als die Fähigkeit verstanden werden, den internen Inhalt einer Klasse zu sehen und / oder zu ändern. Die meisten OOP-Sprachen bieten mehrere Zugriffsebenen. Zusammenfassend können wir sagen, dass die Daten des Objekts sein können:
- öffentlich (
public
) - Daten stehen allen zur Verfügung; - privat (
private
) - Daten sind nur für das Objekt / die Klasse verfügbar, zu der sie gehören.
Die meisten Sprachen haben zusätzliche Zugriffsgrade, die zwischen diesen Grenzen liegen. In C ++ und Python3 gibt es beispielsweise drei Zugriffsebenen: öffentlich, geschützt und privat; C # fügt der Liste das Schlüsselwort "intern" hinzu.
Es ist anzumerken, dass in den meisten Programmiersprachen die Zugriffsebene auf Daten standardmäßig festgelegt ist. In C ++ ist die Zugriffsebene auf Daten in einer Klasse beispielsweise standardmäßig auf privat festgelegt. Nur Mitglieder und Freunde der Klasse können auf ihre Daten zugreifen. Die Standardzugriffsebene auf die Struktur ( struct
) in C ++ ist unterschiedlich - sie ist öffentlich und auf Daten in einer solchen Struktur kann jeder zugreifen. Die Zugriffsebene für Klassenvariablen und Methoden in Python 3 ist vollständig syntaxabhängig.
Beispiele
Kapselung
Python 3 bietet drei Ebenen des Datenzugriffs:
- public (
public
, keine spezielle Syntax, publicBanana
); - protected (
protected
, ein Unterstrich am Anfang des Namens, _protectedBanana
); - privat (
private
, zwei Unterstriche am Anfang des Namens, __privateBanana
).
Der Kürze und Einfachheit halber werden im Beispiel nur zwei grundlegende Ebenen (privat und öffentlich) hervorgehoben.
Der Zugriff auf öffentliche Variablen und Methoden kann über das Hauptprogramm abgerufen werden. Der Versuch, private Daten abzurufen oder eine private Methode auszuführen, führt zu einem Fehler.
Kapselungsverletzung
Die Sprache selbst bietet dem Programmierer ein Syntaxwerkzeug, mit dem die Kapselung umgangen werden kann. Das Lesen und Ändern privater Variablen und das Aufrufen privater Funktionen ist weiterhin möglich.
Ein paar Worte zu Magic
Es gibt Methoden, sogenannte "magische Methoden" oder "spezielle Methoden", mit denen Klassen ihr Verhalten in Bezug auf Standard-Sprachoperatoren bestimmen können. Die folgenden Ausdrücke können als Beispiel für solche Sprachoperatoren dienen:
Python 3 unterstützt viele dieser Methoden. Eine vollständige Liste finden Sie auf der offiziellen Sprachdokumentationsseite. __init__
(Initialisierer) wird am häufigsten verwendet und beginnt, wenn ein neues Klassenobjekt erstellt wird. Das andere, __lt__
(erweiterter Vergleich), definiert Regeln zum Vergleichen von zwei Objekten einer Benutzerklasse. Solche Methoden fallen nicht in die Kategorie „privat“ oder „öffentlich“, da sie anderen Zwecken dienen und tief in der internen Struktur der Sprache verwurzelt sind.
Magische Methoden können von jedem Benutzer auf dieselbe Weise wie jede öffentliche Methode in Python aufgerufen werden, sie sollen jedoch in ihren Sonderfällen implizit verwendet werden. Ein Sonderfall für die Methode __init__
ist die Initialisierung eines neuen Klassenobjekts. __lt__
wird verwendet, um zwei Objekte zu vergleichen.
Fazit
Python3 bietet keinen eingeschränkten Zugriff auf Klassenvariablen oder -methoden. Daten, die ausgeblendet werden müssen, können tatsächlich gelesen und geändert werden. In Python3 ist die Kapselung eher eine Konvention, und der Programmierer muss sich darum kümmern, sie selbst zu speichern.
Quellen
- John C. Mitchell, Konzepte in Programmiersprachen
- Robert C. Martin, Saubere Architektur, Ein Handwerkerhandbuch für Softwarestruktur und -design