<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Datenkapselung_%28Programmierung%29</id>
	<title>Datenkapselung (Programmierung) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Datenkapselung_%28Programmierung%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Datenkapselung_(Programmierung)&amp;action=history"/>
	<updated>2026-06-03T11:07:42Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Datenkapselung_(Programmierung)&amp;diff=82729&amp;oldid=prev</id>
		<title>imported&gt;Ulanwp: Fehlenden Sprachparameter eingefügt</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Datenkapselung_(Programmierung)&amp;diff=82729&amp;oldid=prev"/>
		<updated>2026-02-19T16:58:13Z</updated>

		<summary type="html">&lt;p&gt;Fehlenden Sprachparameter eingefügt&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Als &amp;#039;&amp;#039;&amp;#039;Datenkapselung&amp;#039;&amp;#039;&amp;#039; ({{enS|encapsulation}}, nach [[David Parnas]] auch bekannt als {{lang|en|&amp;#039;&amp;#039;information hiding&amp;#039;&amp;#039;}}) bezeichnet man in der [[Programmierung]] das Verbergen von [[Daten]] oder [[Information|Informationen]] vor dem Zugriff von außen. Der direkte Zugriff auf die interne [[Datenstruktur]] wird unterbunden und erfolgt stattdessen über definierte [[Schnittstelle (Objektorientierung)|Schnittstellen]] ([[Black Box (Systemtheorie)|Black-Box-Modell]]).&lt;br /&gt;
