<?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=Abstrakter_Datentyp</id>
	<title>Abstrakter Datentyp - 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=Abstrakter_Datentyp"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Abstrakter_Datentyp&amp;action=history"/>
	<updated>2026-05-31T11:35:51Z</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=Abstrakter_Datentyp&amp;diff=97959&amp;oldid=prev</id>
		<title>imported&gt;Greenhorn4: /* Angestrebte Eigenschaften */ Die Definitionen von Geschütztheit und Kapselung waren vertauscht.</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Abstrakter_Datentyp&amp;diff=97959&amp;oldid=prev"/>
		<updated>2022-02-10T10:24:52Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Angestrebte Eigenschaften: &lt;/span&gt; Die Definitionen von Geschütztheit und Kapselung waren vertauscht.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Ein &amp;#039;&amp;#039;&amp;#039;Abstrakter Datentyp&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;ADT&amp;#039;&amp;#039;&amp;#039;) ist ein Verbund von [[Daten]] zusammen mit der Definition aller zulässigen [[Operation (Informatik)|Operationen]], die auf sie zugreifen.&lt;br /&gt;
&lt;br /&gt;
== Beschreibung ==&lt;br /&gt;
Da der Zugriff nur über die festgelegten Operationen erfolgt, sind die Daten nach außen [[Datenkapselung (Programmierung)|gekapselt]].&lt;br /&gt;
&lt;br /&gt;
Ein ADT beschreibt, &amp;#039;&amp;#039;was&amp;#039;&amp;#039; die Operationen tun (Semantik), aber noch nicht, &amp;#039;&amp;#039;wie&amp;#039;&amp;#039; sie es tun sollen (Implementierung).&lt;br /&gt;
Auch kann das Konzept des ADTs unterschiedlich spezifiziert und ein ADT auf verschiedene Weise notiert werden, bspw. durch [[Pseudocode]] oder durch eine mathematische Beschreibung. Modernere Programmiersprachen unterstützen allerdings gezielt die Erstellung von ADTs.&lt;br /&gt;
&lt;br /&gt;
[[Objektorientierte Programmiersprache]]n unterstützen durch ihr Klassenkonzept die Erstellung von ADTs, da hier Daten und Operationen &amp;#039;&amp;#039;gebunden&amp;#039;&amp;#039; werden, die Daten geschützt und die zulässigen Operationen festgelegt werden können.&lt;br /&gt;
Einige [[Modulare Programmierung|modulare Programmiersprachen]] wie [[Ada (Programmiersprache)|Ada]] oder [[Modula-2]] unterstützen ebenfalls gezielt die Erstellung von ADTs. In der Regel ist es möglich, einen ADT durch Definition der Daten und der Signaturen der Operationen festzulegen, während die Semantik als Kommentartext beschrieben wird.&lt;br /&gt;
&lt;br /&gt;
; Beispiel&lt;br /&gt;
: Java unterstützt ADTs durch Klassen, abstrakte Klassen und [[Schnittstelle (Programmierung)|Interfaces]]. In einem Interface werden nur Daten und Signaturen der Operationen definiert, eine festgelegte Klasse &amp;#039;&amp;#039;implementiert&amp;#039;&amp;#039; erst das Interface. Allgemein legt eine Klasse die Daten und die darauf zulässigen Operationen fest.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Bitte belegen (Referenz angeben)&lt;br /&gt;
Ursprünglich ist ein ADT eine Bezeichnung für [[Datentyp]]en, um diese unabhängig von einer konkreten Implementierung zu spezifizieren. Sie wurden von [[Barbara Liskov]] und [[Stephen Zilles]] 1974 und von [[John Guttag]] 1977 vorgestellt und einem breiten Publikum durch die &amp;#039;&amp;#039;[[Communications of the ACM]]&amp;#039;&amp;#039; nahe gebracht.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!-- Interessant, gehört aber nicht hierher (anderes Thema)&lt;br /&gt;
Bei sogenannten primitiven Datentypen, den Basisdatentypen einer Programmiersprache, gibt es oft erhebliche Unterschiede zwischen der Datentypimplementierung in den verschiedenen Sprachen, obwohl sie ähnlich heißen. Beispielsweise wird ein ganzzahliger Datentyp (&amp;#039;&amp;#039;[[Integer (Datentyp)|Integer]]&amp;#039;&amp;#039;) mal mit 8 [[Bit]] implementiert und mal mit 16, was zur Folge hat, dass der Wertebereich mal 0-255 und mal 0-65535 ist.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!-- zu ungenau&lt;br /&gt;
Ein Datentyp besteht aus einem Wertebereich, d.&amp;amp;nbsp;h. den Werten, die eine Variable dieses Datentyps annehmen kann, und einer Menge an Operationen ([[Funktion (Programmierung)|Funktion]]en, [[Methode (Programmierung)|Methoden]] oder [[Prozedur (Programmierung)|Prozeduren]]), die für diesen Datentyp spezifiziert sind. „+“ ist zum Beispiel definiert für numerische Typen, und in einigen Programmiersprachen für einen String-Datentyp. „-“ hingegen ist in der Regel nur definiert für numerische Datentypen. Die Menge der Operationen wird auch die Schnittstelle des ADTs genannt.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Spezifikationen ==&lt;br /&gt;
Ein abstrakter Datentyp kann durch unterschiedliche Spezifikationen angegeben werden. Eine Spezifikation besteht aus einer [[Signatur (Programmierung)|Signatur]] und einer Semantik, die Bedeutung und Interaktion der Operationen festlegt.&lt;br /&gt;
&lt;br /&gt;
Mathematisch betrachtet handelt es sich um die Spezifikation einer [[Termalgebra]] durch [[Signatur (Modelltheorie)|Signatur]], [[Erzeuger (Algebra)|Erzeuger]] und Axiome. Daraus ergibt sich die erste Art der Spezifikation, die mathematisch-axiomatische.&lt;br /&gt;
&lt;br /&gt;
Eine weitere Möglichkeit ist die mathematisch-algebraische Spezifikation, die sich nur in der Angabe der Semantik von der axiomatischen unterscheidet. Die inhaltliche Bedeutung der Operationen wird hierbei durch mathematische Mittel, Matrizen, Vektoren, Folgen etc. definiert.&lt;br /&gt;
&lt;br /&gt;
Daneben existieren Sonderformen, wie die informelle Methode der Spezifikation –&amp;amp;nbsp;durch Angabe einer Schnittstelle einer Programmiersprache, beispielsweise als [[Java (Programmiersprache)|Java]]-Schnittstellen oder die Implementierung des Datentyps in einer [[Funktionale Programmierung|funktionalen Programmiersprache]] wie [[Haskell (Programmiersprache)|Haskell]]&amp;amp;nbsp;– was im ersten Moment widersprüchlich zu dem Bestreben steht, den Datentyp unabhängig von einer Implementierung zu machen. Die Implementierung in einer funktionalen Programmiersprache dient allerdings als Spezifikation für ADTs, die schließlich in prozeduralen oder objektorientierten Sprachen implementiert werden. Der Vorteil dieser Spezifikation ist, dass gleich getestet werden kann, ob die Spezifikation sinnvoll ist, was bei den anderen Möglichkeiten, besonders der axiomatischen, nicht ohne weiteres möglich ist.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Im Folgenden werden die ADTs [[Stapelspeicher]] (&amp;#039;&amp;#039;Stack&amp;#039;&amp;#039;, arbeitet nach dem &amp;#039;&amp;#039;[[Last In – First Out|Last-in-First-out]]&amp;#039;&amp;#039;-Prinzip) und [[Warteschlange (Datenstruktur)|Warteschlange]] (&amp;#039;&amp;#039;Queue&amp;#039;&amp;#039;, arbeitet nach dem &amp;#039;&amp;#039;[[First In – First Out|First-in-First-out]]&amp;#039;&amp;#039;-Prinzip) in den angesprochenen vier Spezifikationen definiert.&lt;br /&gt;
&lt;br /&gt;
=== Signatur ===&lt;br /&gt;
==== Mathematisch-axiomatische und -algebraische Methode ====&lt;br /&gt;
 STACK (wird hier definiert)&lt;br /&gt;
 ELEMENT (ein hier nicht definierter ADT, mit dem der Stack arbeitet)&lt;br /&gt;
 BOOL&lt;br /&gt;
&lt;br /&gt;
 emptyStack: → STACK (erzeugt einen leeren Stack)&lt;br /&gt;
 isStackEmpty: STACK → BOOL (fragt nach, ob der Stack leer ist)&lt;br /&gt;
 push: ELEMENT × STACK → STACK (packt ein Element oben auf den Stack)&lt;br /&gt;
 pop: STACK → STACK (entfernt das oberste Element und gibt den neuen Stack zurück)&lt;br /&gt;
 top: STACK → ELEMENT (gibt das oberste Element zurück, ohne es zu entfernen)&lt;br /&gt;
&lt;br /&gt;
 QUEUE&lt;br /&gt;
 ELEMENT&lt;br /&gt;
 BOOL&lt;br /&gt;
&lt;br /&gt;
 emptyQueue: → QUEUE&lt;br /&gt;
 isQueueEmpty: QUEUE → BOOL&lt;br /&gt;
 enqueue: ELEMENT × QUEUE → QUEUE (fügt ein Element hinten an)&lt;br /&gt;
 dequeue: QUEUE → QUEUE (entfernt das vorderste Element)&lt;br /&gt;
 head: QUEUE → ELEMENT (gibt das vorderste Element zurück, ohne es zu entfernen)&lt;br /&gt;
&lt;br /&gt;
==== Informelle Methode (Java) ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public interface IStack&amp;lt;E&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
    public boolean isStackEmpty();&lt;br /&gt;
    public IStack&amp;lt;E&amp;gt; push(E elem);&lt;br /&gt;
    public IStack&amp;lt;E&amp;gt; pop();&lt;br /&gt;
    public E top();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public interface IQueue&amp;lt;E&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
    public boolean isQueueEmpty();&lt;br /&gt;
    public IQueue&amp;lt;E&amp;gt; enqueue(E elem);&lt;br /&gt;
    public IQueue&amp;lt;E&amp;gt; dequeue();&lt;br /&gt;
    public E head();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Spezifikation durch eine funktionale Programmiersprache (Haskell) ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Haskell&amp;quot;&amp;gt;&lt;br /&gt;
data Stack e = E | S e (Stack e)&lt;br /&gt;
isStackEmpty :: Stack a → Bool&lt;br /&gt;
push :: e → Stack e → Stack e&lt;br /&gt;
pop :: Stack e → Stack e&lt;br /&gt;
top :: Stack e → e&lt;br /&gt;
&lt;br /&gt;
data Queue e = E | Q (Queue e) e&lt;br /&gt;
isQueueEmpty :: Queue e → Bool&lt;br /&gt;
enqueue :: e → Queue e → Queue e&lt;br /&gt;
dequeue :: Queue e → Queue e&lt;br /&gt;
head :: Queue e → e&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Semantik ===&lt;br /&gt;
&lt;br /&gt;
Auch bei genauerer Betrachtung der (identischen) Signaturen sind keine Unterschiede zwischen den Datentypen zu erkennen. Erst mit der Definition der Semantik ergeben sich Unterschiede.&lt;br /&gt;
&lt;br /&gt;
==== Mathematisch-axiomatische Methode ====&lt;br /&gt;
  x: ELEMENT&lt;br /&gt;
  s: STACK&lt;br /&gt;
  isStackEmpty(emptyStack()) = TRUE&lt;br /&gt;
  isStackEmpty(push(x,s)) = FALSE&lt;br /&gt;
  pop(emptyStack()) = ERROR&lt;br /&gt;
  pop(push(x,s)) = s&lt;br /&gt;
  top(emptyStack()) = ERROR&lt;br /&gt;
  top(push(x,s)) = x&lt;br /&gt;
  push(top(s),pop(s)) = s, falls s nicht leer&lt;br /&gt;
&lt;br /&gt;
  x: ELEMENT&lt;br /&gt;
  q: QUEUE&lt;br /&gt;
  isQueueEmpty(emptyQueue()) = TRUE&lt;br /&gt;
  isQueueEmpty(enqueue(x,q)) = FALSE&lt;br /&gt;
  head(emptyQueue()) = ERROR&lt;br /&gt;
  head(enqueue(x,q)) = IF isQueueEmpty(q) THEN x ELSE head(q)&lt;br /&gt;
  dequeue(emptyQueue()) = ERROR&lt;br /&gt;
  dequeue(enqueue(x,q)) = IF isQueueEmpty(q) THEN q ELSE enqueue(x, dequeue(q))&lt;br /&gt;
&lt;br /&gt;
==== Mathematisch-algebraische Methode ====&lt;br /&gt;
 SETS ELEMENT = E (Menge der Elemente) &amp;lt;math&amp;gt;x \in E&amp;lt;/math&amp;gt;&lt;br /&gt;
      STACK = S = &amp;lt;math&amp;gt;\lbrace \langle \rangle \rbrace \cup \lbrace \langle x_1{,}...{,}x_n \rangle|x_i \in E \land\ n\in \mathbb{N} \land n \ge 1 \rbrace&amp;lt;/math&amp;gt;&lt;br /&gt;
 FUNCTIONS&lt;br /&gt;
     emptyStack      = &amp;lt;math&amp;gt;\langle \rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
     isStackEmpty(S) = &amp;lt;math&amp;gt;(S == \langle \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
     push(S,x)       = &amp;lt;math&amp;gt;\langle x \rangle&amp;lt;/math&amp;gt;, falls &amp;lt;math&amp;gt;(S == \langle \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
                     = &amp;lt;math&amp;gt;\langle x_1{,}...{,}x_n{,}x \rangle&amp;lt;/math&amp;gt;, falls &amp;lt;math&amp;gt;(S == \langle x_1{,}...{,}x_{n} \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
     top(S)          = &amp;lt;math&amp;gt;\perp&amp;lt;/math&amp;gt;, falls &amp;lt;math&amp;gt;(S == \langle \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
                     = &amp;lt;math&amp;gt;x_n\,&amp;lt;/math&amp;gt;, falls &amp;lt;math&amp;gt;(S == \langle x_1{,}...{,}x_{n} \rangle, n \ge 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
     pop(S)          = &amp;lt;math&amp;gt;\perp&amp;lt;/math&amp;gt;, falls &amp;lt;math&amp;gt;(S == \langle \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
                     = &amp;lt;math&amp;gt;\langle \rangle&amp;lt;/math&amp;gt;, falls &amp;lt;math&amp;gt;(S == \langle x \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
                     = &amp;lt;math&amp;gt;\langle x_1{,}...{,}x_{n-1} \rangle&amp;lt;/math&amp;gt;, falls &amp;lt;math&amp;gt;(S == \langle x_1{,}...{,}x_{n} \rangle, n \ge 2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 SETS ELEMENT = E (Menge der Elemente) &amp;lt;math&amp;gt;x \in E&amp;lt;/math&amp;gt;&lt;br /&gt;
      QUEUE = Q = &amp;lt;math&amp;gt;\lbrace \langle \rangle \rbrace \cup \lbrace \langle x_1{,}...{,}x_n \rangle|x_i \in E \land\ n\in \mathbb{N} \land n \ge 1 \rbrace&amp;lt;/math&amp;gt;&lt;br /&gt;
 FUNCTIONS&lt;br /&gt;
     emptyQueue      = &amp;lt;math&amp;gt;\langle \rangle&amp;lt;/math&amp;gt;&lt;br /&gt;
     isQueueEmpty(Q) = &amp;lt;math&amp;gt;(Q == \langle \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
     enqueue(Q,x)    = &amp;lt;math&amp;gt;\langle x \rangle&amp;lt;/math&amp;gt;, falls &amp;lt;math&amp;gt;(Q == \langle \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
                     = &amp;lt;math&amp;gt;\langle x{,}x_1{,}...{,}x_n \rangle&amp;lt;/math&amp;gt;, falls &amp;lt;math&amp;gt;(Q == \langle x_1{,}...{,}x_{n} \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
     head(Q)         = &amp;lt;math&amp;gt;\perp&amp;lt;/math&amp;gt;, falls &amp;lt;math&amp;gt;(Q == \langle \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
                     = &amp;lt;math&amp;gt;x_n\,&amp;lt;/math&amp;gt;, falls &amp;lt;math&amp;gt;(Q == \langle x_1{,}...{,}x_{n} \rangle, n \ge 1)&amp;lt;/math&amp;gt;&lt;br /&gt;
     dequeue(Q)      = &amp;lt;math&amp;gt;\perp&amp;lt;/math&amp;gt;, falls &amp;lt;math&amp;gt;(Q == \langle \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
                     = &amp;lt;math&amp;gt;\langle \rangle&amp;lt;/math&amp;gt;, falls &amp;lt;math&amp;gt;(Q == \langle x \rangle)&amp;lt;/math&amp;gt;&lt;br /&gt;
                     = &amp;lt;math&amp;gt;\langle x_1{,}...{,}x_{n-1} \rangle&amp;lt;/math&amp;gt;, falls &amp;lt;math&amp;gt;(Q== \langle x_1{,}...{,}x_{n} \rangle, n \ge 2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Informelle Methode (Java) ====&lt;br /&gt;
Semantik: durch Angabe von Voraussetzung und Effekt/Ergebnis der Methode (beim objektorientierten Programmieren entfällt meist die Notwendigkeit, als Voraussetzung die Existenz der Datenstruktur anzugeben, da die Methode an ein Objekt gebunden ist, was schon existiert).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public interface IStack&amp;lt;E&amp;gt; {&lt;br /&gt;
    // Konstruktor in der konkreten Klasse&lt;br /&gt;
&lt;br /&gt;
    // Ergebnis: true, wenn der Stack leer ist, false andernfalls&lt;br /&gt;
    public boolean isStackEmpty();&lt;br /&gt;
&lt;br /&gt;
    // Effekt: Der Stack enthält das Element elem als oberstes Element.&lt;br /&gt;
    // Ergebnis: Der Stack nach dem Einfügen des Elements elem.&lt;br /&gt;
    public IStack&amp;lt;E&amp;gt; push(E elem);&lt;br /&gt;
&lt;br /&gt;
    // Voraussetzung: Der Stack ist nicht leer.&lt;br /&gt;
    // Effekt: Das oberste Element wird vom Stack gelöscht.&lt;br /&gt;
    // Ergebnis: Der Stack nach dem Löschen.&lt;br /&gt;
    public IStack&amp;lt;E&amp;gt; pop();&lt;br /&gt;
&lt;br /&gt;
    // Voraussetzung: Der Stack ist nicht leer.&lt;br /&gt;
    // Ergebnis: Das oberste Element.&lt;br /&gt;
    public E top();&lt;br /&gt;
}&lt;br /&gt;
public interface IQueue&amp;lt;E&amp;gt; {&lt;br /&gt;
    public boolean isQueueEmpty();&lt;br /&gt;
    public IQueue&amp;lt;E&amp;gt; enqueue(E elem);&lt;br /&gt;
    public IQueue&amp;lt;E&amp;gt; dequeue();&lt;br /&gt;
    public E head();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Spezifikation durch eine funktionale Programmiersprache (Haskell) ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
emptyStack = E&lt;br /&gt;
isStackEmpty E = True&lt;br /&gt;
isStackEmpty (S x xs) = False&lt;br /&gt;
push e xs = S e xs&lt;br /&gt;
pop (S x xs) = xs&lt;br /&gt;
top (S x xs) = x&lt;br /&gt;
&lt;br /&gt;
emptyQueue = E&lt;br /&gt;
isQueueEmpty E = True&lt;br /&gt;
isQueueEmpty (Q xs x) = False&lt;br /&gt;
enqueue e xs = Q xs e&lt;br /&gt;
dequeue E = E&lt;br /&gt;
dequeue (Q (E) x) = E&lt;br /&gt;
dequeue (Q (Q ys y) x) = enqueue x (dequeue (Q ys y))&lt;br /&gt;
head E = error &amp;quot;Queue ist leer.&amp;quot;&lt;br /&gt;
head (Q (E) x) = x&lt;br /&gt;
head (Q (Q ys y) x) = head (Q ys y)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Angestrebte Eigenschaften ==&lt;br /&gt;
Anzustrebende Eigenschaften eines gut programmierten ADT und meist auch einer gut spezifizierten Datenstruktur sind:&lt;br /&gt;
* &amp;#039;&amp;#039;Universalität&amp;#039;&amp;#039; (implementation independence): Der einmal entworfene und implementierte ADT kann in jedes beliebige [[Computerprogramm|Programm]] einbezogen und dort benutzt werden (z.&amp;amp;nbsp;B. in Form einer [[Unit (Programmiersprache Pascal)|Unit]]).&lt;br /&gt;
* &amp;#039;&amp;#039;Präzise Beschreibung&amp;#039;&amp;#039; (precise specification): Die [[Schnittstelle]] zwischen [[Implementierung]] und Anwendung muss eindeutig und vollständig sein.&lt;br /&gt;
* &amp;#039;&amp;#039;Einfachheit&amp;#039;&amp;#039; (simplicity): Bei der Anwendung interessiert die innere Realisierung des ADT nicht, der ADT übernimmt seine Repräsentation und Verwaltung im [[Arbeitsspeicher|Speicher]] selbst.&lt;br /&gt;
* &amp;#039;&amp;#039;Geschütztheit&amp;#039;&amp;#039; (integrity): Die Schnittstelle soll als eine hermetische Grenze aufgefasst werden. Der Anwender soll sehr genau wissen, &amp;#039;&amp;#039;was&amp;#039;&amp;#039; ein ADT tut, aber keinesfalls, &amp;#039;&amp;#039;wie&amp;#039;&amp;#039; er es tut.&lt;br /&gt;
* &amp;#039;&amp;#039;Kapselung&amp;#039;&amp;#039; (encapsulation): Der Anwender kann in die interne Struktur der Daten nicht eingreifen. Die Gefahr, Daten ungewollt zu löschen bzw. zu verändern sowie Programmierfehler zu begehen, ist dadurch deutlich herabgesetzt.&lt;br /&gt;
* &amp;#039;&amp;#039;Modularität&amp;#039;&amp;#039; (modularity): Das modulare Prinzip erlaubt übersichtliches und damit sicheres Programmieren und leichten Austausch von Programmteilen. Bei der Fehlersuche können einzelne [[Modul (Software)|Module]] sehr isoliert betrachtet werden. Viele Verbesserungen können über ADTs nachträglich ohne die geringste Änderung in sämtlichen Umgebungs- bzw. Anwendungsprogrammen übernommen werden.&lt;br /&gt;
&lt;br /&gt;
Wird [[Objektorientierte Programmierung|objektorientiert]] programmiert, können diese Eigenschaften besonders leicht erfüllt werden, weil das objektorientierte [[Programmierparadigma|Paradigma]] auf natürliche Weise die Erstellung von ADTs unterstützt. Eine weitere Möglichkeit zur Erstellung von ADTs (auch in Verbindung mit objektorientierter Programmierung) sind [[Generischer Typ|generische Typen]].&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* [[Barbara Liskov]], Stephen Zilles: &amp;#039;&amp;#039;Programming with abstract data types&amp;#039;&amp;#039;. In: &amp;#039;&amp;#039;SIGPLAN Notices&amp;#039;&amp;#039;, Vol. 9, No. 4, 1974, S. 50–59&lt;br /&gt;
* [[John Guttag]]: &amp;#039;&amp;#039;Abstract Data Types and the Development of Data Structures&amp;#039;&amp;#039;. In: &amp;#039;&amp;#039;Communications of the ACM&amp;#039;&amp;#039;, Vol. 20, 1977, No. 6, S. 396–404.&lt;br /&gt;
* J. A. Goguen, J. W. Thatcher, E. W. Wagner: &amp;#039;&amp;#039;An Initial Algebra Approach to the Specification, Correctness and Implementation of Abstract Data Types&amp;#039;&amp;#039;. In: R.T. Yeh (Hrsg.): &amp;#039;&amp;#039;Current Trends on Programming Methodology&amp;#039;&amp;#039;, Vol. IV, 1978, Prentice-Hall Int.&lt;br /&gt;
* Hartmut Ehrig, Bernd Mahr: &amp;#039;&amp;#039;Fundamentals of Algebraic Specification 1 – Equations and Initial Semantics&amp;#039;&amp;#039;. Springer-Verlag, 1985&lt;br /&gt;
* Luca Cardelli, Peter Wegner: &amp;#039;&amp;#039;On Understanding Types, Data Abstraction, and Polymorphism&amp;#039;&amp;#039;. In: &amp;#039;&amp;#039;Computing Surveys&amp;#039;&amp;#039;, Vol. 17, No. 4, Dezember 1985, S. 470–522&lt;br /&gt;
* John C. Mitchell, Gordon D. Plotkin: &amp;#039;&amp;#039;Abstract Data Types Have Existential Type&amp;#039;&amp;#039;. In: &amp;#039;&amp;#039;ACM Transaction on Programming Languages ans Systems&amp;#039;&amp;#039;, Vol. 10, No. 3, Juli 1988, S. 470–502.&lt;br /&gt;
* Peter Müller: &amp;#039;&amp;#039;Introduction to Object-Oriented Programming Using C++&amp;#039;&amp;#039;. [https://www.desy.de/gna/html/cc/Tutorial/node4.html Kapitel zu ADT]&lt;br /&gt;
* {{Literatur |Autor=Jorge Martinez |Titel=Ordered algebraic structures: proceedings of the Gainesville conference sponsored by the University of Florida 28th February-3rd Marchf, 200 |Verlag=Kluwer Academic Publishers |Ort=Dordrecht; Boston |Datum=2002 |ISBN=978-1-4020-0752-1 |Sprache=en |Online={{Google Buch| BuchID = VocRthxFC68C |SeitenID=PP5}}}}&lt;br /&gt;
* {{Literatur |Autor=Rolke, Sennholz |Titel=Grund- und Leistungskurs Informatik |Verlag=Cornelsen |Ort=Düsseldorf |Datum=1992 |ISBN=3-464-57312-5}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Datentyp]]&lt;br /&gt;
&lt;br /&gt;
[[sv:Datatyp#Abstrakta typer]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Greenhorn4</name></author>
	</entry>
</feed>