-
Erinnerungsprotokoll
Mündliche Prüfung Kurs 01814 „Objektorientierte
Programmierung“
30 Minuten, 27.04.2015, Prof. Steimann
Zu Beginn ließ mich Prof. Steimann einfach reden. Er meinte
hinterher, dass Ziel davon sei, die
Nervosität zu nehmen. So kann das Vorbereitete vorgetragen
werden. Ich hatte versucht von
Objektorientierung allgemein zum Polymorphismus überzuleiten.
Etwa so:
- Objekt
- Objektgeflecht
- Objekteigenschaften
- Nachrichten
- Variablen
- Referenzen
- Klassen
- Arten der Objekterzeugung
- Typen und Abgrenzung zu den Klassen
- Substitution (als Inklusionspolymorphie)
- Einfacher parametrischer Polymorphismus
An der Stelle wurde ich unterbrochen und der Prof. stelle noch
ein paar Fragen.
- Aussagen und Bedingungen des Liskov-Substitutionsprinzips. Was
sind die Voraussetzungen
und warum macht man das und wo sind die Grenzen / Probleme?
- Wann tritt eine ArrayStoreException auf? Folge aus dem Liskov
Substitutionsprinzip
- Warum macht man parametrischen Polymorphismus? um statische
Typprüfung auch bei
Collections durchführen zu können.
- Was ist ein Alias?
- Was ist das Aliasing Problem?
Mir persönlich gefällt dieses freie Reden nicht so sehr. Das
beantwortet von vorne herein leider nicht
die Frage, wie genau und wie tief man auf die einzelnen
Stichworte eingehen soll. Eine konkrete
Frage hätte mir da mehr geholfen. Aber auch so ist es etwas
geworden. Im Großen Ganzen kann ich
damit den vorhergehenden Protokollen also kaum noch etwas
hinzufügen. Nur nochmal betonen:
Bereitet eine freie Rede vor.
-
Prüfungsprotokoll 01814 – Objektorientierte Programmierung
Prüfer: Prof. Dr. SteimannTermin: Juni 2014Note: 1,7
Ich konnte zu Beginn einen kleinen Vortrag halten, bei dem ich
auf die Konzepte Objekte, Nachrichten, Klassenbildung,
Generalisierung-Spezialisierung mit Rechteck-Quadrat-Problem und
seiner Lösung durch ein Interface, auf das Fragile-Base-Class
Problem, sowie auf Probleme Bezug genommen habe, die im
Zusammenhang mit Super- und Subtypen im Typsystem einer OO Sprache
stehen.
Zur Typisierung habe ich noch Zuweisungskorrektheit erwähnt, die
Interface-als-Typ Möglichkeit sowie das Ko- und
Kontravarianzproblem. Dabei war ich auf das nominale Subtyping von
Java gekommen und Prof. Steimann fragte nach, ob das im
Zusammenhang mit Javas Forderung nach Novarianz stünde (steht es
nicht, da Novarianz in Java dadurch zustande kommt, dass Methoden
nur mit gleichem Namen und gleichen Parametern sowie Parametertypen
redefiniert = überschrieben werden können).
Anschließend folgte noch die Frage nach beschränktem
parametrischen Polymorphismus, nach Aliasing und Kapselung und was
man dagegen tun könne (Objekte kopieren !) sowie nach Wildcards,
was ich nicht im Detail ausführen konnte. Ebenso hatte ich mich
etwas verheddert bei der Frage nach Laufzeit-Relevanz bei Javas
Entscheidung, die Zuweisung von Arrays von Objekten, die vom Subtyp
eines Supertypen sind, an Arrays von Objekten des Supertypen
zuzulassen, also nicht statisch zu monieren.
Herr Prof. Steimann hat intensiv und mir zugewendet zugehört.
Man spürt, dass er versteht, wovonman spricht, was auch mal gut tut
;-). Frau Dr. Keller hat, so war mein Eindruck, wohlwollend
Protokoll geführt und mir vorher geholfen, mein Lampenfieber zu
reduzieren. Die Gestaltung der Prüfung durch Prof. Steimann empfand
ich als sehr unaufgesetzt, so dass es wirklich ein Gesprächund
keine Abfragesituation war und der Situation als Prüfung die
Schärfe nahm. Mit der Note bin ich sehr zufrieden.
-
Kurs: Objektorientierte Programmierung
Kursnummer: 1814
Prüfer: Prof. Dr. Steimann
Beisitzerin: Dr. Keller
Note: 1,0
Vorbereitung:
Zur Vorbereitung habe ich das Skript viele Male gelesen, die
Einsendeaufgaben bearbeitet, den
Studientag besucht, die Zusammenfassung von Michael Paap
durchgelesen, mir eine eigene
Zusammenfassung des Kurses beschrieben und das zum Kurs passende
Seminar „Objektorientierung
und Friends“ belegt.
Beginn:
Zu Beginn der Prüfung wurde ich freundlich hereingebeten und
begrüßt. Fr. Keller prüfte kurz den
Personalausweis und dann ging es auch schon mit der typischen
Frage, was ich über objektorientierte
Programmierung erzählen kann, los.
Weiterer Verlauf:
Ich erzählte über das objektorientierte Weltbild, in dem es
Objekte gibt, die jeweils andere Objekte
kennen und mit ihnen durch Nachrichtenversand interagieren.
Objekte sind dabei entweder atomar
oder aus anderen zusammengesetzt. Des Weiteren haben Objekte
Eigenschaften, d.h. ein
bestimmtes Verhalten und gewisse Attribute, die sie
kennzeichnen. Diese Attribute können entweder
fest (unveränderliche Objekte) oder variable (veränderliche
Objekte) sein. Bei Objekte mit
veränderlichen Attributen gibt es Zustände. Zwei Objekte gelten
als gleich, wenn sie sich im aktuellen
Zustand gleichen. Gleichheit bedeutet aber nicht Identität, denn
ein Objekt ist nur identisch zu sich
selber.
Nach kurzem Überlegen, was ich noch erzählen könnte (Hr.
Steimann unterbrach die paar Sekunden
Pause nicht), erzählte ich noch, dass wir Objekte benennen
können. Dazu nehmen wir Variablen.
Dabei kommt es darauf an, ob wir Variablen mit Wert- oder
Referenzsemantik haben. Bei
Wertsemantik werden Objekte bei Zuweisung kopiert, bei
Referenzsemantik wird nur auf Objekte
verwiesen. Abgrenzen muss von dieser Unterscheidung die
Unterscheidung von Call-by-Value und
Call-by-Reference beim Methodenaufruf. Call-by-Value übergibt
bei Wertsemantik den Wert, bei
Referenzsemantik eine Kopie des Zeigers (der ja Wert der
Variable ist).
Dann ging ich auf das Aliasing-Problem bei Referenzsemantik ein.
Hierzu führte ich das Beispiel der
Ampel an.
Nach wieder ein paar Sekunden Denkpause brachte ich noch die
dynamische Bindung an, indem ich
erklärte, dass Objekte auf Nachrichten durch implementierte
Methoden reagieren und pro Nachricht
aber jedem Objekt unterschiedliche Implementierungen zugeordnet
sein können (versteckte
Fallunterscheidung).
Zu den Beziehungen zwischen Objekten fügte ich noch an, dass
diese über Zwischenobjekte
modelliert werden. Als Alternative nannte ich noch die
indizierten Instanzvariablen in Smalltalk unter
Nennung des Problems, dass diese nur eine unbenannte indizierte
Menge darstellen.
-
Wieder grübelte ich ein paar Sekunden, was ich noch erzählen
könnte und bot dann an zu den
Klassen überzugehen. Hr. Steimann stimmte zu, so dass ich
erklärte, dass Klassen Vorlagen für
Objekte sind, die Instanzvariablen und Instanzmethoden samt
Implementierung für Instanzen
beinhalten. Dann erklärte ich, dass die Klasse ein
Allgemeinbegriff ist und eigentlich durch
Klassifizierung gebildet wird. Darüber kam ich dann auf die
Generalisierung und grenzte ab, dass
Klassifizierung von konkreten Objekten auf eine Abstraktion
vorgenommen wird, während
Generalisierung zwischen Abstraktionen besteht. Über die
Spezialisierung wechselte ich dann relativ
zügig auf die Vererbung. Dort grenzte ich ab, dass sich die
Vererbung eher auf die Intension bezieht,
während die Spezialisierung auf die Wertebereiche abzielt und
die Extension der Spezialisierung eine
Teilmenge der Extension der Generalisierung sein muss.
„Hm, was kann man denn noch so über Klassen erzählen?“ murmelte
ich Nachdenklich, woraufhin
mir Hr. Steimann mit der Frage „Wie hängen denn Klassen und
Typen zusammen?“ half den Bogen zu
den Typen zu finden.
Ich erklärte, dass Typen eine Schnittstelle der Klasse angeben
und ihren Wertebereich festlegen. Da
das so etwas ungenau formuliert war, versuchte ich die
Typisierung der Variablen mit den
Invarianten zu erklären. Dazu wollte ich dann
Zuweisungskompatibilität, Typerweiterung und
Typeinschränkung darstellen und bin dabei in Richtung
Substituierbarkeit geschwommen, wo ich
meinen roten Faden verlor, als ich erklären wollte, warum
Parametertypen in überschreibenden
Methoden nur kontravariant definiert werden dürfen. Hr. Steimann
versuchte durch Fragen wie „um
welche Methoden geht es genau?“ genauso wie Fr. Keller mit der
Frage „Sie wollten gerade zum
Liskov Substitutionsprinzip hin, oder?“ mir wieder auf den Weg
zu helfen. Dies gelang dann zum
Glück auch, so dass ich mich noch verbessern konnte und dann die
Kriterien erklärte, die Liskov
aufgestelt hat.
Im Blick auf die fortschreitende Zeit bat mich Hr. Steimann noch
den parametrischen
Polymorphismus zu erklären, fragte dazu, wofür man
Wildcard-Typen benötigt und auf welche Art
(schreibender und lesender Zugriff war gemeint), auf die Typen
zugegriffen werden können.
Anschließend bat mich Hr. Steimann kurz während der Beratung
außen zu warten.
Als mich Hr. Steimann wieder hereinbat, teilte er mit, dass er
die Leistung als „sehr gut“ beurteilt und
erkundigte sich noch kurz nach meinem derzeitigen Beruf und
schloss somit die Prüfung durch etwas
Smalltalk ab.
Wie bereits viele vor mir, kann ich Hr. Steimann als Prüfer
empfehlen. An die Art des langen freien
Vortragens in der mündlichen Prüfung, muss sich mancher
(zumindest ich) sicher erst gewöhnen. So
kam ich öfter ins Grübeln, was ich denn noch erzählen könnte.
Das vorher mehrere Male geübt zu
haben, half dabei auch nicht weiter. Wer ein photographisches
Gedächtnis hat, sollte sich auf
jedenfall eine Mindmap einprägen, die ihn von einem Begriff zum
nächsten leitet, dann weiß man
bestimmt, was man als nächstes erzählen kann.
Was die Bewertung angeht, finde ich Hr. Steimann sehr fair. Ich
hätte durchaus auch einen Abzug
wegen meines Hängers bei den kontravarianten Methodenparametern
verstehen können und bin
froh, dass er diesen nicht so negativ bewertet hat.
-
Im Gesamten finde ich den Kurs sehr interessant und bin der
Meinung, dass jeder objektorientierte
Programmierer sich mit den dargestellten Vertiefungen
beschäftigten sollte. Auch wenn Smalltalk
meines Erachtens nicht die schönste Sprache ist, um mit ihr
tagtäglich zu arbeiten, so ist sie doch ein
interessanter Blick in die Grundkonzepte der objektorientierten
Programmierung und meines
Erachtens dafür sehr gut gewählt. Für meinen persönlichen
Geschmack ist Java zu breit im Kurs
aufgestellt, da es (bis auf die Wildcards) themenmäßig von C#
deutlich überlagert, zumal es dort
erweiterte Konzepte, wie z.B. explizite Interfaceimplementierung
gibt. EIFFEL war mir für die
Komplexität, die dahinter steht, etwas zu knapp formuliert, hier
empfehle ich fürs Verständnis
weitere Literatur heranzuziehen. Ergänzend zum 1814 empfehle ich
auch den 1853. Dieser enthält
wichtige Themen der objektorientierten Programmierung in der
Programmierpraxis und stellt
insbesondere interfacebasierte Programmierung und Entwurfsmuster
detailliert dar. Diese beiden
Themen erleichtern einem Programmierer den Alltag erheblich und
würden sich damit auch als
Praxiskapitel im 1814 anbieten (evtl. als Ergänzung zum
objektorientierten Stil, der in 1814 sehr kurz
gehalten ist)
-
01814 Objektorientierte Programmierung
Prüfer: Prof. Steimann
Beisitzer: Frau Dr. Keller
Datum: 28.03.2014
Vorbereitung:
Vor der Prüfung habe ich mir zu jeder Kurseinheit (KE) kleinere
Zusammenfassungen mit Power Point
erstellt. Jede Zusammenfassung umfasste 15 bis 45 Folien.
Kurseinheit 4 und 5 habe ich relativ knapp
gehalten, da mir Java, C# und C++ dem Grunde nach vertraut waren
und ich aus vorangegangenen
Protokollen nicht den Eindruck hatte, dass diese Kapitel nicht
zentraler Prüfungsbestandteil waren.
Zudem habe ich mir einen kleinen Vortrag zum Thema OOP überlegt,
weil offensichtlich jede Prüfung
damit beginnt, dass man selber eine Einführung in das Thema
gibt. Hier habe ich mich auf KE 1
beschränkt.
Übungsaufgaben habe ich während des Semesters nicht
bearbeitet.
Prüfungsablauf:
Die Prüfung lief erwartungskonform ab: Zunächst habe ich ca. 7
Minuten eine allgemeine Einführung
zu OOP gegeben. Dann sollte ich noch was zur Vererbung sagen
(Abgrenzungen zur
Generalisierung/Spezialisierung habe ich gezogen, Intension und
Extension). Prof. Steimann ist dann
auf das Subtyping gekommen. Hier habe ich zunächst die Idee und
die Themen
Inklusionspolymorphie und parametrischen Polymorphismus
erläutert. Beim parametrischen
Polymorphismus bis ich noch auf die Wildcardtypen in Java
eingegangen. Dabei habe ich die
Wildcardtypen wohl zum Teil mit beschränktem parametrischen
Polymorphismus in Java etwas
durcheinander gebracht. Am Ende sollte ich noch was zu den
Problemen der OOP sagen. Hier habe
ich die Themen Aliasing, Fragile Baseclass Problem und mangelnde
Skalierbarkeit angesprochen. Bei
letztem Thema konnte ich noch einen kleinen Bogen zu Kurs 1798
(Softwarearchitektur) schlagen.
Ende der Prüfung:
Trotz meines Wacklers beim parametrischen Polymorphismus habe
ich eine 1,0 erhalten, was mich
natürlich sehr gefreut hat. Nach der Prüfung haben wir noch über
meine beruflichen Erfahrungen im
Bereich Softwareentwicklung gesprochen, was ich sehr sympathisch
fand.
Fazit:
Der Kurs war wirklich sehr interessant, weil er das Thema OOP
mal von einer neutralen Seite
beleuchtet. Die Smalltalksyntax der Beispiele im Kurstext ist
sicherlich etwas gewöhnungsbedürftig,
aber Smalltalk ist nicht wirklich schwer zu verstehen.
Prof. Steimann kann man auf jeden Fall als Dozenten und Prüfer
uneingeschränkt weiterempfehlen!
Viel Erfolg!
-
Prüfungsprotokoll
Prüfer: Prof. Dr. SteimannSemester der Prüfung: WS 13/14Datum
der Prüfung: 12.03.2014Dauer: 15-20 MinutenNote: 1.0
Was ist OOP?Hier habe ich folgende Definition geliefert:
OOP ist eine Art zu programmieren, bei der das zugrunde liegende
Weltbild das von Objekten ist, die jeweils eine Identität haben,
sich gegenseitig Nachrichten schicken und in Reaktion auf die
Nachrichten Anweisungen ausführen, die in Methoden stehen und den
Zustand des Objekts ändern. Die Eigenschaften eines Objekts sagen
aus, welche Nachrichten es versteht.
Anschließend habe ich die einzelnen Begriffe erklärt:– Was ist
ein Objekt?– Gleichheit und Identität von Objekten– Was sind
Variablen?– Referenz- und Wertsemantik– Was ist eine Zuweisung–
Explizite und implizite Zuweisung– Aliasing– Vor- und Nachteil von
Aliasing– Lebenszyklus von Objekten– Beziehungen (:1- und
:n-Beziehung)– Zustand eines Objekts– Methoden– Call by value (Hier
noch erklärt, wie man trotzdem den Zustand eines Objektes ändern
kann,
aber nicht den Inhalt der Variable) und Call by reference–
Dynamisches Binden und Statisches Binden
Das alles hat ungefähr 5-7 Minuten gedauert, dann hat Herr
Steimann gemeint, dass er zu Typen wechseln möchte.
Was ist ein Typ?Ein Typ schränkt den möglichen Wertebereich von
deklarierten Elementen ein. Ein Typ ist die Grundlage von einem
Typsystem
Danach habe ich die Gründe aufgezählt, warum ein Typsystem
verwendet werden sollte:
– Regelt Speicher-Layout (Speicherplatz anhand vom Typ
reservieren)– erlaubt effiziente Ausführung eines Programms
(Operationen anhand vom Typ optimieren)– Erhöht die Lesbarkeit
eines Programms– automatisches Finden von logischen Fehlern in
einem Programm
Anschließend bin ich auf Subtypen zu sprechen gekommen und habe
erklärt, was ein Subtyp, was Subtyping und was die Kontra- und
Kovarianz bei redefinierten Methoden im Subtyp ist.
Dann habe ich nachgefragt ob ich etwas zum parametrischen
Polymorphismus erzählen soll. Nach einem „Fahren Sie ruhig fort“
fing ich an dies zu erklären.
-
Parametrische Typdefinition unterscheidet sich zur normalen
dadurch, dass in der Definition verwendete andere Typen durch
Platzhalter ersetzt werden können. Diese Platzhalter heißen
Typvariablen. Erst bei der Verwendung wird der parametrische Typ
instanziiert. Die Idee ist dabei, dass durch die parametrische
Typdefinition aus einer Typdefinition beliebig viele gemacht werden
können. Sie werden auch als generische Typen bzw. Generics
bezeichnet.Beim parametrischen Polymorphismus werden die
Subtypenbeziehungen seiner aktuellen Typparameter NICHT auf die
durch Instanziierung erzeugten Typen übertragen.
Den beschränkten parametrischen Polymorphismus habe ich dann
auch noch kurz erklärt.
Es können Beschränkungen des Wertebereichs einer Typvariable
durchgeführt werden, sodass Typvariablen nur Subtypen (und den Typ
selber) eines bestimmtes Typen annehmen können. Es wird eine obere
Schranke gesetzt
Gibt es den parametrischen Polymorphismus auch in C++?
Da ich keine Ahnung hatte sagte ich „Tut mir Leid, aber das weiß
ich nicht, da ich bisher nur mit Java programmiert habe. Aber ich
schätze schon, da C++ ein Typsystem verwendet“.Herr Steimann
erklärte mir anschließend den parametrischen Polymorphismus in C++
und es ging weiter zu den Wildcards in Java.
Was sind Wildcards?
Wildcards sind abstrakte Typen, die Supertyp aller konkreten
Instanziierungen einer Typvariable sind. Sie ermöglichen das
Subtyping in den Generics.Dann habe ich noch erwähnt, dass man mit
Wildcards obere (lesende Zugriff ist sicher) und untere Schränke
(schreibender Zugriff ist sicher) realisieren kann und nachgefragt,
ob ich das genauer erklären soll. Herr Steimann nickte und ich fing
an genauer zu erklären.
Was ist das Fragile-base-class-Problem?
Es kann der problematische Fall auftreten, dass Anpassungen an
einer Basisklasse zu unerwartetem Verhalten von abgeleiteten
Klassen führen. Dabei ist nicht unbedingt die Basisklasse als
zerbrechende Klasse anzusehen, sondern die Klassen, die von ihr
erben. Es besteht kein klar definierter Vertrag zwischen den
Klassen einer Vererbungshierarchie. Man bräuchte ein explizites
Vererbungsinterface, das z.B. festlegt, welche Methoden in der
Subklasse überschrieben werden dürfen. Auch durch explizites
kennzeichnen von Methoden (in Java mit dem Schlüsselwort „open“)
kann gesagt werden, ob dynamisches Binden bei dieser Methode von
außen ausgeführt werden soll oder nicht.
Danach war die Prüfung zu Ende. Ich musste draußen warten bis
meine Note entschieden wurde und wurde dann wieder in den
Prüfungsraum geholt. Mir wurde die Note gesagt und anschließend
erfolgte noch ein bisschen Smalltalk ( nicht die Programmiersprache
;-) ).
Fazit:
Ich war am Anfang ziemlich nervös, aber das verging als ich dann
das Reden angefangen hab. Herr Steimann wirkte ein wenig
gelangweilt während der Prüfung, lasst Euch da nicht verunsichern.
Frau Keller sitzt ebenfalls im Prüfungsraum und macht sich Notizen
zu dem was Ihr erzählt. Ich habe immer wieder zur ihr geschaut, da
Sie bei richtigen Antworten gelächelt und genickt hat.
-
Prüfungsprotokoll der mündlichen Prüfung Objektorientierte
Programmierung 1814 (Master Informatik)
Prüfer: Prof. Dr. SteimannSemester der Prüfung: WS 12/13Datum
der Prüfung: 28.05.2013Dauer: ca. 25 minNote: 1.0 Hier sind
sicherlich nicht alle Fragen, jedoch ein großer Teil. Die Antworten
waren bei der Prüfung natürlich sehr viel ausführlicher.
Was ist objektorientierte Programmierung (Wie immer) ?-> Habe
mich mit Hilfe des ersten Kapitels und Wikipedia auf diese Frage
vorbereitet und ca. 5 min frei Vorgetragen.
Was gibt es für Beziehungen zwischen Objekten ?-> Die
Beziehungen ":1" und ":n" können mit Instanzvariablen und
Zwischenobjekten hergestellt werden. Die Aggregation und die
Komposition sind ohne weiteres erstmal nicht möglich. Die
Komposition kann allerdings mittels Repräsentationsobjekten mit
Wertsemantik realisert werden.Hier bin ich dann auf das Problem der
Kapselung eingegangen (Alias Protection).
Was ist der Unterschied zwischen einer Variable mit Wert- und
Referenzsemantik ?-> Referenzsemantik: Im Variablenspeicher ist
eine Referenz auf ein Objekt im Objektspeicher-> Wertsemantik:
Das Objekt ist direkt im Variablenspeicher abgelegt
Was gibt es für Probleme mit der Wertsemantik in Bezug auf das
Subtyping ? -> Hier habe ich zuerst das Subtyping beschrieben.
Wenn S Subtyp von T, kann dort wo eine Variable vom Typ T erwartet
wird, eine Variable vom Typ S eingesetzt werden, da S den
Wertebereich von T erweitert. Variablen vom Typ T müssen also
Objekte vom Typ S aufnehmen können. Bei der Referenzsemanitk ist
das kein Problem, aber bei der Wertsemantik reicht der Speicher
nicht aus.
Was ist das Problem der Substituierbarkeit ?->
Substituierbarkeit erläutert und Substitutionsprinzip von Liskov
vorgestellt.
Was ist der Vorteil vom beschränktem parametrischen
Polymorphismus ?-> Kurz den parametrischen Polymorphismus
erklärt:
-Typvariable in Typdefinition-Verminderung von "Down-Casts"
ausserhalb des generischen Typs-Statische Typprüfung kann
durchgeführt werden.
Danach die Vorteile von der Beschränkung:-Wertebereich von
Typvariable wird durch eine obere Schranke beschränkt-"Innerhalb"
des generischen Typs kann nun ein gewisses Verhalten vom Typ
vorrausgesetzt
werden und "Down-Casts" werden auch hier vermindert-Statische
Typprüfung kann auch hier durchgeführt werden.
Wofür benötigt man Wildcards ?-> Leider gibt es bei
generischen Typen keine Subtypbeziehnung. Also: Wenn S Subtyp von T
ist, ist ArrayList kein Subtyp von ArrayList. Um die Möglichkeiten
des Subtyping trotzem zu
-
nutzen, können in Java Wildcards verwendet werden. Gibt es in
Java bei Arrays Subtypenbeziehungen ?-> Ja. Aufgrund der
Flexibilität. Hier wird bei einer ungültigen Zuweisung eines
Arrayelements eine "ArrayStoreException" geworfen. Bei den
generischen Typen hat man sich aber dagegen entschieden
Was ist das Fragile-Base-Class-Problem ?-> Familie von
Problemen in Verbindung mit der Vererbung.Hier habe ich gesagt,
dass nicht die Basisklasse "zerbricht", sondern die erbende
Klasse.Diese verlässt sich auf Implementationsdetails der
Superklasse.Beispiel aus dem Kurstext mit TapeArchive und Methode
add (offene Rekursion).Lösung ist z.B. solch eine Methode explizit
zu markieren oder ein Vererbungsinterface.
Zur Prüfung: Prof. Dr. Steimann ist ein netter Prüfer. Die
Prüfung war sehr angenehm und hatte Unterhaltungscharakter. Ich bin
mit dem Ablauf vollkommen zufrieden und empfehle den Kurs
uneingeschränkt weiter.
Viel Glück bei eurer Prüfung !
-
Prüfung OOP 19.3.2013 bei Prof. Steimann
Note 1
Ein Horror vor der Prüfung: die wurde eine halbe Stunde nach
hinten verschoben und dann fing die
doch um elf an!
Die Prüfung startete mit der Frage, was ist OOP
Ich habe daraufhin erklärt, das die Programmausführung als
System koopreriender Objekte
verstanden wird. Darauf erklärt, was Objekte sind. Auch was das
heisst, dass nämlich Speicherplatz
und auch Wert- und Referenzsemantik erklärt. Und darauf
hingewiesen, dass nicht alle Objekte
Eigenschaften haben, etwa 1 oder a.
Dann habe ich weiter ausgeholt und Beziehungen erklärt, mit dem
Beispiel von Zwischenobjekten
aus dem Lehrtext.
Als weiteren Punkt der OOP hab ich die Vererbung eingeführt mit
dem Beispiel von Tier und Pferd
(ich hab eines) und die Vorteile von Vererbung rsp.
Generalisierung und Spezialisierung. Ich hab das
Prinzip erklärt und den Missbrauch der Vererbung zum Vererben
von Code. Irgendwann hab ich auch
das Fragile-base-class-Problem angesprochen und betont, dass es
nicht die Base-classe ist, die das
Problem hat.
Damit hab ich übergeleitet und erwähnt, dass anstelle von
Superklasse, Subklasse auch oft von
Subtyping geredet wird.
Erst hab ich da ausgeführt, warum wir überhaupt typisieren
wollen und meine Erfa mit Java erwähnt.
Also erst statische Sicherheit, dann die Lesbarkeit und mich so
durchgehandelt durch die Gründe,
welche ich warum als wichtiger erachte und wo ich weniger Erfa
habe
Dann konnte ich mein Beispiel vom Pferd wieder anwenden und hab
erklärt wie das läuft, mit den
Vor- und Nachbedingungen von Parametern in Methoden und dass
dann mein Pferd letztlich Fleisch
fressen sollte, was es nicht tut. Und in diesem Zusammenhang
Kontra- und Kovarianz.
Ich hab dann noch dynamische Bindung als weiteres OOP-merkmal
aufgeführt und dann war ich erst
mal ausgeschossen.
Prof. Steimann hat mich dann nach parametrischem Polymorshismus
gefragt und ich hab die
Collections erwähnt und die Dictionaries, aber gleich weiter
geleitet zur Unsicherheit, die dann
immer noch besteht, wenn ich etwa sortieren oder summieren will,
und gleich die Möglichkeiten des
beschränkten parametrischen Polymorphismus aufgeführt.
Prof. Steimann wollte dann wissen, ob es auch untere Schranken
gibt. Ich hab dann die Lösung von
den EA4 zitiert, wo es ein Beispiel für P mit unterer Schranke
und Wildcards gibt und aufgeführt, dass
das umgekehrt auch mit
-
Letztlich bin ich bei dieser Frage geschwommen, weil meine Erfa
ja nur aus dem Bachelor an der
FernUni kommt und ich sonst nicht programmiere. Prof. Steimann
hat mir sicher noch eine andere
Frage gestellt, die ich nicht beantworten konnte. Genau weil
Attribute statisch sind etwa. Und ich
denke, ich hab noch eine weiter Frage nicht korrekt antworten
können
Aber trotzdem: ich hab eine 1 gekriegt und ich war absolut
begeistert!
Meine Erfa heute sagt das Folgende: ich konnte noch nie
irgendetwas auswendig lernen und das
braucht es auch nicht. Es braucht nur das Verständnis, worum es
letzlich geht und das in eigene
Worte zu fassen. Ich hab in der Prüfung immer wieder meine
persönlichen Erfas erwähnt, wieso ich
etwas wie verstehe und warum. Ich denke darum geht es. Den
Kurstext konnte ich kaum in der
vorgegebenen Zeit lesen. Der war zu umfangreich. Aber der
Studientag hat mir unheimlich geholfen.
Bei meinen Ausführungen habe ich dann oft erst am Schluss noch
kurz angemerkt, welche Konzepte
dahinter stehen, etwa das LSP. Ich denke, das ist einfach mein
Denkprinzip. Ich gehöre nicht zu
denen, die einen Container bauen und dann erklären, ich erkläre
zuerst und nenne dann am Schluss
den Container, weil; Deutsch ist nicht meine Muttersprache.
-
Kurs: Objektorientierte Programmierung (1814)
Prüfer: Prof. Steimann
Datum: 31.10.2012
Note: 1,0
Prüfungsverlauf:
→ Was ist OOP?
Hier habe ich die Definition aus dem Vorwort wiedergegeben: OOP
ist eine Art zu
Programmieren, bei der das zugrundeliegende Weltbild das von
Objekten ist, die eine
Identität haben, sich Nachrichten schicken, auf diese mit
Methoden reagieren. Sie haben
einen Zustand und Eigenschaften und Objekte stehen untereinander
in Beziehungen.
→ Welche Arten von Beziehungen zwischen Objekten gibt es?
Geantwortet habe ich mit 1:1 und 1:n Beziehung und versuchte
zuerklären was das ist. Mir
ist der Begriff Zwischenobjekt nicht eingefallen und ich war der
festen Überzeugung der
Begriff beginne mit „Meta....“. Als ich einfach nicht darauf kam
hat Prof. Steimann den
Begriff Zwischenobjekt genannt und ist zur nächsten Frage
übergegangen.
→ Warum heißen diese im Skript nur :1 und :n und nicht 1:1 oder
1:n?
Auch hier stan dich erstmal etwas auf dem Schlauch, da mich die
vorherige Frage aus dem
Konzept gebracht hatte. Prof. Steimann gab dann den Tipp, dass
ja auch mehrere Objekte
mit einem anderen in Verbindung stehen können und ich begann das
Aliasing zu erklären.
→ Referenzsemantik/Wertsemantik
Über das Aliasing kamen wir zu Referenzsemantik und
Wertsemantik. Kurz erklärt was
beides ist und die Probleme aufgezählt.
→ Welche Beziehungen zwischen Klassen gibt es?
Subklassenbeziehung benannt und erklärt.
→ Was ist der Unterschied zwischen Vererbung und
Generalisierung/Spezialisierung?
Vererbung dient hauptsächlich der Wiederverwendung von Code,
Generalisierung/Spezialisierung ist der Blick von außen auf das
System und versucht eine
Ordnung aufzubauen.
→ Was ist „besser“ und warum?
→ Unterschied Typen / Klassen?
→ Welche Anforderungen gibt es an die Substituierbarkeit?
Die Regeln des Livskovschen Substitutions Prinzip aufgezählt,
und erwähnt dass die letzten
beiden Regeln (in der Reihenfolge des Skriptes) die anderen
implizieren.
→ Warum implizieren die letzten 2 Regeln die anderen?
Fordert man, dass die Vorbedingung des Supertyps die des Subtyps
implizieren, dann
bedeutet dass, dass die Vorbeding nur aufgeweicht werden darf.
Das ist dann der Fall wenn
der Eingabeparameter nur kontravariant also zu einem Supertyp
hin verändert wird, weil
man dadurch mehr Werte zulässt. (Analoges gilt für die
Rückrichtung bei den
Nachbedingungen)
-
→ Unterschiede Inklusionspolymorphie und parametrisierter
Polymorphismus?
→ Beschränkter parametrisierter Polymorphismus?
Nur untere Schranke möglich
→ Wildcards – was, wozu, Vorteile?
Subtyping von parametrisierten Typen, obere und untere Schranke,
lesender/schreibender
Zugriff.
→ Problem der mangelnden Kapselung?
Nochmal auf Aliasing eingegangen und Problem erklärt.
Teilweise sind mir meine Antworten schon wieder entfallen, die
Prüfung ist schon ein paar Tage her,
und ich will hier keine falschen Antworten aufschreiben ;-)
-
Prüfungsprotokoll in OOP (1814)
Mündliche Prüfung in Hagen im Juni 2012, sehr gut, Dauer:
25minuten:
Vorbemerkung: Zur Vorbereitung auf die Prüfung habe ich mich in
den Kurstext intensiv
eingearbeitet, alle Kapitel durchgelesen, alle theoretischen
Prüfungen durchgemacht, die Notizen
von Michael Paap durchgelesen(aus dem Studientag, sehr zu
empfehlen), und einige
Programmierbeispiele von ihm geschaut, alle Fragen der
Prüfungsprotokollen durchgearbeitet und
den Newsgroup oft benutzt bei Unklarheiten.
Prüfung:
- Was ist OOP?
- Referenzsemantik was ist das?
o Ermöglicht das Erzeugen von wachsenden Objekten
- Warum wachsende Objekte?
o Wegen dem Subtyping. Beim Kopieren eines Subtyps in einen
Supertyp kann der
Subtyp mehr Platz gebrauchen, z.B. wenn der Subtyp mehrere
Methoden oder
Attribute besitzt. Hat man Wertsemantik bei der
Supertyp-Variable kann der Subtyp
nicht ohne Datenverlust in die Supertyp-Variable reinkopiert
werden, mit
Referenzsemantik hat man dieses Problem nicht. (Wichtige
Frage)
- Warum Wertsemantik?
o In einer Kompositionsbeziehung muss vermieden werden, dass die
Teil nach außen
verändert werden können, d.h. diese sollen keine Aliase nach
aussen haben. Dafür
kann man Wertsemantik verwendet, da man mit Variable, die
Wertesemantik haben,
keine Alias erzeugen kann.
- Was ist, wenn die Programmiersprache keine Wertsemantik hat?
(wichtige Frage)
o Bei Erzeugen der Teilobjekte immer „Kopie“ machen, in
Smalltalk mit „copy“, in Java
eine Kopie Routine benutzen oder selbst implementieren.
- Warum verwendet man den einfachen parametrisierten
Polymorphismus
o Zur Vermeidung von „Down-Cast“.
- Warum der beschränkte parametrisierte Polymorphismus?
o Typparameter ist innerhalb der Typdefinition umbekannt. Man
möchte oft
parametrisierten Typen definieren, die z.B. nur für INT und
Float sind, um zu
vermeiden, dass ein String bei der Instanziierung des
Typparameter verwendet wird,
setzt man Schranken ein.
- Gibt es bei dem beschränkten parametrisierten Polymorphismus
eine untere Schranke?
o Nein, nur obere Schranke (wichtige Frage)
-
o Bei Wildcards gibt es beides obere und untere Schranke
- Was ist Wildcards
o Ermöglicht Subtyping bei parametrisierten Typen. Man möchte
nämlich oft
Methoden wie sort(liste) schreiben, die als Parameter eine Liste
von
parametrisierten Collection übergeben bekommt, der Typarameter
beliebig
ausgewählt werden soll. Ohne Wildcard geht es nicht, mit
Wildcards geht es
(wichtige Frage)
- Was bedeutet Schreiben und Lesen bei Wildcards
o Bitte diese Fragen genau anschauen, kommt fast immer (am
besten Newsgroup für
bessere Erklärung)
Obwohl ich ein erfahrener Programmierer bin, habe ich beim Lesen
diesen Kurs gemerkt, dass ich
vieles aus der Welt der OOP nicht wusste. Der Kurs hat meinen
Programmierstil verbessert und mir
neue Wege in die Welt geöffnet. Heute kenne ich besser, was eine
Programmiersprache kann, und
was sie nicht kann, für welche Projekte man sie einsetzen soll,
und für welche nicht.
Der Kurs und die Prüfung sind zu empfehlen.
Nehmen Sie sich am besten Zeit, um den Kurs genau anzuschauen.
Viel Glück!!
-
Gedächtnisprotokoll: Objektorientierte Programmierung (1814,
Stand WS 11/12)
Zeitpunkt der Prüfung: Mai 2012Prüfer: Prof. Dr.
SteimannBeisitzerin: Frau Dr. KellerNote: nicht bestanden
Vorbemerkung:Ich habe mich bemüht, die Prüfung möglichst so
wieder zu geben, wie sie tatsächlich war. Ich möchte aber darauf
hinweisen, dass man Dinge manchmal anders wahrnimmt, als Sie in
Wirklichkeit sind. Besonders dann, wenn man an einer Situation
direkt und intensiv beteiligt ist.
Prüfungsumgebung:Beim Betreten des Zimmers wurde ich von Prüfer
und Beisitzerin freundlich und höflich empfangen. Ich war ein wenig
irritiert, dass der Prüfer mehrere Meter weit, an einem anderen
Ende seines Schreibtisches saß, als die Prüfung unverhofft begann.
Ich reagierte daher überrascht auf die erste Frage.
Prüfungshergang: Freies Sprechen (gefühlte 15 Minuten)Als erstes
wurde ich gefragt, was Objektorientierte Programmierung ist (oder
so etwas ähnliches). Ich erklärte die Abgrenzung zur prozeduralen
Programmierung, das Weltbild der OOP und die Vorteile der OOP. Die
Abgrenzung und das Weltbild habe ich zunächst in meinen eigenen
Worten beschrieben und dann jeweils noch ein ganz kurzes Beispiel
genannt. Als Vorteil der OOP nannte ich die intuitive Sprache und
die Flexibilität durch dynamisches Binden und Wiederverwendung von
Code.
Da ich gerade in Fahrt kam und ich aus anderen Protokollen
entnommen hatte, dass der Prüfer ohnehin keine Mine verzieht, ließ
ich mich nicht beirren und holte weiter aus:
Ich sagte, was ich unter einem Objekt verstehe: Wird durch
Literal repräsentiert, kann Integer sein, aber auch Klasse.
Aufgrund der verschiedenen Größen gibt es neben Wertsemantik auch
Referenzsemantik. (wieder kurz in eigenen Worten erklärt, was das
überhaupt heißt).
Weiter machte ich damit, dass Objekte Nachrichten verstehen
können und dann Methoden aufrufen. Ich erklärte was Unäre, Binäre
und Schlüsselwortnachrichten sind (inkl. kurzem Beispiel) und dass
die einen vor den anderen Ausgeführt werden.
Dann sagte ich, dass eine Nachricht unterschiedliche Objekte als
Eingeberparameter annehmen könne und merkte an, dass dies
Polymorphie sei (So hatte ich das sicherlich nicht formuliert:
Meine Aussage war wörtlich wahrscheinlich näher an: „Eine Nachricht
versteht verschiedene Objekte“, oder „Eine Nachricht kann
verschiedene Objekte bekommen“, was natürlich von der Formulierung
her falsch ist.
Ich wollte dann Polymorphie erklären, ruderte zunächst aber
nochmal zurück, um zu erklären was Typen sind. Erklärte dann aber
zuerst noch Klassen. An meine Erklärungen zu Klassen und Typen
erinnere ich mich leider nicht mehr. Diese waren wahrscheinlich
dementsprechend schlecht. Ich hatte jedenfalls vergessen etwas über
Intension und Extension zu sagen.
Nun war ich froh, endlich mit Polymorphie weiter machen zu
können. Ein Thema, welches mir gut gefällt und ich ja bereits
mehrmals in der Prüfung angesprochen hatte. Ich begann mit ad
hoc
1/4
-
Polymorphie und Überladen. Ich erklärte ein wenig was das sei
und sagte, dass dies streng genommen keine Polymorphie sei, weil
die Methoden speziell darauf programmiert wurden, bestimmte
unterschiedliche Objekte anzunehmen. Wenn ich mich recht entsinne,
warf ich eine Erklärung von Polymorphie zwischendurch ein:
„Polymorphie bedeutet, dass eine Methode etwas mit einem Objekt
anfangen kann, für die die Methode ursprünglich nicht gedacht war.
Beispielsweise um Code einzusparen.“
Prüfungshergang: Fragen beantworten (gefühlte 5 Minuten)Ich
wollte noch einen Satz zu Überladen sagen, als mich der Prüfer zum
ersten mal unterbrach: Ich sollte doch gleich zur richtigen
Polymorphie kommen. Bis dahin hatte ich ungefähr 15 Minuten frei
gesprochen.
Also sagte ich, dass es Inklusionspolymorphie gibt, was das
gleiche wie Suptyping sei. Es ging ungefähr so weiter: „Subtyping
bedeutet, dass man einer Methode ein Objekt übergeben kann, welches
Subtyp von dem ist, was die Methode erwartet. Das ist natürlich
praktisch, wenn es eine Subklasse gibt, von der der Prgrammierer
vorher noch nichts wusste.“ Irgendwie hatte ich auch die Ko- und
Kontravarianz erwähnt.
Der Prüfer wurde ungeduldig: „Was ist denn jetzt Subtyping“. Ich
war Verwirrt und stutzte, setzte dann nochmal an: „Wenn eine
Methode als Eingabeparameter einen Typ T annimmt, dann nimmt er
auch einen Eingabeparameter S an, wenn S Subtyp von T ist.“
Prüfer:„Wie genau ist denn Subtyping definiert?“ „Ich dachte, dass
das, was ich gerade gesagt habe, die Definition ist, ist es
nicht?“.
Prof. Steinmann nannte dann eine Definition, welche weniger
mathematisch klang. In meinen Ohren war die Aussage aber die selbe.
Leider erinnere ich mich nicht an seine Definition. Meine ist aber
anscheinend nicht zufriedenstellend gewesen.
Er fragte nach parametrischer Polymorphie, was mir gelegen kam,
weil es auch das nächste gewesen wäre, was ich angesprochen hätte:
„Parametrische Polymorphie ist, wenn eine Methode einen generischen
Typ hat, sodass sie mit jedem beliebigen Objekt arbeiten kann. Bei
beschränkter Polymorphie werden Bedingungen an diesen Typ
gestellt.“
Prüfungsabbruch:Als Reaktion darauf sagte Prof. Steimann
teilnahmslos: „Wir können die Prüfung dann abbrechen.“. Gefühlt
waren die 25 Minuten nicht um, andererseits konnte ich mir nicht
vorstellen, dass ich eine 1.0 bekomme. Daher konnte ich mir den
Abbruch zunächst nicht erklären. Man kann jemanden schließlich
nicht 15 Minuten lang frei reden lassen um ihn dann nach zwei
Fragen zu ein und dem selben Thema durchfallen zu lassen. Dachte
ich zumindest...
Ich fragte die Beisitzerin, ob die Zeit schon um wäre. Die
Verneinung zusammen mit dem betroffenen Blick gaben meinen
Befürchtungen Gewissheit. Ich stand auf, um Prüfer und Beisitzerin
die Gelegenheit zu geben, ungestört über meine Leistung zu
sprechen. „Sie können Ihre Sachen gleich mitnehmen“ schallte es vom
anderen Ende des Schreibtisches. Verstört ging ich zu meinen
Sachen. Auf dem Weg konnte ich mir noch folgendes anhören: „Sie
haben ja nichts auf den Punkt gebracht. Sie schwimmen von einem
Thema zum anderen und sagen nicht, worauf es ankommt. Und mit einer
4 ist Ihnen ja auch nicht geholfen.“ Eingestehen erwiderte ich,
während ich bereits am Packen war: „Es ist schwer zu wissen, worauf
es ankommt, wenn man nie jemanden über das Thema sprechen
hört.“
2/4
-
Frau Keller bat mich dann hilfsbereit, mich nochmals zu setzten.
Die Stimmung war plötzlich eine ganz andere: Sie fragte mich
verständnisvoll, wie ich mich auf die Prüfung vorbereitet hatte und
Prof. Steimann interessierte sich für meinen vorherigen Studiengang
und meinen Beruf.
Prof Steimann gab mir den Rat, zuerst richtig Programmieren zu
lernen, indem ich das Fachpraktikum mache, bevor ich die Prüfung in
OOP wiederhole. Diesen Rat gab er mir, da ich in meinem Bachelor
Studiengang nur sporadisch und in meinem Beruf gar nicht
programmiert habe.
Frau Keller gab mir den Rat, die Prüfung mit jemandem zu üben.
Aus Scham hatte ich nicht gesagt, dass ich dies getan hatte. Ich
erwiderte, dass dadurch die Antworten zwar flüssiger, aber nicht
richtiger wären und dass meine Antworten ja offensichtlich falsch
gewesen wären, weil ich sonst nicht durchgefallen wäre. Da sie
wusste, dass ich bei den Studientagen war, sagte Sie mir nur, dass
ich so vortragen solle, wie es Herr Paap getan hätte. Damit kann
ich leider nach wie vor nichts anfangen, da Herr Paap zwei Tage zum
Referieren hat, wären man in der Prüfung nur 25 Minuten hat.
Prüfungsvorbereitung:Meine Vorbereitungen auf die Prüfung
konzentrierten sich fast ausschließlich auf den theoretischen Teil
der Vorlesung. Ich habe das Skript gelernt und war bei den
Studientagen. Außerdem habe ich die aktuellsten Prüfungsprotokolle
angeschaut um mich über den Prüfungsstil und die
Prüfungsschwerpunkte zu informieren. Zu guter Letzt habe ich mich
noch rund 6 Stunden mit einem befreundeten Informatiker über das
Thema unterhalten.Einen Richtigen Vortrag hatte ich nicht
vorbereitet und nicht geübt. Ich hatte mir allerdings genau
überlegt, welche Themen interessant sind und was zu welchem Thema
gesagt werden sollte.Intensive Programmiererfahrung habe ich weder
aus meinem Bachelor Studiengang, noch aus meinem Beruf. Die
Übungsaufgaben habe ich nicht gelöst; habe aber mit Smalltalk herum
gespielt.
Vortragsstil:Grundsätzlich war ich schon immer schlecht in
mündlichen Prüfungen. Ich verspreche mich viel, vergesse gerne
etwas wichtiges zu sagen und rudere dann zurück. Denkpausen
benötige ich auch. Die Aussagen in diesem Prüfungsprotokoll sind
daher auch nur sinngemäß das, was ich sagen wollte. Es ist nicht
auszuschließen, dass die eine oder andere Aussage noch „falscher“
war, als ich es hier dargestellt habe.
Hinzu kommt, dass dies meine erste mündliche Prüfung in dem
Fachbereich Informatik war. Dennoch behaupte ich, dass die Sequenz
meiner Aussagen aufeinander aufbauen und immer ein roter Faden da
ist, an dem man sich orientieren kann. Um in der begrenzten Zeit
möglichst viele Themen anzusprechen, blieb entsprechend wenig Zeit
für jedes Thema. Auf Nachfrage hätte ich jedes Thema gerne
vertieft.
Meine Tipps- Die Prüfungstage habe ich als sehr lehr- und
hilfreich empfunden.- Es ist sehr gefährlich, Themen in eigenen
Worten zu erklären. Wenn die Erklärung nicht auf den Punkt gebracht
ist, wird das negativ bewertet.- Prof. Steimann fragt nicht nach,
wenn man etwas schlecht, falsch oder unzureichend formuliert. Er
lässt einen einfach weiter reden und fordert einen nicht auf, sich
zu verbessern. Das spiegelt sich dann in der Benotung wieder.-
Vorsicht jedoch mit Beispielen aus der realen Welt. Diese scheinen
uninteressant zu sein. Lieber Definitionen als Beispiele bringen.-
Es wurde mir explizit gesagt, dass das Paradigma und das Weltbild
der OOP uninteressant sind.
3/4
-
Achtung: Dies steht in Widerspruch zu der Einschätzung aus einem
Prüfungsprotokoll vom März 2012 (Note 1).- Es ist in jedem Fall
nützlich, einen Vortrag über OOP vorzubereiten und zu üben. Mein
Schwerpunkt lag eher darauf, möglichst viel zu wissen und auf
möglichst jede Detailfrage eine grobe Antwort zu haben. Das war ein
Fehler! Eine Antwort, die nicht genau vorbereitet wurde, ist meiner
Einschätzung nach nichts wert. Außerdem werden anscheinend keine
expliziten Fragen gestellt (Das lag vielleicht auch daran, dass mir
nichts zugetraut wurde).- Die Fragen, die mir gestellt wurden,
waren keine Detailfragen. Es waren Fragen, die eines der
Hauptthemen ansprachen. Hier empfiehlt es sich, das angesprochene
Thema präzise zu definieren. Wenn man das nicht macht, bringt alles
Detailwissen nichts.
Kontakt:Ich freue mich über Fragen zur Prüfung: Randoomango bei
Googlemail.com.Auch wenn ich den Rat von Prof. Steimann beherzige
und die Prüfung nicht umgehend wiederhole, möchte ich sie
irgendwann bestehen. Daher rede ich gerne über die Prüfung und
freue mich auch über Tipps.
Viel Glück!
4/4
-
Prüfungsprotokoll
30. März 2012
Kurs 01814 - Objektorientierte Programmierung
Lehrgebiet Programmiersysteme
Prof. Dr. Friedrich Steimann
Prof. Steimann beginnt mit der Frage, was denn die
objektorientierte Programmierung sei.
Darauf begann ich, die wichtigsten Grundbegriffe der
Objektorientierung zu erläutern (Objekte,
Identität/Gleichheit, Referenz-/Wertsemantik, Beziehungen,
Objektzustand, Methoden, Nachrichten,
Call by Value/Call by Reference).
Bei der Erläuterung von Call by Value hat Prof. Steimann mich
unterbrochen und nachgefragt, ob es
denn in Java vollkommen unmöglich sei, in einer Methode ein
außenstehendes Objekt zu
manipulieren. Ich habe dann erläutert, dass es davon abhängt, ob
der entsprechende aktuelle
Parameter Wert- oder Referenzsemantik hat.
Anschließend habe ich meinen Vortrag mit der Unterscheidung
zwischen klassenbasierter und
prototypenbasierter Objektorientierung fortgesetzt. Danach habe
ich kurz auf die Problematik der
Metaklassen hingewiesen.
Weiterhin wollte Prof. Steimann etwas über Generalisierung und
Spezialisierung hören. Zu erklären
war hier die Problematik mit Quadrat und Rechteck. Insbesondere
die Abgrenzung zur Vererbung, bei
der der Fokus auf Reuse von Code liegt, war gefordert.
Prof. Steimann ist von alleine auf das Thema der Typsysteme
gekommen und hat die Begriffe
Typfehler, Typkorrektheit und Typprüfung in den Vordergrund
gestellt. Anschließend sollte ich ein
Beispiel für die Verwendung von beschränktem parametrischem
Polymorphismus nennen.
Die vorletzte Frage von Prof. Steimann zielte auf die Verwendung
von Wildcard-Typen ab.
Abschließend habe ich das Problem der mangelnden Kapselung
erläutert.
Die Prüfung wurde mit 1,0 bewertet.
Prof. Steimann ist ein sehr freundlicher und aufgeschlossener
Prüfer und möchte den Studenten
keineswegs „auf die falsche Fährte“ führen. Ich bin mit dem
Ablauf der Prüfung vollkommen
zufrieden und empfehle den Kurs 01814 und das Lehrgebiet
Programmiersysteme uneingeschränkt
weiter
-
Gedächtnisprotokoll in Objektorientierte Programmierung
(01814)Mündliche Prüfung in Hagen im März 2012 // Note: 1,0 //
Dauer: 20 Minuten
Vorbemerkung: Der Kurstext wurde im WS 06/07 neu geschrieben.
Die vorher verfassten Prüfungsprotokolle und Klausuren taugen daher
nur sehr eingeschränkt zur Prüfungsvorbereitung. Außerdem wurden
verschiedene Passagen auch seit dieser Neufassung umgeschrieben,
weshalb man sich auch auf die nachfolgenden Protokolle nicht zu
100% verlassen kann; man sollte sich zur Vorbereitung daher im
Zweifel auf die neueren Fassungen verlassen. Die zwei Aufsätze, die
in früheren Versionen zum Skript zusätzlich Pflichtlektüre waren,
sind nun auch in den Kurstext eingearbeitet. Die Themen der
Aufsätze (verhaltensbasiertes Subtyping, Alias Protection) sind
aber nach wie vor zentrale Diskussionspunkte in vielen
Prüfungen.
Für die mündliche Prüfung sollte man sich auf vergleichsweise
sehr offene Fragen gefasst machen. Das hat mich während der Prüfung
ein wenig nervös gemacht, da ich den Blicken nicht entnehmen
konnte, ob ich denn auf das Richtige hinaus gehe. In meiner Note
hat sich diese vereinzelte Unsicherheit aber nicht widergespiegelt.
Es ist aber in jedem Fall angebracht, zu jedem der zentralen Themen
frei erzählen zu können.
Die Prüfung beginnt dazu wohl immer mit der Frage: 'Was ist
objektorientierte Programmierung?'. Dabei ist einem Detailgrad und
Richtung der Antwort sehr offen gelassen. Wer hier ausschweifend
antwortet, hat mit Glück einen Großteil der Prüfung bereits hinter
sich; eine entsprechend gute Einübung eines Exposés zu dieser
Antwort lohnt sich also. Die Antwort sollte sich in jedem Fall
vordergründig auf das unterliegende Weltbild beziehen, so wie es in
KE0 – dem Vorwort – geschildert wird. (Was mich ein wenig wundert,
ist dass überspezifische Antworten anderer Gedächtnisprotokolle,
die sich z.B. auf Klassen, Subtypenbeziehung und das dynamisches
Binden konzentrieren, auch als richtig gewertet werden. Meines
Erachtens sind dies zwar typische, aber keinesfalls notwendige
Eigenschaften objektorientierter Programmierung. C++ kann bspw. mit
komplett statischem Binden genutzt werden, Smalltalk hat überhaupt
kein Typsystem. Bei der ergänzenden Darstellung solcher Aspekte
wäre ich in meiner genauen Wortwahl deshalb vorsichtig.)
Die Fragen meiner Prüfung:• Was ist objektorientierte
Programmierung?
Hier habe ich betont, dass objektorientierte Programmierung eine
Art zu Programmieren ist, die sich auf das Weltbild der
Objektorientierung bezieht (also ein Paradigma). Das Weltbild habe
ich wie im Vorkurs beschrieben erklärt, als bestehend aus
Entitäten, die wir Objekte nennen mit einer individuellen Identität
und einem Zustand, die zueinander in Verbindung stehen können und
die sich aneinander Nachrichten schicken, wodurch sie (alleinig)
ihren Zustand ändern können. Dadurch entsteht ein Objektgeflecht,
dass in der objektorientierten Programmierung die Bedeutung des
Programmes charakterisiert. Als alternative Anwendung des
objektorientierten Weltbildes habe ich die Softwarekonzeption
(mittels bspw. UML) und die mathematische Spieltheorie genannt.
• Was verstehen Sie unter Vererbung?Einen Mechanismus zur
Mehrfachnutzung von Implementierungen zwischen Klassen.
(Klassenbasierte Objektorientierung kurz erläutert.)
• Warum war man „damals“ so begeistert von dieser
Möglichkeit?Weil es die Wiederverwendung von Software stark
fördert.
• Was ist aber der Nachteil?Die starke Koppelung zwischen
Basisklasse und erbender Klasse, die den Entwicklern oft nicht mal
bewusst ist, insbesondere falls die Implementierung der Basisklasse
dem Weiterentwickler unbekannt ist: Entwickler stellt oft implizite
Anforderungen an das Verhalten der Basisklasse, die der Entwickler
dieser Basisklasse in späteren Versionen nicht mehr einhält;
insbesondere gefährlich im Zusammenhang mit dem dynamischen Binden.
Als
-
Fragile-Base-Class-Problem benannt.• Was für eine andere
Möglichkeit der Strukturierung von Klassen gibt es?
Generalisierung/Spezialisierung als inhaltliche ausgerichtete
Hierarchisierung in Bezug auf Intension und Extension der Klassen,
wobei deren Bedeutung eine Rolle spielt und die Implementierung nur
im Hintergrund steht.
• Was der beiden Möglichkeiten ist dann die bessere Art der
Hierarchisierung?Kommt darauf an; wenn ich Klassen intern nutzen
will, um mir Schreibarbeit zu ersparen, aber die Vererbung nach
Außen verbergen will, dann ist reine Vererbung durchaus eine
legitime Möglichkeit; z.B. das private Vererben in C++.
Grundsätzlich ist Generalisierung zur Programmgliederung vor allem
nach Außen aber die „richtigere“ Variante, insbesondere, da sich
bei reiner Übertragung von Implementierungen Klassen inhaltlich
schnell „auseinander entwickeln“ können.
• Was ist ein anderer Grund?Hier wusste ich nicht, worauf der
Prüfer hinaus wollte und fragte ihn danach.
• Stichwort: Typen.Erläutert, dass Klassen gerne als Typen
genutzt werden und diese zwei inhaltlich verschiedenen Konzepte mit
einer ähnlichen äußeren Form nur konform sind, wenn die
Klassenhierarchie als Generalisierungshierarchie gegliedert ist. In
dem Zusammenhang auch das Subtyping erläutert.
• Was ist parametrischer Polymorphismus?Konzept mit Typvariablen
erläutert.
• Was ist beschränkter parametrischer Polymorphismus?Problem der
Unsicherheit innerhalb der Typendefinition bezüglich der Variablen
erläutert. Obere Typschranke wird gesetzt, um minimale Invariante
festzulegen.
• Wie fuktioniert Subtyping im parametrischem
Polymorphismus?Kommt auf die Sprache an: In Java nur mit Wildcards,
in Scala zum Beispiel aber ko- oder kontravariant in den Typen der
Typparameter, in Eiffel kovariant. (Scala nicht im Kurstext sondern
aus Eigenerfahrung.)
• Was sind in Java diese Wildcards?Erlauben ein Subtyping bei
zur Übersetzungszeit unbekannten Typparametern. Repräsentieren dazu
einen abstakten Datentypen, der im Kontrast zu parametrischen Typen
ohne Wildcard als Supertyp von parametrischen Objekten auftreten
kann. Das aber mit der Einschränkung, dass nur lesend (Rückgabetyp)
oder schreibender Zugriff (Parametertypen) gleichzeitig ermöglicht
werden, da nur entweder ein „Minimaltyp“ oder ein „Maximaltyp“
festgelegt sein können.
• Gibt es in C++ prametrischen Polymorphismus?Wusste ich nicht
genau, aber vermutete ja. Habe dann beigefügt, dass ich nicht in
C++ entwickle, sondern in Java und Scala. Herr Steinmann erklärte
mir daraufhin, dass es das in C++ tatsächlich eigentlich nicht
gibt, der Compiler aber zur Übersetzungszeit die Templates jeweils
mit ihrer Belegung auflöst und daraufhin bei Nutzung des Templates
an der jeweiligen Programmstelle einen Fehler findet, nicht aber
bei dessen eigentlicher Übersetzung.
• Wie funktioniert das in Java oder Scala?Kurz Typeerasure
erläutert.
Abschließend sagte Herr Steinmann, dass er keine Notwendigkeit
mehr sieht mich weiter zu fragen, da ich mich offensichtlich gut
vorbereitet habe. Nach der Notenverkündung habe ich mich noch eine
gute Weile mit Herrn Steinmann über verschiedene Themen der
Informatik unterhalten, wobei er mir im Verlauf auch prompt ein
Thema für die Masterarbeit angeboten hat. (Ich hatte bereits eines,
gefreut hat es mich trotzdem.)
Ich kann den Prüfer empfehlen, möchte aber noch ein paar
kritische Worte zum Kurs verlieren. Die
-
positiven Aspekte kommen hier natürlich zu kurz, was nicht
heißen soll, dass es diese nicht gibt. Der Kurs hat mir viel
gebracht, aber gelobt wurde auch in den anderen Prüfungsprotokollen
viel. Hier daher ein paar Aspekte, die für die Entscheidung zur
Belegung vielleicht eine Rolle spielen:
1. Der Kurstext ist sehr prosaisch formuliert und manchmal
musste ich als deutscher Muttersprachler tatsächlich sehr lange
Sätze umschreiben, um sie zu verstehen. Den Stil empfand ich zu
Beginn zwar sehr erfrischend, aber bald darauf begann ich mir einen
prägnanteren Ausdruck zu wünschen. Das fand ich im Verlauf des
Semesters ein wenig frustrierend. Zentrale Begriffe und
Erkenntnisse sollten daher im Idealfall künftig kenntlicher
angezeigt werden, da diese wegen des prosaischen Stils schnell
zwischen den wortgewaltigen Erklärungen verschwinden.
2. Die Struktur des Textes könnte teils auch geordneter sein,
insbesondere in KE3 fand ich es stellenweise schwierig
nachzuvollziehen, welche Begriffe nun logisch zusammenhängen, da
Konzepte mitunter auch verstreut über verschiedene Unterabschnitte
gemischt mit anderen Konzepten eingeführt werden. Als
symptomatisches Beispiel möchte ich die Reihenfolge der Erläuterung
von Typeinschränkung/-erweiterung und
Zuweisungskompatibilität/-konformität erwähnen. Das liegt zwar so
gesehen auf der Hand, geht aus dem Text aber nicht eindeutig und
offensichtlich hervor. Ähnliches gilt für die Zusammengehörigkeit
von Klassifikation/Instanzierung und
Generalisierung/Spezialisierung. Auch das hätte ich eigentlich
sogar bereits vor Bearbeiten des Kurses so in Zusammenhang
gebracht; wurde in diesem Wissen durch den Kurstext aber eher
wieder verunsichert, da dort die klare Ankündigung dieser
Zusammenhänge und die wechselseitige Ankündigung nie vor Augen
gehalten wurde.
3. Die „geschlechtsneutrale Sprache“, die sich grundsätzlich auf
die weibliche Form bezieht („Einer Leserin fällt sicher auf, dass
(…) Daher kann sie sehen, dass (...)“). Jedes Mal musste ich wieder
kurz rätseln, wer denn nun mit „sie“ gemeint sein soll. Das ist
sicher nett gemeint, reißt aber regelmäßig aus dem Lesefluss. Da
würde ich das pädagogische Ziel gerne voranstellen.
4. Die Längen der Kurseinheiten sind leider unausgeglichen. Die
Seitenzahl nimmt von Kapitel zu Kapitel ab; die Inhaltsdichte ist
in KE2, KE3 und KE6 aber sicher am höchsten. Das macht auch das
konstante Mitlernen über das Semester schwieriger, da man sich alle
14 Tage erneut auf den zu leistenden Aufwand einstellen muss.
5. Die Übungsaufgaben und eigentlich auch der Kurstext
versteifen sich zu oft auf eigentlich irrelevante Detailaspekte von
Smalltalk oder Java, die mit dem eigentlichen Kursziel – dem Lehren
von objektorientierten Konzepten – eigentlich nichts weiter zu tun
haben. Das könnte man meines Erachtens gerne zurückfahren, um
stattdessen den eigentlichen Inhalten mehr Raum zu bieten. Gerade
die Einsendeaufgaben taugen auf Grund dessen leider eigentlich
nicht zur Vorbereitung auf die mündliche Prüfung (mehr für die
schriftliche), da deren Schwierigkeit eigentlich immer
Implementierungsdetails betreffen. Die Aufarbeitung der
theoretischen Konzepte kommt dort hingegen leider oft zu kurz.
6. Gleichzeitig hat mir eine Diskussion von wichtigen Punkten
gefehlt, über die ich lieber gelesen hätte statt über Java und
Smalltalk wie z.B.: Ein Ausblick zur Integration funktionaler
Programmierung in objektorientierte Sprachen, wie viele moderne
Sprachen die künftige Entwicklung bereits andeuten (in KE6
zumindest kurz angesprochen, gerade weil diese Closures ja
eigentlich über ihren „home context“ Methoden abbilden, wie an
Smalltalk eigentlich schön veranschaulichbar; meine Empfehlung ist
auch: Java zusammenkürzen, Scala ins Skript!); eine Diskussion von
Vererbungsstrategien und Zwischenlösungen zu Einfach- und
Mehrfachvererbung wie Traits und Mixins (das Fehler dieser Konzepte
ist meiner Meinung nach wichtigster Grund zum „Missbrauch“ der
Vererbung: Wieder empfehle ich Scala!); verschiedene Strategien zur
Verwaltung von Objekten in der Garbage Collection, vielleicht auch
im Kontrast zum expliziten Speichermanagement; genauere Diskussion
von parametrischem Polymorphismus und den unterliegenden Strategien
mit Vor- und Nachteilen wie Type Expansion, Type Erasure oder der
Template-Ansatz von C++.
-
Gedächtnisprotokoll: Kurs 1814 Objektorientierte Programmierung
WS11/12
Datum: 09.03.2012Note: 1.3Prüfer: Prof. Dr. Steimann;
Beisitzerin Fr. Dr. Keller
Vorbereitung: Skript gelesen, alle Übungsaufgaben bearbeitet und
eingeschickt. Zu jedem Kapitel die Wichtigsten Definitionen und
Sachverhalte stichpunktartig herausgearbeitet und diese mit den
bereits existierenden Prüfungsprotokolle abgeglichen.
Prüfung: freundliche Atmosphäre; Prüfung hatte normalen
Gesprächscharakter.Was ist objektorientierte Programmierung?Was
unterscheidet SMALLTALK von Java?Sind Klassen auch Objekte?Welche
Beziehungen gibt es zwischen Objekten?Wie werden Beziehungen
ausgedrückt?Welche Arten von Beziehungen gibt es?Wie wird die
Komposition in den Programmiersprachen C++, C# und Eiffel
umgesetzt?Was ist ein Typ?Was heißt typisiert?Welche Gründe gibt es
für Typisierung?Was sind statische und dynamische Typprüfungen?Was
ist Zuweisungskompatibilität?Wo können Laufzeitfehler in Java
auftreten?Was sind und wozu dienen der einfache und beschränkte
parametrische Polymorphismus?Was sind Wildcards und wozu werden
diese benötigt?Was ist Substituierbarkeit und welche Bedingungen
werden daran geknüpft?
Fazit: Uneingeschränkte Empfehlung für den Prüfer. Man sollte
die Stoffmenge nicht unterschätzen und sich genügend Freiraum
schaffen (mind. 1 Woche Vorbereitungszeit einplanen)
-
Prüfungsprotokoll zur mündlichen Fachprüfung
Kurs: 01814 - Objektorientierte ProgrammierungPrüfer: Prof Dr.
F. Steimann Beisitzer: Dr. Keller
Datum: 09.03.2012 Note: 1,0
Herr Prof. Steimann fragte: Was ist Objektorientierte
Programmierung?Ich bot an mit einer Abgrenzung zur prozeduralen
Programmierung zu beginnen.
Folgende Themen wurden dann von mir in einer Art Vortrag
erläutert:
• Objekte• Identität vs. Gleichheit• Aliasing• Wertsemantik vs.
Verweis- oder Referenzsemantik• Call by value vs. Call by
reference• Klassen• Vererbung• Abstrakte Klassen• Typen• Typen vs.
Klassen• Subtyping• Statische vs. Dynamische Bindung
Hiernach fragte Herr Prof. Steimann nach Polymorphie, und ich
erläuterte folgende Punkte• Polymorphie• parametrischer
Polymorphismus• beschränkter parametrischer Polymorphismus
Hierauf wurde nach WildCardTypen gefragt, und ich erläuterte
Wildcards mit oberer und unterer Schranke, sowie mit beiden.
Hiernach sprach ich noch einige Probleme der OOP an1. Das
Problem der Substituierbarkeit (Liskov-Substitutions-Problem)
Hier wurde konkreter nach Kontra- und Kovarianz gefragt2. Das
Fragile-base-class-Problem3. Das Problem der schlechten
Tracebarkeit4. Das Problem der eindimensionalen Strukturierung5.
Das Problem der mangelnden Kapselung
Die Prüfung verlief in einer ruhigen, angenehmen Atmosphäre.
Herr Prof. Steimann lies mich erzählen und fragte nur an 2 Stellen
nach, wahrscheinlich um festzustellen, ob das Problem nur gelernt
oder verstanden wurde.Herr Prof. Steimann ist als Prüfer sehr zu
empfehlen (01853 hatte ich auch bei ihm die Fachprüfung).Als
Prüfungvorbereitung diente der sehr gute Studientag durch Herrn
Paap und die von mir erstellte, nachfolgend beigefügte
Lernunterlage.
1
-
01814 Objektorientierte Programmierung
prozedurale Programmiersprachen
klare Trennung zwischen• Modellierung von Informationen•
Modellierung der Verarbeitung
OOP
• Analogie zu Gegenständen der materiellen Welt•
Programmausführung als System kooperierender Objekte• Objekte
verfügen über Fähigkeit, auf Nachrichten zu reagieren,
durch Zustandsänderung und/oder Auskunft über diesen geben •
Objekte
• haben Zustand (Attribut), Identität und Lebensdauer• können
Nachrichten verarbeiten, durch Methodenausführung• sind
selbständige aktive Einheiten, können unabhängig und parallel
agieren
(Inhärente Parallelität des OO-Paradigmas) • bilden Einheit aus
Daten und darauf definierten Operationen• Schnittstelle beschreibt
Interaktionsmöglichkeiten,
Katalog der Methoden = Protokoll• über Referenzen ansprechbar
(mehrere Referenzen auf dasselbe Objekt = Aliase)
Identität vs. Gleichheit
Zwei Objekte können zwar gleich, aber nie dasselbe sein, oder es
sind nicht zwei Objekte, sondern eins!
Aliasing
• Mehrere Referenzen auf dasselbe Objekt = Alias• Änderung über
einen Alias ändert das Objekt• Sichtbarkeit typischerweise auf
Ebene der Variablen geregelt, nicht auf der der Objekte.
Bsp. Entry-Objekte
2
-
Wertsemantik vs. Verweis- oder Referenzsemantik
• Wertsemantik – Variable enthält direkt den Wert, z.B. Java
Primitivtypen• Verweis- oder Referenzsemantik – Variable enthält
Referenz auf Objekt• Referenzsemantik wegen wachsender Objekte +
Subtyping (wie viel Platz?)
Wertsemantik• Java: Zeichen, Zahlen, boolesche Werte• SMALLTALK:
Zeichen, kleine Ganzzahlen
Call by value vs. Call by reference
Call by value• reine Eingabeparameter• formalem Parameter wird
der aktuelle Parameter als Wert zugewiesen
Call by reference• Ein- und Ausgabeparameter• formalem Parameter
wird Referenz auf aktuellem Parameter als Variable (nicht als
Objekt) zugewiesen
• SMALLTALK, Java - call by value• C++ - call by value + call by
reference
Klassen
• Klassendefinition – bildet Art Vorlage für Objekte mit
Eigenschaften (Instanzvariablen und Methoden)
• Intension – Summe der Merkmale, die die Objekte
charakterisieren• Extension (Ausdehnung oder Erstreckung) – Menge
der Objekte, die darunterfallen • Metaklasse – beschreibt für jede
Klasse, welche Attribute + Methoden sie hat• SMALLTALK: Klasse
selbst ist ein Objekt• Klassifikation – Zuordnung von Objekten zu
Klassen• Klassenhierarchie – Hierarchie von Klassen,
Standard-Superklasse = Object• Superklasse ist Generalisierung
(Abstraktion) ihrer Subklassen• Subklasse ist Spezialisierung ihrer
Superklasse • Instanziierung – Vorgang, bei dem ein neues Objekt
entsteht• Klonen – Kopieren auf Basis eines bereits bestehenden
Objektes
3
-
Vererbung
• Mechanismus zur Übertragung von Eigenschaften und Methoden
einer Generalisierung auf ihre Spezialisierung
• Überschreiben – bereits bestehende Methode des Supertyps in
Subtyp redefiniert• Überladen – neue Methode mit vorhandenem
Methodennamen aber unterschiedlicher
Parameterliste
Abstrakte Klassen
• nicht instanziierbare Klassen• in der Regel fehlen Teile der
Verhaltensspezifikation• können spezifizieren, dass individuelle
Implementierung von best. Verhalten von Subklassen
erwartet wird• offene Rekursion – aus implementierter Methode
der abstrakten Klasse wird „fehlende“
abstrakte Methode per dynamischer Bindung auf konkretem Subtyp
aufgerufen
Typen
• was - primitiver Begriff, vergleichbar Menge in Mengentheorie•
warum - Wunsch nach statischer Typsicherheit und Flexibilität
→ Lösung (mit Einschränkungen): Subtyping mit Auseinanderfallen
des statischen / dynamischen Typs→ Dynamische Methodenwahl,
dynamisches Binden
• Intension: Definition des Typs• Extension: Wertebereich
Typsysteme und Typisierung
• umfasst Typausdrücke, Wertausdrücke, Regeln• Motivation für
Typsysteme – Sicherstellung, dass einem Objekt nur Nachrichten
gesendet
werden, die es versteht.
Gründe für Typisierung• Regelt Speicherlayout• erlaubt
effizientere Ausführung eines Programms• erhöht Lesbarkeit eines
Programms• ermöglicht automatisches Finden von logischen
Fehlern
4
-
Typäquivalenz und Typkonformität
• Intension – Verhältnis der Typdefinitionen• Extension –
Zusammenhang der Wertebereiche der Typen
• nominal Typäquivalenz:sich auf den Namen beziehend
(Namensäquivalenz)
• strukturelle Typäquivalenz:erwartet dass Typen paarweise
gleich definiert sind (Strukturäquivalenz)
Typprüfung
• statisch: Typkorrektheit soll zur Übersetzungszeit
gewährleistet werden (Aufgabe des Compilers)Nachteil: Weist auch
nützliche, sinnvolle und typkorrekte Programme zurück
• dynamisch: Prüfung zur Laufzeit vor einer Variablenzuweisung,
ob der zuzuweisende Wert den von der Variable geforderten Typ
hat
• SMALLTALK: keine dynamische Typprüfung – Typfehler werden erst
im letztmöglichen Moment offenbar, wenn auf einer Variable eine
Methode aufgerufen werden soll, dir für das Objekt, auf das die
Variable verweist, nicht definiert ist
Subtyping
• Subtypenbeziehung = Rolle in einer Beziehung zwischen 2
Typen:Supertyp ← Subtyp
• Subtyp ist mit seinem Supertyp per Definitionem
zuweisungskompatibel(Ersetzbarkeit liegt Definition von Subtypen
zugrunde)
• Wo Werte des Typs eines Supertyps erwartet werden, dürfen
Werte oder Objekte des Subtyps auftauchen
Subtyping vs. Subclassing vs. Vererbung vs. Delegation
• Subclassing: Von einer Klasse Ableitung einer spezielleren
KlasseJava: Bei Subclassing immer auch Subtyping und Vererbung
(Ausnahme Interface)
• Vererbung: Mechanismus zur Übertragung von Eigenschaften und
Methoden einer Generalisierung auf ihre Spezialisierung
• Subtyping: „Ist-ein-Beziehung“ zwischen Typen• Delegation:
Weg, bestehenden Code wiederzuverwenden, ohne Subtypenbeziehung
zu
begründen. Zu erledigende Aufgabe wird an anderes Objekt
(delegate) durchgereicht.Konzeptionell ist Vererbung spezieller
Fall von Delegation (vom Subtyp an Supertyp)
5
-
Statische vs. Dynamische Bindung
Statische Bindung: Zum Übersetzungszeitpunkt definiert, welcher
Code als Folge eines Prozeduraufrufs ausgeführt wird→ Normalfall
prozedurale Programmierung
Dynamische Bindung: Durch Auswertung eines Nachrichtenausdrucks
erst zur Laufzeit wird Empfängerobjekt für Methodenaufruf
festgestellt→ Normalfall objektorientierte Programmierung
Polymorphie oder Polymorphismus
• ermöglicht Konstrukte so zu programmieren, dass sie mit
verschiedenen Typen arbeiten können
Subtyp-Polymorphie (auch: Inklusionspolymorphie)
• Im wesentlichen dasselbe wie Subtyping (gebräuchlich als
Abgrenzung zur parametrischen Polymorphie)
• Wo Objekte eines Typs erwartet werden, können Objekte eines
anderen Typs stehen, weil der erste Typ den anderen subsumiert
(inkludiert)
• ergibt sich aus der Subtypbeziehung (Substituierbarkeit)
parametrischer Polymorphismus
• Annotation mit Typparametern• Elemente des betreffenden Typs
sind erlaubt (bei gleichzeitiger Subtyppolymorphie auch
Elemente der Subtypen)• Bei Erzeugung eines Exemplars wird Typ
festgelegt
beschränkter parametrischer Polymorphismus
• wie parametrische Polymorphie, jedoch Einschränkung im voraus
durch Festlegung einer oder mehreren Schranken für den Typparameter
(Bsp. Comparable)
Typen vs. Klassen
• Typdefinition vollkommen frei von Implementierungsaspekten•
sind abstrakte Spezifikationen• schränken Wertebereich von
Variablen ein• geben das Protokoll von Objekten an
• Klasse legt Implementierung ihrer Objekte fest•
Subklassenbeziehung auf parallele Subtypenbeziehung nur
übertragbar, da die meisten OOP
Löschen oder inkompatible Redefinition von Methoden
verbieten.
6
-
• Zu parametrischen Klassendefinitionen gehören beliebig viele
Typen• Symbiose zweier verschiedener Konzepte, die
unterschiedlichen Zwecken dienen, deren
strukturelle Ähnlichkeit sich aber durch eine syntaktische
Zusammenlegung nutzen lässt
WildcardTypen
• Wunsch – z.B. für generische Collections Methode sort
definierenParametertyp ArrayList - geht nicht!
• Integer und String Subtypen von Comparable, aber ArrayList und
ArrayList nicht Subtyp von ArrayList
Lösung: Wildcards als Platzhalter, z.B. List, definitionsgemäß
Supertyp von List (also auch ArrayList und ArrayList
speziellerer Typ – Lösung: Beschränkte Wildcards – List
-
Prüfung:)Objektorientierte)Programmierung)(Modul)1814))
Prüfungsprotokoll:)Jan)2012)
Prüfer:)Prof.)Steimann)
Beisitzerin:)Dr.)Keller)
Note:)1,0)
I)wie)schon)oft)in)anderen)Prüfungsprotokollen)erwähnt,)begann)die)Prüfung)mit)der)
Frage:)„Was)verstehen)Sie)unter)objektorientierter)Programmierung?“)
!)darauf)hin)begann)ich)über)die)folgenden)Punkte)zu)referieren:)I)Weltbild)der)OOP)(Objekte)kapseln)Daten/Funktionen,)haben)eine)Identität,)
schicken)einander)Nachrichten,)haben)Beziehungen,)entstehen)und)vergehen))
I)Variablen)(Wertsemantik/Referenzsemantik,)Aliase))
I)Ausdrücke)(Zuweisungsausdrücke,)Nachrichtenausdrücke))
I)dynamische)Bindung)und)Abgrenzung)zur)prozeduralen)Programmierung)
(Unterprogrammaufruf)mit)Verzweigung))
I)Objekterzeugung)(prototypisch)vs.)klassenbasiert))
I)Klassifikation)(IstIEinIAbstraktionsbeziehung)zwischen)Element)und)
Allgemeinbegriff,)Verallgemeinerung)und)Vereinfachung)in)der)OOP,)ElementseinI
Beziehung))
I)Generalisierung)(IstIEin)Abstraktionsbeziehung)zwischen)Allgemeinbegriffen,)
Teilmengenbeziehung))
I)Vererbung)als)Teilen)der)Klassendefinition)und)Mechanismus)um)Generalisierung)
umzusetzen)(Ansichten)herausgearbeitet:)Generalisierung)vs.)Vererbung))
I)Polymorphismus)(Vielgestaltigkeit,)5)Gründe)der)Typisierung,)Idee)des)Subtyping))
I)vom)Subtyping)und)dessen)Probleme)zur)Substituierbarkeit)übergeleitet)und)das)
LSP)(Liskovsches)Substitutionsprinzip))erläutert)(Fokus)auf)Schwächen))
I)anschließend)sollte)das)Problem)mit)Aliasing)erläutert)werden)(Problem)der)
mangelnden)Kapselung))
)
Die)Prüfung)verlief)sehr)angenehm.)Wenn)man)sich)mit)den)Themen)intensiv)
auseinander)setzt,)hat)man)nichts)zu)befürchten.)Den)überwiegenden)Teil)der)Prüfung)
habe)ich)mit)meinen)Auslegungen)selbst)bestimmen)können.)Dabei)habe)ich)mich)auf)die)
oben)erwähnten)Themen)konzentriert)(dies)sind)auch)die)oft)angesprochenen)
Prüfungsschwerpunkte)auf)dem)Studientag)und)in)anderen)Prüfungsprotokollen)
gewesen).))
Den)Kurs)kann)ich)sehr)empfehlen,)wenn)man)sich)mit)den)Konzepten)der)OOP)
auseinander)setzen)möchten.)Auch)die)Vorstellung)zu)den)Sprachen)C#,)Eiffel)und)C++)
sind)sehr)informativ.)Der)Kurs)versetzt)einen)in)die)Lage)auch)weitere)
Programmiersprachen)anhand)der)beschriebenen)Kriterien)bewerten)zu)können.)
)
)
-
Gedächtnisprotokoll zum Kurs Objektorientierte Programmierung
(1814)in Hagen im März 2011
Zur Vorbereitung auf die mündliche Prüfung habe ich an der
angebotenen Klausur zu diesem Kurs teilgenommen, dies hat mir meine
vorhandenen Lücken sehr deutlich augezeigt.Für die mündliche
Prüfung selbst habe ich einen Vortrag zum Einstieg sowie jeweils
eine Kurzvortrag über die Kernpunkte zu allen Kapiteln
ausgearbeitet.Da ich in anderen Protokollen gelesen hatte, dass
Herr Prof. Steimann gerne mit der Frage "Was bedeutet
objektorientierte Programmierung?" einsteigt hatte ich meinen
Einstieg auf diese Frage ausgerichtet. Hierzu habe ich die
Definition aus dem Vorwort zum Kurs genommen,
Objekte die eine Identität haben senden einander Nachrichten.
Auf den Erhalt einer Nachricht ändern sie ihren Zustand, die
Anweisungen dazu sind in Methoden hinterlegt.Welche Nachrichten ein
Objekt versteht zählt zu seinem Eigenschaften Objekte können
entstehen und wieder vergehen (dynamisches Weltbild).
und die einzelen Punkte näher erläutert.Abgerundet wurde der
Vortrag mit dem Problem der Substituierbarkeit (mit LSP) und den
Problemen der objektorientierten Programmierung.Nachdem ich meine
Vortrag beendet hatte, stellte mir Herr Prof. Steimann noch zwei
Fragen.Frage: Was ist parametrischer Polymorphismus?Antwort: Hier
habe ich mit dem vorbereitet Vortrag zu diesem Thema antworten
können.
– Idee, aus einer Typdefinition durch Parametrisierung viele zu
machen
– Collections als Standardanwendungsfall– Parametrischer
Polymorphismus und Inklusionspolymorphie– Beschränkter
parametrischer Polymorphismus (wann lesender,
wann schreibender Zugriff)Frage: Wer profitiert vom
parametrischen Polymorphismus?Antwort: Der Typ selbst.Fazit: Ich
kann sowohl den Kurs als auch den Prüfer uneingeschränkt
weiterempfehlen. Mein Eindruck ist, dass Herr Prof. Steimann einen
Prüfling in seinen Ausführungen nicht unterbricht, auch wenn diese,
wie in meinem Fall, etwas umfassender sind und somit viel Zeit in
Anspruch nehmen. Dass nach meinem "Einstiegsvortrag" Raum für nur
noch zwei Fragen war, hat sich nicht negativ auf meine Note, mit
der ich sehr zufrieden bin, ausgewirkt.
-
Datum: 25.03.2011
Note: 1,0
Prüfer: Prof. Steimann
Mal wieder ein etwas aktuelleres Prüfungsprtokoll.
Vorbereitung Zur Vorbereitung auf den Kurs habe ich während dem
Semester im Wesentlichen das Skript
durchgearbeitet und die Einsendeaufgaben bearbeitet. Bei der
letzten ist mir allerdings ein wenig die
Zeit davongelaufen, so dass ich sie nicht mehr zur Korrektur
einschicken konnte. Die bereitgestellten
Musterlösungen sind allerdings so detailiert, dass es sich sehr
gut damit lernen lässt.
Weiterhin kann ich den Besuch des angebotenen Studientages nur
empfehlen. Idealerweise hat man
zuvor das Skript schon einmal durchgelesen.
Vor dem eigentlichen Prüfungstermin habe ich mir noch einmal
zwei Wochen Urlaub genommen. Ein
paar Tage weniger hätten sicher auch gereicht. In der Zeit habe
ich das Skript nochmal detailiert
durchgearbeitet und versucht alle zentralen Themen des Kurses
(Konzept OOP, Klassen, Typsysteme,
Polymorphie und die Unterschiede der einzelnen
Programmiersprachen) frei Vortragen zu können.
Prüfung Eröffnungsfrage (klassisch): Was ist OOP? Hierzu habe
ich die zentralen Konzepte aufgezählt (
Objekte als zentrales Element, Abgrenzung zur imperativen
Programmierung, Polymorphie,
Vererbung, Generalisierung, Kapselung, Klassenbasierte vs.
prototypenbasierte
Objekterzeugung.
Was ist der alternative Ansatz zum dynamischen Binden? Meine
Antwort: Statisches Binden.
Allerdings in Smalltalk praktisch nicht möglich wg. mangelnder
Informationen. Notwendige
Informationen liefern z.B. Typsystem.
Was macht ein Typsystem aus?
Was sind Wildcards? Wie werden diese verwendet?
Hier habe ich etwas weiter ausgeholt (parametrischer
Polymorphismus, keine Übertragung der
Subtypen Beziehung von Parametertypen auf den parametrisierten
Datentyp).
Die Prüfung ist nun schon ein paar Tage her - ich habe
sicherlich das ein oder andere Detail vergessen.
Fazit Die Prüfungsatmosphäre war überraschend angenehm.
Insbesondere Frau Dr. Keller gibt sich große
Mühe dem Prüfling die Angst zu nehmen. Prof. Steimann gibt die
Möglichkeit zu ausführlichen
Antworten, unterbrach mich allerdings 1-2 mal um zu einem
anderen Thema zu springen mit Verweis
auf die begrenzten Prüfungszeit. Das hat mich zu Beginn ein
wenig verunsichert.
-
Prüfungsprotokoll zur mündlichen Prüfung von:
Kurs 01814 - Objektorientierte Programmierung Prof. Dr. F.
Steimann April 2010 Vorab möchte ich erwähnen, dass sich meine
Prüfung auch nach Aussage von Prof. Dr. Steimann wohl von den
meisten anderen gängigen Prüfungen unterscheidet: Üblich wären in
der Regel detailliertere Fragen zum parametrischen Polymorphismus,
die in meiner Prüfung nicht gestellt worden sind, da der
Schwerpunkt dieser Prüfung auf der Substituierbarkeit lag mit einem
Exkurs zu Eiffel.
• Eröffnet wurde die Prüfung mit der Frage, was denn
Objektorientierte Programmierung für mich bedeutet: Darauf hatte
ich mich vorab vorbereitet und konnte daher meinen Vortrag abspulen
(Stichworte: Was ist ein Objekt, was ist eine Klasse, was ist die
Intension und Extension einer Klasse, Beziehungen, Zustand,
Nachrichtenversand, dynamisches Binden, statisches Binden,
Objekterzeugung, Aliasing).
• Bezüglich Aliasing wurde detailliert nachgefragt, was denn der
Unterschied zwischen Referenz- und Wertsemantik im Vergleich zum
Call by Value bzw. Call by Reference sei.
• Anschließend wurde gefragt, was Vererbung für mich bedeutet
(Stichwort: Vererbung ungleich Subtyping, dazu Unterschiede in Java
erklärt, Ko- und Kontravarianz der Eingabe- und Rückgabeparameter
genannt, damit die Zuweisungskompabilität bestehen bleibt).
• Dazu danach die Frage, was Substituierbarkeit bedeutet
(Stichwort: Ziel des LSP, die fünf Bedingungen,
Praxistauglichkeit).
• Danach folgte ein Exkurs zu Eiffel, da bisher das Meiste zu
Ko- und Kontravarianz und Substituierbarkeit gefragt worden ist
(Stichwort: Alleinstellungsmerkmal von Eiffel ist die kovariante
Redefinition, Grenzfälle dazu, d.h. wann die Substituierbarkeit
verloren geht � siehe auch ArrayStoreException).
• Schließlich wurden die sieben Probleme der OOP verlangt,
jeweils mit kurzer Erläuterung (Ausführlicher wurde ausschließlich
die Antwort zum Problem der mangelnden Kapselung verlangt, dazu
etwas von Repräsentationsobjekten erzählt).
• Law of Demeter (Ziel, Ausnahmen etc) Alles in allem war es
eine sehr angenehme Prüfung. Man kann nur dazu raten, vorab sich
einen Vortrag zu OOP zu überlegen, das hilft dann auch die
Nervosität zu reduzieren. Die Prüfung wurde sehr gut bewertet. Kurs
und Prüfer empfehle ich weiter.
-
Prüfungsprotokoll Kurs 01814 – Objektorientierte
Programmierung
Prüfer: Prof. Dr. Steimann
Februar 2010
Auch wenn sich der Prüfungsverlauf nicht wesentlich von den
anderen Protokollen
unterscheidet, ist es vermutlich dennoch hilfreich, mal wieder
ein aktuelles Beispiel zu sehen.
Für den Beginn hatte ich einen kleinen Vortrag als Einstieg in
das Thema OOP vorbereitet,
der ca. 6-7 Minuten dauerte.
Inhalt (Stichworte): Unterschiede zw. prozeduraler und
OO-Programmierung; Geflecht
interagierender Objekte, Attribute und Methoden, Zustand,
Nachrichtenversand,
Instanzvariablen (benannte und indizierte), Assoziationen
(:1-Beziehung, :n-Beziehung,
Aggregation/Komposition, wie kann man Komposition realisieren),
Möglichkeiten der
Objekterzeugung (Klonen -> prototypenbasierte Form der OOP;
Instanzen von bestimmten
Vorlagen -> klassenbasierte Form der OOP), Klasse,
Klassifikation, Generalisierung
Während des Vortrags kamen keine Zwischenfragen, anschließend
ging es dann mit den
Fragen direkt zu einem neuen Thema weiter:
Was versteht man unter Subtyping?
Welche Bedingungen sind an die Substituierbarkeit geknüpft?
-> 5 Bedingungen des LSP aufgezählt
Welche Bedingungen kann (praktisch gesehen) ein Compiler
überprüfen, welche nicht?
Soviel zur Inklusionspolymorphie, Sie ahnen, was jetzt kommt?
-> Ja, parametrischer Polymorphismus
Was ist das? Wozu wird er eingesetzt? -> Erklärt, was es ist;
Beispiel mit Collections erläutert, insbes. auch den
Zusammenhang zw. parametr. Polymorphismus und
Inklusionspolymorphie (vgl.
Kurstext 3.12.3)
Wo werden dennoch Down Casts benötigt? -> heterogene
Collections
Was versteht man unter dem beschränkten parametrischen
Polymorphismus? Wofür ist er da?
Ist die Beschränkung eine Ober- oder Unterschranke? ->
Oberschranke (Achtung: hier wird lt. Prof. Steimann sehr häufig die
Situation mit
den Wildcards in Java verwechselt und dementsprechend behauptet,
es gibt hier beim
beschränkten parametrischen Polymorphismus beides, nämlich Ober-
und
Unterschranke, was aber falsch ist!)
Wo gibt es denn die Möglichkeit, Ober- oder Unterschranken zu
verwenden? -> Wildcards in Java
Wofür sind die Wildcards da?
Warum funktionieren in einem Fall nur lesende und im anderen
Fall nur schreibende Zugriffe?
Themawechsel: Erzählen Sie etwas zum Problem der mangelnden
Kapselung.
Was kann man dagegen tun? -> Ansatz in Eiffel mit
„Repräsentationsobjekten“ mit Wertsemantik erläutert
-
Erzählen Sie etwas zum Gesetz von Demeter: was versteht man
darunter? Ist es sinnvoll? Kann man es immer verhindern? Was kann
man tun, wenn das Gesetz
verletzt wird?
-> Erklärt, was es ist; sinnvoll: prinzipiell schon, da es
hilft, die Kopplung zwischen
den Klassen gering zu halten; immer verhindern nein bspw. bei
Collections; bei
Verletzung/Missachtung kann man sog. Vermittlermethoden
einführen
Fazit:
Die Prüfungsatmosphäre war sehr angenehm. Einen kleinen Vortrag
zu Beginn zu halten
kann ich nur jedem empfehlen, da es hilft, die Nervosität (wer
hat die nicht?) zu Beginn zu
senken. Als Note erhielt ich eine 1.0, obwohl ich bei den
Wildcards und den
lesenden/schreibenden Zugriffen doch ein wenig „rumgeschwommen“
bin.
=> Kurs und Prüfer kann ich uneingeschränkt
weiterempfehlen!
-
Kurzprotokoll Prüfung Objektorientierte Programmierung (1814)
Bei Professor Steimann Am 28.02.2008
• Was ist objektorientierte Programmierung? • Sind Klassen auch
Objekte? • Wovon sind Klassen in Smalltalk Instanzen? • Wovon sind
Metaklassen Instanzen etc.? • Welche Beziehungen gibt es noch außer
der Klassifikations- und
Generalisierungsbeziehung? -> Assoziationen zwischen Objekten
• Wie werden diese implementiert? -> über Instanzattribute •
Stellen Attribute immer Beziehungen dar? • Welche Beziehungen gibt
es noch? -> 1:n-Beziehungen; werden über
Zwischenobjekte modelliert • Werden alle 1:n-Beziehungen über
Zwischenobjekte modelliert? • Welche Beziehungen gibt es noch?
-> Komposition, Aggregation • Wie werden Kompositionen
modelliert? -> Attribut mit Wertsemantik • Welche Sprachen
bieten auch Wertsemantik an? • Was bedeutet Subtyping? • Welche
Probleme gibt es beim Subtyping unter Wertsemantik? • Was macht ein
Typsystem? • Was ist beschränkter parametrischer Polymorphismus? •
Was ist eine ArrayStoreException? • Warum werden solche Zuweisungen
zunächst überhaupt zugelassen? ->
Flexibilität • Wie wird dies beim parametrischen Polymorphismus
gelöst? -> Wildcards • Können Wildcards auch beschränkt werden?
• Wie kann man dann Listen sortieren (dabei muss man ja lesen und
schreiben)?
Viel Glück!
-
Kurs 01814, OOP Prüfugsprotokoll, 24.01.2008, Prof. Dr.
Steinmann
Was haben Sie für sich aus dem Kurs mitgenommen?• Als C++
Entwickler einen ganz neuen Blick auf Objektorientierung bekommen•
Unterscheidung Prozedural vs Objektorientierung
Was macht die Objektorientierung aus?• Programm nicht mehr
lineare Folge von Befehlen wie bei prozeduralen Sprachen,
sondern Geflecht von interagierenden Objekten• vor allem
Funktionen und Daten nicht mehr getrennt, sondern in Objekten
gekapselt• Objekte haben Zustand und Verhalten
Was macht den Zustand eines Objektes aus?• Attribute
(Beziehungen zu anderen Objekten und Eigenschaften)
Wie ist das Typsystem von C++ aufgebaut?• primitive Typen mit
Wertsymantik (long, int, etc.)• Von Klassen (implizieren Typen)
können Wertobjekte, als auch Referenzobjekte
erzeugt werdenWas versteht man unter parametrischen
Polymorphismus?
• Methodendefintion enthält Platzhalter. Erst bei der Verwendung
Angabe desTyps.
Was ist der Unterschied von Generischen Typen in Java zu C++?•
da bin ich etwas "rumgeschwommen", in C++ sind es reine Vorlagen
die zu
einem Typ kompiliert werden... siehe KurstextWofür taugen die
Wildcards in Java?
• Zuweisungskompatibilität...Wieso gibt es Extends und Super bei
den Wildcards in JAva?
• Ober und Unterschranke...Nennen Sie mir die Probleme der
Objektorientierung.
• alle aus Kurstext aufgezähltErläutern Sie das Problem der
mangelnden Dekomposition.
• es fehlt sowas wie ein KomponentnErläutern Sie das Problem der
mangelnden Kapselung.
• Was kann man dagegen tun? -> in C++ bspw. Wertobjekte (aber
meinerMeinung nach auch nicht sicher, da auch auf diese Pointer
nach "außen" gegebenwerden könen)
Erläutern Sie das Gesetez von Demeter.• "sprich nicht mit
Fremden"• nur Funktionen von Objekten in direkter Beziehung, ggf.
Vermittlermethode
einführen
FazitBei Prof. Steinmann muss man wohl nicht alles auswendig
können. Ich erhielt als Note1.0, obwohl ich nicht alles bis ins
Detail wußte. Ich habe vieles aus meiner Erfahrung mitC++ heraus
erklärt, das hat ihm wohl gefallen (C++ allerdings weniger ;-) )
.
-
Fachprüfung in Objektorientierte Programmierung, 1814 (Version
vom WS 06/07 mit Smalltalk) Prüfer: Prof. Dr. Steinmann Beisitzer:
Frau Dr. Keller Prof. Steinmann ist sehr nett und locker, man kommt
leicht ins Gespräch. Nach der Prüfung haben wir uns noch ein
bisschen über Gott und die Welt unterhalten. In den
Prüfungsprotokollen hatte ich gelesen, dass eine Prüfung bei ihm am
besten ein Vortrag vom Studenten sein sollte. Daher hatte ich mir
im Voraus einen Ablauf meiner Prüfung überlegt. Ich informierte
Prof. Steinmann und legte los. Zuerst erzählte ich ein wenig über
die Grundlagen der Objektorientierung; was Obj