&lt;br /&gt;
== Herleitung ==&lt;br /&gt;
Datenkapselung ist ein lange bekanntes Prinzip innerhalb der [[Strukturierte Programmierung|strukturierten]] und [[Modulare Programmierung|modularen Programmierung]]. Zentrales Modell ist hier der [[Abstrakter Datentyp|abstrakte Datentyp]], in dem Daten in einer [[Datenstruktur]] zusammengefasst sind, auf die nur über festgelegte [[Zugriffsfunktion|Zugriffsfunktionen]] ([[Prozedur (Programmierung)|Prozeduren]]) zugegriffen werden kann. In der tatsächlichen [[Programmierung]] wird der [[Abstrakter Datentyp|abstrakte Datentyp]] auf verschiedene Weisen implementiert.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Beispiel in modernen [[Programmiersprache|Programmiersprachen]] ist das Verbergen von Daten innerhalb von [[Gültigkeitsbereich]]en. Jede Teilstruktur eines Programms (Hauptblock, [[Prozedur (Programmierung)|Prozeduren]], [[Funktion (Programmierung)|Funktionen]], [[Unterprogramm|Unterprogramme]], …) definiert einen solchen Bereich, so dass eine Gültigkeitshierarchie entsteht. Deklarierte Daten sind nur innerhalb des umgebenden und in allen tieferen Bereichen sichtbar und gültig. Für einen höheren Bereich bleiben sie verborgen.&lt;br /&gt;
&lt;br /&gt;
== Datenkapselung im objektorientierten Paradigma ==&lt;br /&gt;
Kapselung ist auch ein wichtiges Prinzip der [[Objektorientierte Programmierung#Konzepte|objektorientierten Programmierung]]. Als Kapselung bezeichnet man den kontrollierten Zugriff auf [[Methode (Programmierung)|Methoden]] bzw. [[Attribut (Programmierung)|Attribute]] von [[Klasse (Objektorientierung)|Klassen]]. Klassen können den internen Zustand anderer Klassen nicht in unerwarteter Weise lesen oder ändern. Eine Klasse hat eine [[Schnittstelle (Objektorientierung)|Schnittstelle]], die darüber bestimmt, auf welche Weise mit der Klasse interagiert werden kann. Dadurch wird das Umgehen von [[Invariante (Informatik)|Invarianten]] des [[Computerprogramm|Programms]] verhindert.&lt;br /&gt;
&lt;br /&gt;
Vom Innenleben einer Klasse soll der Verwender – gemeint sind sowohl die [[Algorithmus|Algorithmen]], die mit der [[Klasse (Objektorientierung)|Klasse]] arbeiten, als auch der [[Programmierer]], der diese entwickelt – möglichst wenig wissen müssen &amp;#039;&amp;#039;(Geheimnisprinzip)&amp;#039;&amp;#039;. Durch die Kapselung werden nur Angaben über das „Was“ (Funktionsweise) einer Klasse nach außen sichtbar, nicht aber das „Wie“ (die interne Darstellung). Dadurch wird eine [[Schnittstelle]] nach außen definiert und zugleich dokumentiert.&lt;br /&gt;
&lt;br /&gt;
=== Verwendete Zugriffsarten ===&lt;br /&gt;
&amp;lt;!-- ... (kurze Einleitung?) ... --&amp;gt;&lt;br /&gt;
Die [[Unified Modeling Language]] als De-facto-Standardnotation erlaubt die Modellierung folgender Zugriffsarten (in Klammern die Kurznotation der [[Unified Modeling Language|UML]]):&lt;br /&gt;
; public (&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;):Zugreifbar für alle [[Objekt (Programmierung)|Objekte]],&lt;br /&gt;
; private (&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;):Nur für Objekte der eigenen [[Klasse (Objektorientierung)|Klasse]] zugreifbar,&lt;br /&gt;
; protected (&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;):Nur für Objekte der eigenen Klasse und von [[Abgeleitete Klasse|abgeleiteten Klassen]] dieser Klasse zugreifbar,&lt;br /&gt;
; package (&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt;): erlaubt den Zugriff für alle Elemente innerhalb des eigenen Pakets.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Anmerkung:&amp;#039;&amp;#039; Die Handhabung des [[Schlüsselwort (Programmierung)|Schlüsselwortes]] &amp;#039;&amp;#039;package&amp;#039;&amp;#039; ist in den verschiedenen [[Programmiersprache|Programmiersprachen]] unterschiedlich. Ersetzung in der jeweiligen Sprache:&lt;br /&gt;
* [[C-Sharp|C#]]: &amp;#039;&amp;#039;internal&amp;#039;&amp;#039;&lt;br /&gt;
* [[Visual Basic .NET]]: &amp;#039;&amp;#039;friend&amp;#039;&amp;#039;&lt;br /&gt;
* [[Java (Programmiersprache)|Java]]: Keine Definition bedeutet Package-Zugriff (Default).&lt;br /&gt;
&lt;br /&gt;
Die Möglichkeiten zur Spezifizierung der Zugreifbarkeit sind je nach [[Programmiersprache]] unterschiedlich.&lt;br /&gt;
&lt;br /&gt;
=== Vorteile ===&lt;br /&gt;
* Da die Implementierung einer [[Klasse (Objektorientierung)|Klasse]] anderen Klassen nicht bekannt ist, kann die Implementierung geändert werden, ohne die Zusammenarbeit mit anderen Klassen zu beeinträchtigen.&lt;br /&gt;
* Es ergibt sich eine erhöhte Übersichtlichkeit, da nur die öffentliche Schnittstelle einer Klasse betrachtet werden muss.&lt;br /&gt;
* Beim Zugriff über eine [[Zugriffsfunktion]] spielt es von außen keine Rolle, ob diese Funktion 1:1 im Inneren der Klasse existiert, das Ergebnis einer Berechnung ist oder möglicherweise aus anderen Quellen, z.&amp;amp;nbsp;B. einer [[Datei]] oder [[Datenbank]], stammt.&lt;br /&gt;
* Deutlich verbesserte [[Testbarkeit]], Stabilität und Änderbarkeit der [[Software]] bzw. deren [[Modul (Software)|Module]].&lt;br /&gt;
* Reduktion der Anzahl der möglichen unerwünschten Interaktionen zwischen Programmteilen. Enthält ein [[Computersprache|Programm]] N [[Variable (Programmierung)|Variablen]] und M [[Funktion (Programmierung)|Funktionen]], gibt es &amp;lt;math&amp;gt;\mathcal{O}(N\cdot M)&amp;lt;/math&amp;gt; mögliche Interaktionen. In der Regel sind aber nur &amp;lt;math&amp;gt;\mathcal{O}(N+M)&amp;lt;/math&amp;gt; Interaktionen tatsächlich erwünscht. Dies spielt bei der Fehlersuche eine Rolle, weil sich Fehler meist dadurch manifestieren, dass eine Variable einen falschen Wert enthält, und man zur Eingrenzung der Fehlerursache wissen muss, welche Funktionen auf die Variable Zugriff haben. Die Datenkapselung schränkt den zu untersuchenden Programmabschnitt von vornherein auf sehr wenige Funktionen ein.&lt;br /&gt;
&lt;br /&gt;
=== Nachteile ===&lt;br /&gt;
* In Abhängigkeit vom Anwendungsfall Geschwindigkeitseinbußen durch den Aufruf von [[Zugriffsfunktion|Zugriffsfunktionen]]. Der direkte Zugriff auf die [[Datenelement|Datenelemente]] wäre schneller.&lt;br /&gt;
* Zusätzlicher Programmieraufwand für die Erstellung von Zugriffsfunktionen.&lt;br /&gt;
Die interne Darstellung eines [[Objekt (Programmierung)|Objekts]] wird im Allgemeinen außerhalb der Objektdefinition ausgeblendet. Normalerweise können nur die eigenen Methoden des Objekts seine direkt untersuchen oder bearbeiten. Durch das Ausblenden der internen Daten des Objekts wird seine Integrität geschützt, indem verhindert wird, dass Benutzer die internen Daten der Komponente in einen ungültigen oder inkonsistenten Zustand versetzen. Ein vermeintlicher Vorteil der Kapselung besteht darin, dass sie die Systemkomplexität verringern und damit die Robustheit erhöhen kann, indem der Entwickler die gegenseitigen Abhängigkeiten zwischen Softwarekomponenten begrenzen kann.&lt;br /&gt;
&lt;br /&gt;
Einige [[Objektorientierte Programmiersprache|objektorientierte Programmiersprachen]] wie Ruby erlauben den Zugriff nur über Objektmethoden, aber die meisten, z.&amp;amp;nbsp;B. C#. C++ und Java, bieten dem Programmierer ein gewisses Maß an Kontrolle darüber, was verborgen ist, normalerweise über Schlüsselwörter wie &amp;#039;&amp;#039;public&amp;#039;&amp;#039; und &amp;#039;&amp;#039;private&amp;#039;&amp;#039;. Das Ausblenden von Informationen wird erreicht, indem eine kompilierte Version des Quellcodes bereitgestellt wird, die über eine Header-Datei verbunden ist.&amp;lt;ref name=&amp;quot;Pierce&amp;quot;&amp;gt;{{cite journal |first=Benjamin |last=Pierce |year=2002 |title=Types and Programming Languages |journal=MIT Press |language=en}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Das folgende Beispiel in der [[Programmiersprache]] [[C-Sharp|C#]] zeigt, wie der Zugriff auf ein [[Attribut (Programmierung)|Attribut]] durch die Verwendung des [[Schlüsselwort (Programmierung)|Schlüsselworts]] &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt; eingeschränkt werden kann:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
class Program&lt;br /&gt;
{&lt;br /&gt;
	public class Konto&lt;br /&gt;
	{&lt;br /&gt;
		private decimal kontostand = 500.00m;&lt;br /&gt;
&lt;br /&gt;
		public decimal gibKontostand()&lt;br /&gt;
		{&lt;br /&gt;
			return kontostand;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	static void Main()&lt;br /&gt;
	{&lt;br /&gt;
		Konto meinKonto = new Konto();&lt;br /&gt;
		decimal meinKontostand = meinKonto.gibKontostand();&lt;br /&gt;
&lt;br /&gt;
		/* Diese Main Methode kann den Kontostand mit der öffentlichen Methode &amp;quot;gibKontostand&amp;quot;, die von der Klasse &amp;quot;Konto&amp;quot; zur Verfügung gestellt wird, abfragen, aber sie kann den Wert des Attributs &amp;quot;kontostand&amp;quot; nicht ändern*/&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel ist in der [[Programmiersprache]] [[Java (Programmiersprache)|Java]] implementiert:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class Angestellter&lt;br /&gt;
{&lt;br /&gt;
    private BigDecimal salary = new BigDecimal(50000.00);&lt;br /&gt;
&lt;br /&gt;
    public BigDecimal gibLohn()&lt;br /&gt;
    {&lt;br /&gt;
        return salary;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main()&lt;br /&gt;
    {&lt;br /&gt;
        Angestellter angestellter = new Angestellter();&lt;br /&gt;
        BigDecimal lohn = angestellter.gibLohn();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Kapselung ist auch in nicht objektorientierten [[Programmiersprache|Programmiersprachen]] möglich. In [[C (Programmiersprache)|C]] kann beispielsweise eine Struktur in der öffentlichen [[Programmierschnittstelle]] über die [[Header-Datei]] für eine Reihe von Funktionen deklariert werden, die mit einem [[Datenelement]] arbeiten, das Datenelement enthält, auf die Clients der Programmierschnittstelle mit dem [[Schlüsselwort (Programmierung)|Schlüsselwort]] &amp;lt;code&amp;gt;extern&amp;lt;/code&amp;gt; nicht zugreifen können.&amp;lt;ref&amp;gt;{{cite book |first1=K. N. |last1=King |title=C Programming: A Modern Approach |edition=2. |date=2008 |publisher=W. W. Norton &amp;amp; Company |language=en |isbn=978-0-393-97950-3 |page=464}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Header file &amp;quot;api.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
struct Entity;          // Opaque structure with hidden members&lt;br /&gt;
&lt;br /&gt;
// API functions that operate on &amp;#039;Entity&amp;#039; objects&lt;br /&gt;
extern struct Entity *  open_entity(int id);&lt;br /&gt;
extern int              process_entity(struct Entity *info);&lt;br /&gt;
extern void             close_entity(struct Entity *info);&lt;br /&gt;
// extern keywords here are redundant, but don&amp;#039;t hurt.&lt;br /&gt;
// extern defines functions that can be called outside the current file, the default behavior even without the keyword&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Navigationsleiste Prinzipien objektorientierten Designs}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmierkonzept]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Ulanwp</name></author>
	</entry>
</feed>