Title: Objektorientierte Programmierung
1Objektorientierte Programmierung
- Proseminar Programmiersysteme 31.03.2004
- Lehrstuhl für Programmiersysteme Prof. Gert
Smolka - Vortragender Philipp Brendel
- Tutor Andreas Rossberg
2Gliederung
- Konzepte objektorientierter Programmierung (OOP)
- Java
- Smalltalk
- Diskussion
3Konzepte der OOP- Objektbegriff -
- Erste OOP Simula 67
- entwickelt am Norwegian Computing Center um 1960
- dient zur Programmierung ereignisbasierter
Simulationen - erfordet Datenstruktur zur Repräsentation
unterschiedlicher Ereignisse
4Konzepte der OOP- Objektbegriff -
- Ein Objekt vereint Daten und Prozeduren, die auf
diesen Daten operieren, in einem Wert - Eigenschaften, die den meisten klassenbasierten
objektorientierten Programmiersprachen gemein
sind - Enkapsulierung
- Vererbung
- dynamische Bindung
- Subtyping
5Konzepte der OOP- Ein Beispiel in ML -
- Implementierung eines Zählers mit Prozeduren zur
Abfrage (get) und Erhöhung (inc) - Realisierung durch ProzedurnewCounter unit -gt
counterzur Erzeugung neuer Objekte des Typs
counter
6Konzepte der OOP- Ein Beispiel in ML -
- type counter getunit -gt int, incunit -gt
unit - fun newCounter () let
- val n ref 0
- in
-
- get fn () gt !n,
- inc fn () gt n !n 1
-
- end
- gt newCounter fn unit -gt counter
7Konzepte der OOP- Ein Beispiel in ML -
- Enkapsulierung
- Verbergung der Referenz n, die den Zählerstand
enthält - Zugriff auf Zählerstand nur durch offengelegte
Prozeduren- val c newCounter ()gt val c
... counter- val i get(c) ()gt val i 0
int- inc(c) ()gt val it () unit- val j
get(c) ()gt val j 1 int
8Konzepte der OOP- Ein Beispiel in ML -
- Erweiterung des Zählers um eine Reset-Prozedur
- type reset_counter getunit -gt int,
- incunit -gt unit,
- resetunit -gt unit
-
- fun newResetCounter () let
- val n ref 0
- in
-
- get fn () gt !n,
- inc fn () gt n !n 1,
- reset fn () gt n 0
-
- end
9Konzepte der OOP- Ein Beispiel in ML -
- Subtyping Werte vom Typ reset_counter sind
gültige Argumente für Prozeduren, die Werte vom
Typ counter erwarten (in idealisiertem
ML-Dialekt). - Dynamische Bindung Der in einer solchen Prozedur
ausgeführte Code hängt von der Implementierung
des Arguments ab. - - fun f (ccounter) inc(c) () get(c) ()
- gt val f fn counter -gt int
- - val (c, c) (newCounter (),
newResetCounter()) - gt val c ... counter
- val c ... reset_counter
- - f c
- gt val it 1 int
- - f c
- gt val it 1 int
10Konzepte der OOP- Subtyping -
- Ein Typ s ist ein Subtyp eines Typs t (s t),
wenn in jedem Kontext, der einen Wert des Typs t
erwartet, ein Wert des Typs s verwendet werden
kann - Subtyping definiert eine Relation Í Typ Typ,
die folgende Eigenschaften aufweist - Reflexivität
- Transitivität
- Antisymmetrie
- Die Subtypingrelation ist also eine Teilordnung.
11Konzepte der OOP- Subtyping -
- Erweiterung des Typsystems mit Typrelation R um
eine Subsumtionsregel, die Subtyping ermöglicht
12Konzepte der OOP- Subtyping -
Regeln für Subtyping von Records
Regel für Subtyping von Prozeduren
13Java
- Entwickelt von SUN Microsystems um 1990
- Designziele
- Offenheit Klassen werden nach Bedarf zur
Laufzeit geladen (dynamisches Linking),
Objekttypen können zur Laufzeit im- und
exportiert werden - Portabilität Programme werden zu Bytecode
kompiliert und laufen auf einer virtuellen
Maschine - Sicherheit Mechanismen zur Verhinderung von
Sicherheitsverletzungen sind Bestandteil von Java
14Java
- Java ist klassenbasiert Schemata, die die
Implementierung von Objekten definieren, heißen
Klassen - Klassen definieren Prozeduren (Methoden) und
Daten (Felder oder Instanzvariablen)
15Java
- jedes Objekt ist eine Instanz einer Klasse
- instanzerzeugende Prozeduren heißen Konstruktoren
- Enkapsulierung erfolgt durch Zugriffsmodifizierer
(public, private, protected und package), die für
jede Methode und jedes Feld wählbar sind
16Java
- Vererbung Jede Klasse erbt von genau von einer
Oberklasse, deren Code sie weiterverwenden oder
spezialisieren kann - Die Subtypingrelation ist durch die
Vererbungshierarchie gegeben ein Objekt wird als
Instanz aller seiner Oberklassen
betrachtet(Nominelles Subtyping im Gegensatz zum
strukturellen Subtyping des ML-Beispiels)
17Java- Codebeispiel -
- Definition einer Zählerklasse in Java
- class Counter extends Object
- private int n
- public Counter() n 0
- public int get() return n
- public void inc() n n 1
-
- Verwendung der Klasse
- Counter c new Counter()
- int i c.get()
- c.inc()
- int j c.get()
- Am Ende des Beispiels hat i den Wert 0 und j den
Wert 1.
18Smalltalk
- entwickelt von Xerox PARC in den 1970er Jahren
- Designziele
- simples Konzept
- Flexibilität
- Betriebssystem des DYNABOOK
- von Nichtprogrammierern verwendbar
19Smalltalk
- äußerst einfaches und elegantes Konzept Alles
ist ein Objekt - Programme werden ausgeführt, indem sogenannte
Nachrichten an Objekte geschickt werden, die
diese behandeln - äußerst einfache Syntax
20Smalltalk
- Komplexität durch umfangreiche Klassenbibliothek
- Beispiel für konsequente Einhaltung der
Objektmetapher - Klassen sind Objekte, Instantiierung durch Senden
einer Nachricht an Klassenobjekt - Klassen werden durch Senden einer Nachricht an
ein Metaclass-Objekt erzeugt
21Smalltalk
- Enkapsulierung ist fest vorgegeben Methoden sind
öffentlich, Instanzvariablen sind geschützt - Dynamische Typisierung
- Objekte haben die Möglichkeit, individuell auf
unbekannte Nachrichten zu reagieren, indem sie
die Nachricht doesNotUnderstand implementieren
22Smalltalk- Codebeispiel -
- Definition einer Zählerklasse in Smalltalk
- Object subclass Counter
- instanceVariableNames 'n'
- initialise
- (n nil) ifTrue n 0
- inc
- self initialise.
- n (n 1)
- get
- self initialise.
- n
23Smalltalk- Codebeispiel -
- Verwendung der Klasse
- c Counter new.
- i c get.
- c inc.
- j c get.
- Am Ende des Beispiels hat i den Wert 0 und j den
Wert 1.
24Diskussion- Interessante Aspekte
objektorientierter Programmierung -
- Objektmetapher erleichtert Enkapsulierung
- Zerlegung von Problemen ist in OOP natürlich
- Wiederverwendbarkeit von Code in verschiedenen
Szenarien
25Diskussion- Probleme der OOP -
- Mehrfachvererbung
- Was geschieht, wenn dieselbe Methode von mehreren
Oberklassen geerbt werden soll? - Wie geht man vor, wenn zweimal von derselben
Klasse geerbt wird? - Inheritance is not subtyping Subklassen sind
oft keine Subtypen, Beispiel - Klasse Point2D besitzt Methodeboolean equal
(Point2D q) - Klasse Point3D erbt von Point2D und
implementiertboolean equal (Point3D q) - Þ Point3D ist kein Subtyp von Point2D
26Diskussion
- Binary-Methods-Problem Im Gegensatz zu
prozeduraler Programmierung fällt der
Objektzugriff bei OOP einseitig
ausPoint.add(Point q) return new Point
(this.x q.x, this.y q.y)
27Literatur
- John C. Mitchell Concepts in Programming
Languages. Cambridge University Press 2003 - Kim Bruce, Luca Cardelli, Giuseppe Castagna,
Hopkins Objects Group, Gary T. Leavens, Benjamin
Pierce On Binary Methods, Theory And Practice of
Object Systems. - Richard P. Gabriel, Objects Have Failed, OOPSLA
Debate 2002 - William Cook, Walter Hill, Peter Canning,
Inheritance Is Not Subtyping. Principles of
Programming Languages (POPL) 1990