Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "Objektorientierte Programmierung Proseminar Programmiersysteme 31.03.2004 Lehrstuhl für Programmiersysteme Prof. Gert Smolka Vortragender: Philipp Brendel."—  Präsentation transkript:

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

2 Gliederung Konzepte objektorientierter Programmierung (OOP) Java Smalltalk Diskussion

3 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

4 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

5 Konzepte der OOP - Ein Beispiel in ML - Implementierung eines Zählers mit Prozeduren zur Abfrage ( get ) und Erhöhung ( inc ) Realisierung durch Prozedur newCounter : unit -> counter zur Erzeugung neuer Objekte des Typs counter

6 Konzepte der OOP - Ein Beispiel in ML - type counter = { get:unit -> int, inc:unit -> unit } fun newCounter () = let val n = ref 0 in { get = fn () => !n, inc = fn () => n := !n + 1 } end > newCounter = fn : unit -> counter

7 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

8 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

9 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

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

11 Konzepte der OOP - Subtyping - Erweiterung des Typsystems mit Typrelation R um eine Subsumtionsregel, die Subtyping ermöglicht:

12 Konzepte der OOP - Subtyping - Regeln für Subtyping von Records: Regel für Subtyping von Prozeduren:

13 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

14 Java Java ist klassenbasiert: Schemata, die die Implementierung von Objekten definieren, heißen Klassen Klassen definieren Prozeduren (Methoden) und Daten (Felder oder Instanzvariablen)

15 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

16 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)

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

18 Smalltalk entwickelt von Xerox PARC in den 1970er Jahren Designziele: –simples Konzept –Flexibilität –Betriebssystem des DYNABOOK –von Nichtprogrammierern verwendbar

19 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

20 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

21 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

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

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

24 Diskussion - Interessante Aspekte objektorientierter Programmierung - Objektmetapher erleichtert Enkapsulierung Zerlegung von Problemen ist in OOP natürlich Wiederverwendbarkeit von Code in verschiedenen Szenarien

25 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 Methode boolean equal (Point2D q) –Klasse Point3D erbt von Point2D und implementiert boolean equal (Point3D q) Point3D ist kein Subtyp von Point2D

26 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); }

27 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


Herunterladen ppt "Objektorientierte Programmierung Proseminar Programmiersysteme 31.03.2004 Lehrstuhl für Programmiersysteme Prof. Gert Smolka Vortragender: Philipp Brendel."

Ähnliche Präsentationen


Google-Anzeigen