Datenabstraktion

Werbung
CS1005
Objektorientierte Programmierung
Bachelor of Science (Informatik)
Th Letschert
Klassenentwurf : Datenabstraktion
Seite 1
© Th Letschert
Datenabstraktion
Spezifikationen
Seite 2
© Th Letschert
Datenabstraktion
abstrakte Datentypen
Seite 3
Th Letschert
Abstraktion in der Informatik
Abstraktion
Von Unwesentlichem absehen
Konzentration auf das Wesentliche
Das Wesentliche in der Flut der Details finden
Abstraktion ist ein Grundprinzip der Informatik
Das Chaos der komplizierten Details ist das Problem.
Abstraktion ist die Lösung.
Seite 4
Th Letschert
Abstraktion: Funktionale Abstraktion
Funktionale Abstraktion:
Vom Algorithmus zum Programm
x ~> √x
Funktionale Abstraktion
public static double squareRoot( double x )
{
double a = 1;
for (int i = 0; i < 100; i++) {
a = (a + x / a) / 2;
}
return a;
}
Seite 5
Th Letschert
Abstraktion: Datenabstraktion
Daten-Abstraktion: Von ? zu ?
Was ist das ?
Was ist das ?
Daten-Abstraktion
public final class Vektor {
private double x;
private double y;
public Vektor addVektor (Vektor v2) {
return new Vektor(x+v2.x,
y+v2.y);
}
public boolean equals (Vektor v){
return x == v.x && y == v.y;
}
Vektor() {
this.x = 1.0; this.y = 1.0;
}
Vektor(double x, double y) {
this.x = x; this.y = y;
}
public static Vektor add (Vektor v1,
public boolean equals (Object o){
if ( o instanceof Vektor )
return equals( (Vektor) o);
else return false;
}
Vektor v2) {
return new Vektor(v1.x+v2.x,
v1.y+v2.y);
}
}
Seite 6
Th Letschert
Abstraktion: Datenabstraktion
Daten-Abstraktion: Von der Klasse zum Datentyp
Werte und Operationen
auf diesen Werten
Daten-Abstraktion
public final class Vektor {
private double x;
private double y;
Datentyp
Klasse
public Vektor addVektor (Vektor v2) {
return new Vektor(x+v2.x,
y+v2.y);
}
public boolean equals (Vektor v){
return x == v.x && y == v.y;
}
Vektor() {
this.x = 1.0; this.y = 1.0;
}
Vektor(double x, double y) {
this.x = x; this.y = y;
}
public static Vektor add (Vektor v1,
public boolean equals (Object o){
if ( o instanceof Vektor )
return equals( (Vektor) o);
else return false;
}
Vektor v2) {
return new Vektor(v1.x+v2.x,
v1.y+v2.y);
}
}
Seite 7
Th Letschert
Datenabstraktion
Daten-Abstraktion: Von einer Klasse zu einem
Datentyp
Datentyp
Werte
+ passende Operationen
konkreter Datentyp
in der Sprache implementierter / verfügbarer Datentyp
abstrakter Datentyp (ADT)
selbst implementierter Datentyp
typischerweise als Klasse
Objekte repräsentieren Werte
Methoden (statisch oder nicht statisch) repräsentieren
Operationen
interne Darstellung der Werte in den Objektvariablen:
Geheimnis der Klasse
Seite 8
Th Letschert
Datenabstraktion
Abstrakter Datentyp:
Werte: Vektoren
Operation: Vektoraddition
Implementierung
=
public final class Vektor {
private final double x;
private final double y;
Klasse:
Werte
Operationen
+
~ Objekte
~ Methoden
public Vektor() {
this.x = 1.0; this.y = 1.0;
}
public Vektor(double x, double y) {
this.x = x; this.y = y;
}
public Vektor add(Vektor v) {
return new Vektor(
x+v.x,
y+v.y);
}
Die abstrakten Werte entsprechen
Objekten in bestimmten
Zuständen
Zustand: aktuelle Belegung der
Objektvariablen
}
Seite 9
Th Letschert
Datenabstraktion und Geheimnisprinzip
Abstrakter Datentyp:
externe Sicht / Schnittstelle der
Klasse:
Was gibt es
Was tut es
Implementierung
+
=
public final class Vektor {
private final double x;
private final double y;
Geheim / gekapselt:
Wie werden die Werte intern
repräsentiert
Welche Algorithmen realisieren
die Operationen
public Vektor() {
this.x = 1.0; this.y = 1.0;
}
public Vektor(double x, double y) {
this.x = x; this.y = y;
}
public Vektor add(Vektor v) {
return new Vektor(
x+v.x,
y+v.y);
}
}
Seite 10
Th Letschert
Datenabstraktion, Kopplung und Kohäsion
Datenabstraktion = Klasse realisiert Abstrakten Datentyp
Trennung von Schnittstelle und Implementierung
➔ Kopplung gering !
Klasse repräsentiert einen anwendungsorientierten Typ
➔ Klasse hat ein klares, fest umrissenes, verstehbares
Konzept
➔ Kohäsion hoch !
+
=
p ublic final class Vektor {
p rivate fina l doub le x;
p rivate fina l doub le y;
p ublic Vektor() {
t his.x = 1.0; thi s.y = 1.0;
}
p ublic Vektor(doubl e x, doubl e y) {
t his.x = x; this.y = y;
}
p ublic Vektor add(Vektor v) {
r eturn new Vektor(
x+v.x,
y+v.y);
}
}
Seite 11
Th Letschert
ADTs, Wert- und Zustandsorientierung
Wertorientierte Klasse als Datenabstraktion
Klasse repräsentiert Datentyp (Typ von Daten):
Menge unveränderlicher Werte mit zugehörigen Funktionen
Operationen erzeugen Werte aus anderen Werten
Objekt-Variablen oft (nicht unbedingt) final
Methoden oft (nicht unbedingt) statisch
equals (+ hashcode) muss i.d.R. implementiert werden
oft wird Comparable und Cloneable implementiert
Zustandsorientierte Klasse als Datenabstraktion
Klasse repräsentiert Typ von Maschinen / Automaten:
Menge von veränderlichen – zustandsbehafteten - Objekten
Operationen sind Zustandsveränderer
Objektvariablen nicht final
Methoden i.d.R. nicht statisch
equals muss i.d.R. nicht implementiert werden
Comparable / Clonable werden i.d.R. nicht implementiert
Seite 12
Th Letschert
Spezifikation und
Implementierung
Seite 13
Th Letschert
Spezifikation und Schnittstelle
Spezifikation
Die Spezifikation einer Software-Komponente enthält die
Informationen die zu deren Erstellung notwendig sind.
Schnittstelle
Die Schnittstelle einer Software-Komponente enthält die
Informationen die zu deren Benutzung notwendig sind.
Die Spezifikation enthält mehr Informationen als die Schnittstelle. Sie umfasst
die Informationen der Schnittstelle.
Die Schnittstelle ist Bestandteil der Komponente, die Spezifikation dagegen
nicht.
Seite 14
Th Letschert
Spezifikation
Spezifikation: Funktionalität festlegen
Was kann die Klasse (was können ihre Objekte),
welchen Dienst bietet / bieten sie.
Die Spezifikation beschreibt die Einsatzmöglichkeiten der
Komponente
Die Implementierung bleibt dabei offen, wird nicht festgelegt /
beschrieben
Ziele einer (Klassen-) Spezifikation
die Möglichkeiten der Verwendung
möglichst genau beschreiben
die Möglichkeiten der Implementierung
möglichst wenig einschränken
Seite 15
Th Letschert
Spezifikation / Schnittstelle einer Funktion
Funktion:
Spezifikation / Schnittstelle / Implementierung
Funktion
Name:
Typ:
Ergebnis:
squareRoot
double -> double
Spezifikation
x ~> √x
public static double squareRoot( double x )
public static double squareRoot( double x ) {
double a = 1;
for (int i = 0; i < 100; i++) {
a = (a + x / a) / 2;
}
return a;
}
Seite 16
Schnittstelle
Implementierung
Th Letschert
Vertragsorientierte Spezifikation
Vertragsorientierte Spezifikation
Spezifikation beschreibt Rechte und Pflichten der Komponente und ihrer
Benutzer
Vorbedingung
= Recht der Komponente / Pflicht der Benutzer
Beschreibt die Bedingungen einer legalen Benutzung, Dinge
auf die die Komponente sich verlassen kann
Nachbedingung
= Recht der Benutzer / Pflicht der Komponente
Beschreibt die Leistung der Komponente, Dinge auf die die Benutzer
der Komponente sich verlassen können.
Zahlt der
Kunde 10 Jahre
monatlich
100 €
ein, so zahlt
die Bank
150000 €
aus
Seite 17
Th Letschert
Vertragsorientierte Spezifikation
Vertragsorientierte Spezifikation einer Funktion
/**
* Berechnet die Quadratwurzel
* @param x Eingabe
* @pre
x >= 0
* @return e mit e*e -0.001 < x < e*e +0.001
*/
public static double sqrt(double x) {
double a = 1;
for (int i = 0; i < 100; i++) {
a = (a + x / a) / 2;
}
return a;
}
Strukturierter
Kommentar
Vorbedingnung ~ Pre
(Precondition)
Rufst du mich
mit positiven
Werten auf,
dann liefere ich
die Wurzel mit
einer
Genauigkeit
von 0.001
Seite 18
Th Letschert
Spezifikation einer Datenabstraktion
Daten-Abstraktion:
Zustand Spezifikation und Implementierung
Abstrakter Zustand: Idee des Objektzustands (Plan)
Konkreter Zustand: tatsächliche Implementierung
Beispiel Stapel:
- abstrakter (gedachter) Zustand: Stapel von Elementen
- realer (implementierter) Zustand: Feld + Zählvariable
Stapel
3
2
2
count
int-Variable,
int-Feld
2 3 0 2 7 4
2
elem
Spezifikation
Implementierung
Seite 19
Th Letschert
Datenabstraktion: Abstraktionsfunktion
konkreter Zustand: aktuelle Belegung der Variablen
Abstraktionsfunktion: was (abstrakter Zustand) soll das
bedeuten
Implementierung
Spezifikation
– manche Details der konkreten Zustände (Wertebelegungen)
sind irrelevant (weg-zu-abstrahieren)
Stapel: Feldelemente „hinten“ uninteressant
– manche Zustände (Wertebelegungen) nicht erlaubt
count = 12999 nicht erlaubt
Abstraktionsfunktion
2
3
count
2 3 0 2 7 4
2
2
elems
elem
repräsentiert
abstrakter Zustand (Stapel)
(mit der Variablenbelegung
gemeinter Stapel)
konkreter Zustand (Feld + Variable)
(aktuelle Variablenbelegung)
Seite 20
Th Letschert
Datenabstraktion: Klasseninvariante
Abstraktionsfunktion:
Was bedeutet die Belegung der Variablen
Klasseninvariante:
Welche Belegungen sind erlaubt
class Stack {
....
private:
int count;
int a[10];
// aktuelle Zahl der Elemente
// Ablageplatz fuer die Elemente
// a[0]...a[count-1] sind die gestapelten Elemente,
a[count-1] ist dabei das oberste
// invariant: 0 <= count <= 10
Abstraktionsfunktion: Kommentar zu den
Objektvariablen: was bedeuten sie.
Klasseninvariante: Kommentar zu den erlaubten
Belegungen der Objektvariablen
Seite 21
Th Letschert
Korrektheit einer Implementierung
7
3
push(7)
2
3
2
elems
Spezifikation der Methode:
pre: size(elems)<10
post: elems = x+elems@pre
A
A(s.push(x)) = (A(s)).push(x)
2
push(7)
count
2 3 0 2 7 4
elems
2
Implementierung
der Methode
A
32
count
2 3 70 2 7 4
2
elems
elems
Seite 22
Th Letschert
Datenabstraktion: Spezifikation / Implementierung
Spezifikation und Implementierung einer Datenabstraktion
Spezifikation
abstrakter Zustand
vertragsorientierte Spezifikation der Methoden
Implementierung
Konkreter Zustand: Objektvariablen
mit:
Abstraktionsfunktion
Kommentar: Sinn / Bedeutung der Objektvariablen
Klasseninvariante
Kommentar: legale Belegungen der Objektvariablen
Methoden-Implementierungen
Seite 23
Th Letschert
Herunterladen