Zum Inhalt springen

Objektorientierte Mathematische Modellbildung/Implementierung - OOP

Aus Wikiversity

Einleitung

[Bearbeiten]

Im Modellbildungszyklus ist i.d.R. eine Implementierung der OOMM auf eine Computer notwendig, um mit dem Modell Simulationen und Tests durchführen zu können und ggf. Konstruktionsmängel bereits im Vorfeld bei einer präskriptiven Modellierung entdecken zu können oder bei einer deskriptiven Modellierung abschätzen zu können, wie sich geplante Veränderung an einem beobachteten System auswirken.

Objektorientierte Programmierung

[Bearbeiten]

Die objektorientierte Programmierung (kurz OOP) ist ein auf dem Konzept der Objektorientierung basierendes Programmierparadigma. Die Grundidee besteht darin, die Architektur einer Software an den Grundstrukturen desjenigen Bereichs der Wirklichkeit auszurichten, der die gegebene Anwendung betrifft.

Entwurfsphase

[Bearbeiten]

Ein objektorientiertes Modell (OOM)[1] dieser Strukturen wird in der Entwurfsphase aufgestellt. Es enthält Informationen über die in dem System

  • auftretenden Objekte und deren Klassifikation,
  • der Kommunikation zwischen Objekten

In der OOP geht es um die Erstellung eines Softwareproduktes.

Simulationsumgebungen

[Bearbeiten]

Im wissenschaftlichen Kontext geht es z.B. um Simulationsumgebungen, mit denen ein Systemverhalten bzgl. beobachtbarer oder messbarer Aspekte eines Systems untersucht werden können. Durch vergleichende Analysen mit dem realen System geht es um Strukturaufklärung und Strukturbeschreibung des Systems. In Simulationsumgebungen können auch Testscenarien realisiert werden, die in der Realität durch die damit verbundenen Risiken nicht getestet werden können.

Aufgaben - Javascript

[Bearbeiten]

