Objektorientierte Programmierung

27
Objektorientierte Programmierung Proseminar Programmiersysteme 31.03.2004 Lehrstuhl für Programmiersysteme Prof. Gert Smolka Vortragender: Philipp Brendel Tutor: Andreas Rossberg

description

Objektorientierte Programmierung. Proseminar Programmiersysteme 31.03.2004 Lehrstuhl für Programmiersysteme Prof. Gert Smolka Vortragender: Philipp Brendel Tutor: Andreas Rossberg. Gliederung. Konzepte objektorientierter Programmierung (OOP) Java Smalltalk Diskussion. - PowerPoint PPT Presentation

Transcript of Objektorientierte Programmierung

Page 1: Objektorientierte Programmierung

Objektorientierte Programmierung

Proseminar Programmiersysteme 31.03.2004Lehrstuhl für Programmiersysteme Prof. Gert Smolka

Vortragender: Philipp BrendelTutor: Andreas Rossberg

Page 2: Objektorientierte Programmierung

Gliederung

• Konzepte objektorientierter Programmierung (OOP)

• Java

• Smalltalk

• Diskussion

Page 3: Objektorientierte Programmierung

Konzepte 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“

Page 4: Objektorientierte Programmierung

Konzepte 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

Page 5: Objektorientierte Programmierung

Konzepte der OOP- Ein Beispiel in ML -

• Implementierung eines Zählers mit Prozeduren zur Abfrage (get) und Erhöhung (inc)

• Realisierung durch ProzedurnewCounter : unit -> counterzur Erzeugung neuer Objekte des Typs counter

Page 6: Objektorientierte Programmierung

Konzepte der OOP- Ein Beispiel in ML -

type counter = { get:unit -> int, inc:unit -> unit }

fun newCounter () = letval n = ref 0

in{ get = fn () => !n, inc = fn () => n := !n + 1}

end

> newCounter = fn : unit -> counter

Page 7: Objektorientierte Programmierung

Konzepte 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 ()> val c = {...} : counter- val i = #get(c) ()> val i = 0 : int- #inc(c) ()> val it = () : unit- val j = #get(c) ()> val j = 1 : int

Page 8: Objektorientierte Programmierung

Konzepte der OOP- Ein Beispiel in ML -

• Erweiterung des Zählers um eine Reset-Prozedur:type reset_counter = { get:unit -> int, inc:unit -> unit,

reset:unit -> unit }fun newResetCounter () = let

val n = ref 0 in { get = fn () => !n, inc = fn () => n := !n + 1, reset = fn () => n := 0 } end

Page 9: Objektorientierte Programmierung

Konzepte 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 (c:counter) = #inc(c) () ; #get(c) ()> val f = fn : counter -> int- val (c, c‘) = (newCounter (), newResetCounter())> val c = {...} : counter val c‘ = {...} : reset_counter- f c> val it = 1 : int- f c‘> val it = 1 : int

Page 10: Objektorientierte Programmierung

Konzepte der OOP- Subtyping -

• Ein Typ σ ist ein Subtyp eines Typs τ (σ ≤ τ), wenn in jedem Kontext, der einen Wert des Typs τ erwartet, ein Wert des Typs σ verwendet werden kann

• Subtyping definiert eine Relation ≤ Typ Typ, die folgende Eigenschaften aufweist:– Reflexivität– Transitivität– Antisymmetrie

Die Subtypingrelation ist also eine Teilordnung.

Page 11: Objektorientierte Programmierung

Konzepte der OOP- Subtyping -

• Erweiterung des Typsystems mit Typrelation R um eine Subsumtionsregel, die Subtyping ermöglicht:

RtRt

),(

),,(

Page 12: Objektorientierte Programmierung

Konzepte der OOP- Subtyping -

}{}...{ 111 nn }...{}...,{:},...,1{

11 nn

iini

''''

Regeln für Subtyping von Records:

Regel für Subtyping von Prozeduren:

Page 13: Objektorientierte Programmierung

Java• 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

Page 14: Objektorientierte Programmierung

Java

• Java ist klassenbasiert: Schemata, die die Implementierung von Objekten definieren, heißen Klassen

• Klassen definieren Prozeduren (Methoden) und Daten (Felder oder Instanzvariablen)

Page 15: Objektorientierte Programmierung

Java

• 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

Page 16: Objektorientierte Programmierung

Java• 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)

Page 17: Objektorientierte Programmierung

Java- 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.

Page 18: Objektorientierte Programmierung

Smalltalk

• entwickelt von Xerox PARC in den 1970er Jahren

• Designziele:– simples Konzept– Flexibilität– Betriebssystem des DYNABOOK– von „Nichtprogrammierern“ verwendbar

Page 19: Objektorientierte Programmierung

Smalltalk

• ä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

Page 20: Objektorientierte Programmierung

Smalltalk

• 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

Page 21: Objektorientierte Programmierung

Smalltalk

• 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

Page 22: Objektorientierte Programmierung

Smalltalk- Codebeispiel -

Definition einer Zählerklasse in Smalltalk:Object subclass: #Counter

instanceVariableNames: 'n'

initialise(n = nil) ifTrue: [n 0]

incself initialise.n (n + 1)

getself initialise. n

Page 23: Objektorientierte Programmierung

Smalltalk- 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.

Page 24: Objektorientierte Programmierung

Diskussion- Interessante Aspekte objektorientierter Programmierung -

• Objektmetapher erleichtert Enkapsulierung

• Zerlegung von Problemen ist in OOP „natürlich“

• Wiederverwendbarkeit von Code in verschiedenen

Szenarien

Page 25: Objektorientierte Programmierung

Diskussion- 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

Page 26: Objektorientierte Programmierung

Diskussion

• Binary-Methods-Problem: Im Gegensatz zu prozeduraler Programmierung fällt der Objektzugriff bei OOP einseitig aus:

Point.add(Point q){ return new Point (this.x + q.x, this.y + q.y);}

Page 27: Objektorientierte Programmierung

Literatur

• 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