Implementieren Sie das folgende System in objektientiert in einem HTML-Datei mit Javascript-Bibliotheken. Erzeugen für jede Klasse eine Javascript-Datei und binden Sie diese in HTML-Datei ein.

  • (Klasse: Leinwand) Eine HTML-Datei enthält eine Leinwand einer bestimmten Größe (z.B. 640x480 Pixel). Die Klasse "Leinwand" erzeugen ein HTML-Canvas in eine DIV-Element mit der im Attribute angegeben Größe "width" and "height".
  • (Klasse: Kurve) Eine Kurve ist eine Konvexkombination eine beliebigen Ordnung und dies kann auf einer Leinwand die Kurve mit der Methode draw() zeichnen.
  • (Aggregation: Kurven - Leinwand) Ein Leinwand kann mehrere Kurven besitzen. Auch die Leinwand besitzt eine Methode draw(), die alle Kurven zeichnen, die diese besitzt.
  • (Methoden) Ergänzen Sie bei den Klassen die notwendigen Methoden, um die Attribute der Instanzen/Objekte zu setzen.(z.B. bei der Klasse Leinwand die Methode addCurve(pCurve), wobei der Parameter pCurve eine Instanz der Klasse Kurve ist oder die Methode setColor(pColor) zum Setzen der Kurvenfarbe.

Erzeugen Sie ein GIT-Repository und arbeiten Sie kollaborativ an der Erweitungen der Klasse (z.B. Stifte und Mäuse[2][3][4])

Grundlegende Konzepte

[Bearbeiten]

Die Umsetzung dieser Denkweise erfordert die Einführung verschiedener Konzepte, insbesondere Klassen, Vererbung, Polymorphie und spätes Binden (dynamisches Binden).

Konzepte

[Bearbeiten]

Im Vergleich mit anderen Programmiermethoden verwendet die objektorientierte Programmierung neue, andere Begriffe.

Die einzelnen Bausteine, aus denen ein objektorientiertes Programm während seiner Abarbeitung besteht, werden als Objekte bezeichnet. Die Objekte werden dabei in der Regel auf Basis der folgenden Konzepte entwickelt:

Abstraktion

[Bearbeiten]

Abstraktion: Jedes Objekt im System kann als ein abstraktes Modell eines Akteurs betrachtet werden, der Aufträge erledigen, seinen Zustand berichten und ändern und mit den anderen Objekten im System kommunizieren kann,

Klasse - Gemeinsamkeiten von Objekten

[Bearbeiten]

Eine Klasse in mathematische gesehen eine Menge von Objekten, die gemeinsame Eigenschaften besitzen, die durch

beschrieben werden können.

Das Verhalten des Objekts wird von den Methoden der Klasse bestimmt. Klassen können von anderen Klassen abgeleitet werden (Vererbung). Dabei erbt die Klasse die Datenstruktur (Attribute) und die Methoden von der vererbenden Klasse (Basisklasse).

Prototyp
Objekte werden durch das Klonen bereits existierender Objekte erzeugt und können anderen Objekten als Prototypen dienen und damit ihre eigenen Methoden zur Wiederverwendung zur Verfügung stellen, wobei die neuen Objekte nur die Unterschiede zu ihrem Prototyp definieren müssen. Änderungen am Prototyp werden dynamisch auch an den von ihm abgeleiteten Objekten wirksam.
Datenkapselung
Als Datenkapselung bezeichnet man in der Programmierung das Verbergen von Implementierungsdetails. Auf die interne Datenstruktur kann nicht direkt zugegriffen werden, sondern nur über definierte Schnittstellen. Objekte können den internen Zustand anderer Objekte nicht in unerwarteter Weise lesen oder ändern. Ein Objekt hat eine Schnittstelle, die darüber bestimmt, auf welche Weise mit dem Objekt interagiert werden kann. Dies verhindert das Umgehen von Invarianten des Programms.
Feedback
Verschiedene Objekte kommunizieren über einen Nachricht-Antwort-Mechanismus, der zu Veränderungen in den Objekten führt und neue Nachrichtenaufrufe erzeugt. Dafür steht die Kopplung als Index für den Grad des Feedbacks.
Persistenz
Objektvariablen existieren, solange die Objekte vorhanden sind und „verfallen“ nicht nach Abarbeitung einer Methode.
Polymorphie (dt. Mehrgestalt)
Fähigkeit eines Bezeichners, abhängig von seiner Verwendung unterschiedliche Datentypen anzunehmen. Verschiedene Objekte können auf die gleiche Nachricht unterschiedlich reagieren. Wird die Art der Reaktion auf die Nachricht erst zur Laufzeit aufgelöst, wird dies auch späte Bindung genannt.
Vererbung
Vererbung heißt vereinfacht, dass eine abgeleitete Klasse die Methoden und Attribute der Basisklasse ebenfalls besitzt, also „erbt“. Somit kann die abgeleitete Klasse auch darauf zugreifen. Neue Arten von Objekten können auf der Basis bereits vorhandener Objektdefinitionen festgelegt werden. Es können neue Bestandteile hinzugenommen werden oder vorhandene überlagert werden.

Objekte

[Bearbeiten]
Objekt (von dt. Ding / Sache)
Ein Element, welches Funktionen, Methoden, Prozeduren, einen inneren Zustand, oder mehrere dieser Dinge besitzt.
Entität
Ein Objekt mit einer eindeutigen Identität zur Speicherung von Daten. Beispiel: Eine Person mit den Daten Adresse, Telefonnummer oder Name. Die Daten können geändert werden, ohne dass die Person ihre Identität verliert. Eine Person ist also eine Entität.[5]
Wertobjekt
Ein Objekt, welches über seinen Wert definiert wird. Eine Telefonnummer, welche sich ändert, ist also eine andere Telefonnummer. Gleichartig ist eine Adresse, bei der sich lediglich die Hausnummer ändert, eine andere Adresse, selbst wenn alle anderen Daten gleich bleiben. Somit stellt eine Telefonnummer und eine Adresse keine Entität dar, sondern ein Wertobjekt.[5]
Eigenschaft
Ein Bestandteil des Zustands eines Objekts. Hierbei kann es sich um eine Entität oder ein Wertobjekt handeln.
Dienst
Ein Objekt, welches ein Verhalten (z. B. eine Geschäftslogik) in Form von Prozeduren, Funktionen oder Methoden implementiert. Der Dienst verwendet hierbei Entitäten oder Wertobjekte.[5]
Prozedur
Verändert den Zustand eines Objektes, ohne einen Rückgabewert zu liefern. Eine Prozedur kann andere Objekte als Parameter entgegennehmen.
Funktion
Ordnet einer gegebenen Eingabe einen bestimmten Rückgabewert zu. Eine Funktion zeichnet sich insbesondere dadurch aus, dass sie nicht den Zustand eines Objekts verändert.[5]
Methode
Verändert den Zustand eines Objekts und liefert zudem einen Rückgabewert. Eine Methode kann andere Objekte als Parameter entgegennehmen.
Modul
Eine zusammengefasste Gruppe von Objekten.

Klassen

[Bearbeiten]

Zur besseren Verwaltung gleichartiger Objekte bedienen sich die meisten Programmiersprachen des Konzeptes der Klasse. Klassen sind Vorlagen, aus denen Instanzen genannte Objekte zur Laufzeit erzeugt werden. Im Programm werden nicht einzelne Objekte, sondern eine Klasse gleichartiger Objekte definiert. Existieren in der gewählten Programmiersprache keine Klassen oder werden diese explizit unterdrückt, so spricht man zur Unterscheidung oft auch von objektbasierter Programmierung.

Man kann sich die Erzeugung von Objekten aus einer Klasse vorstellen wie das Fertigen von Autos aus dem Konstruktionsplan eines bestimmten Fahrzeugtyps. Klassen sind die Konstruktionspläne für Objekte.

Die Klasse entspricht in etwa einem komplexen Datentyp wie in der prozeduralen Programmierung, geht aber darüber hinaus: Sie legt nicht nur die Datentypen fest, aus denen die mit Hilfe der Klassen erzeugten Objekte bestehen, sie definiert zudem die Algorithmen, die auf diesen Daten operieren. Während also zur Laufzeit eines Programms einzelne Objekte miteinander interagieren, wird das Grundmuster dieser Interaktion durch die Definition der einzelnen Klassen festgelegt.

Beispiel - Auto

[Bearbeiten]

Die Klasse „Auto“ legt fest, dass das Auto vier Reifen einer bestimmten Größe, fünf farbige Türen, einen Motor mit einer bestimmten Leistung und fünf Sitze mit wählbaren Bezügen hat.

  • Das Objekt „Auto1“ hat vier Reifen mit dem Durchmesser 19 Zoll und der Breite 255 mm, fünf rote Türen, einen Motor mit 150 kW und fünf Ledersitze.
  • Das Objekt „Auto2“ hat vier Reifen mit dem Durchmesser 19 Zoll und der Breite 255 mm, fünf rote Türen, einen Motor mit 150 kW und fünf Ledersitze.
  • Ein weiteres Objekt „Auto3“ hat vier Reifen mit dem Durchmesser 16 Zoll und der Breite 205 mm, fünf blaue Türen, einen Motor mit 90 kW und fünf Sitze mit Textilbezug.

Es handelt sich um drei Objekte; zwei davon haben gleiche Attribute. Alle drei sind aber Ausprägungen (Instanzen) der Klasse „Auto“.

Methoden bei Klassen

[Bearbeiten]

Die einer Klasse von Objekten zugeordneten Algorithmen bezeichnet man auch als Methoden.

Häufig wird der Begriff Methode synonym zu den Begriffen Funktion oder Prozedur aus anderen Programmiersprachen gebraucht. Die Funktion oder Prozedur ist jedoch eher als Implementierung einer Methode zu betrachten. Im täglichen Sprachgebrauch sagt man auch „Objekt A ruft Methode m von Objekt B auf.“

Eine besondere Rolle spielen Methoden für die Kapselung, insbesondere die Zugriffsfunktionen. Spezielle Methoden zur Erzeugung und Zerstörung von Objekten heißen Konstruktoren beziehungsweise Destruktoren.

Methoden können Parameter erhalten, die beim Aufruf übergeben werden müssen, und einen Rückgabewert besitzen, den sie am Ende dem Aufrufer zurückgeben. Beispielsweise hat die Methode addiere die Parameter Zahl 1 und Zahl 2 und gibt als Rückgabewert die Summe der Zahlen zurück.

In vielen objektorientierten Programmiersprachen lässt sich festlegen, welche Objekte eine bestimmte Methode aufrufen dürfen. So wird meist zwischen folgenden vier Zugriffsebenen unterschieden, die bereits zur Übersetzungszeit geprüft werden.

  • (1) Öffentliche (public) Methoden dürfen von allen Klassen aufgerufen werden.
  • (2) Geschützte (protected) Methoden dürfen von Klassen im selben Paket und abgeleiteten Klassen aufgerufen werden.
  • (3) Methoden auf Paket-Ebene können nur von Klassen aufgerufen werden, die sich im selben Paket befinden – diese Zugriffsebene ist nur bei Programmiersprachen vorhanden, die Pakete bzw. Namespaces kennen.
  • (4) Private Methoden können nur von anderen Methoden derselben Klasse aufgerufen werden.

Analog zu diesen vier Zugriffsebenen sind in der Unified Modeling Language (UML) vier Sichtbarkeiten für Operationen definiert.

Attribute

[Bearbeiten]

Objekte (Fenster, Schaltflächen, Laufleisten, Menüs, …) besitzen verschiedene Eigenschaften (Farbe, Größe, Ausrichtung, …). Diese Eigenschaften eines Objekts heißen Attribute.

Polymorphie

[Bearbeiten]

Unter bestimmten Voraussetzungen können Algorithmen, die auf den Schnittstellen eines bestimmten Objekttyps operieren, auch mit Objekten davon abgeleiteter Klassen zusammenarbeiten.

Geschieht dies so, dass durch Vererbung überschriebene Methoden an Stelle der Methoden der vererbenden Klasse ausgeführt werden, dann spricht man von Polymorphie. Polymorphie stellt damit eine Möglichkeit dar, einer durch ähnliche Objekte ausgeführten Aktion einen Namen zu geben, wobei jede Klasse die Aktion in einer für das Objekt geeigneten Weise implementiert.

Diese Technik, das sogenannte Overriding, implementiert aber keine universelle Polymorphie, sondern nur die sogenannte Ad-hoc-Polymorphie.

Terminologie

[Bearbeiten]

Die Begriffe der objektorientierten Programmierung haben teilweise unterschiedliche Namen. Folgende Bezeichnungen werden synonym verwendet:

Bezeichnungen in der objektorientierten Programmierung
Deutscher Begriff Alternativen Englisch
Abgeleitete Klasse Kindklasse, Unterklasse, Subklasse child class, subclass
Attribut Objektvariable, Instanzvariable, Datenelement, Eigenschaft member, property
Basisklasse Elternklasse, Oberklasse, Superklasse parent class, superclass
Objekt Exemplar, Instanz instance
Methode Elementfunktion method
Statische Methode Klassenfunktion, Metafunktion static method

Weiterführende Literatur

[Bearbeiten]

Quellennachweis

[Bearbeiten]
  1. Rumbaugh, J., Blaha, M., Premerlani, W., Eddy, F., & Lorensen, W. E. (1991). Object-oriented modeling and design (Vol. 199, No. 1). Englewood Cliffs, NJ: Prentice-hall.
  2. Bernhard Schriek (2006-2007) ) Informatik mit Java Eine Einführung mit BlueJ und der Bibliothek Stifte und Mäuse - Band 1 - Nili-Verlag - Werl - URL: https://mg-werl.de/sum/OOP-Buch1.pdf (letzter Zugriff: 14.11.2025)
  3. Ingo Linkweiler (2003) Klassenübersicht - Stifte und Mäuse - URL: https://linkweiler.de/diplom/sum/liesmich/klassen.html
  4. Ingo Linkweiler (2002) Umsetzung des Softwarepaketes "Stifte und Mäuse" in Python - URL: https://linkweiler.de/diplom/ (letzter Zugriff: 14.11.2025)
  5. a b c d Debasish Ghosh: Functional and Reactive Domain Modeling. Manning, 2016, ISBN 978-1-61729-224-8 (englisch, 325 S.)