Zum Inhalt springen

Objektorientierte Mathematische Modellbildung

Aus Wikiversity

Einleitung

[Bearbeiten]

Diese Seite zum Thema Objektorientierte Mathematische Modellbilung kann als Wiki2Reveal Folien a angezeigt werden. Einzelne Abschnitte werden als Folien betrachtet und Änderungen an den Folien wirken sich sofort auf den Inhalt der Folien aus.

Teilaspekte der OOMM

[Bearbeiten]

Dabei werden die folgenden Teilaspekte im Detail behandelt:

  • (1) Mathematische Beschreibung von Objekten/Instanzen und Klassen,
  • (2) Mathematische Beschreibung von Zuständen von Objekten,
  • (3) Prozesse und Methoden zur mathematischen Beschreibung von Veränderungen in Netzen von kommunizierenden Objekten

Modellbildung

[Bearbeiten]

In der Modellbildung betrachtet man ein System und erarbeitet durch Systemanalyse eine Modell als Ergebnis der Analyse. Dieser Prozess ist in der Regel iterativ, da man durch Erkenntnisgewinn über das betrachtete System das Modell weiter verbessern kann. In der Mathematischen Modellbildung erfolgt die Beschreibung des Systems mit mathematischen Methoden und in einer mathematischen Syntax.

Modellbildungszyklus

[Bearbeiten]

Die Abbildung zeigt, wie ausgehend von einer Realsituation ein Modellierungsproblems definiert wird und in einem iterativen Ablauf das mathematische Modell und dessen Implementation in ein rechnergestütztes ablauffähiges Modell schrittweise verbessert werden kann.

Modellbildungszyklus


Definition - OOMM

[Bearbeiten]

Ein ObjektOrientierte Mathematisches Modell (OOMM) ist als mathematisches Modell eine Beschreibung eines Ausschnittes der beobachtbaren Welt mittels mathematischer Notation. Dieses OOM betrachtet das beobachte bzw. modellierte System als

  • ein abzählbares (i.d.R. endliches) System von Einzelobjekte mit ,
  • Einzelobjekte mit ,
  • wobei die Einzelne zu einer oder mehrerer Klassen mit gehören können,
  • die Klassenzugehörigkeit definiert dabei, welche gemeinsame Eigenschaften alle besitzen,
  • die gemeinsamen Eigenschaften beziehen sich dabei auf
    • gemeinsame Zustände und/oder
    • gemeinsame Methoden , die alle besitzen.
  • zwei oder mehrere Objekte können miteinander über Methoden kommunizieren, wenn diese sich in dem System "kennen" bzw. eine einseitige bzw. wechselseitige Relation zwischen den Objekten existiert.

Bemerkung - Modellierungsbereich

[Bearbeiten]

Die OOMM kann analog zu jedem mathematischen Modell einen beliebigen, begrenzten Bereichen der beobachtbaren Realität als Ausgangspunkt der Modellierungsaktivität verwenden. Das OOMM kann sich dabei z. B. die Naturwissenschaften, die Wirtschafts- oder Sozialwissenschaften, die Medizin oder den Ingenieurwissenschaften beziehen.

Bemerkung - deskriptiv - präskriptiv

[Bearbeiten]

Modelle können aber nicht nur deskriptiv versuchen, einen Ausschnitt aus der beobachteten Welt zu beschreiben, sondern können auch präskriptiv (z.B. in den Ingenieurswissenschaften) ein Modell mit den Objekten und Prozessbeschreibungen definieren, das ein zukünftiges zu konstruktuierendes System mit seinen Teilen beschreibt ("präskriptive Modellierung"). Dabei geht beispielsweise darum, bestimmte Funktionsweisen und Eigenschaften des Systems bereits im Vorfeld zu testen, ohne das konstruierte Objekt schon physikalisch vor sich zu haben. Die Anwendung von OOMM kann dabei zu Reduktion von Entwicklungskosten führen (z.B. reduzierte Anzahl von realen Prototypen für Tests).

Bemerkung - Modellierte Gesetzmäßigkeiten

[Bearbeiten]

Die Nutzung von mathematischen Modelle allgemein erlaubt eine logische, strukturelle oder prozessorientierte Durchdringung eines modellierten Systems. Dabei müssen je nach Art des beobachtbaren oder modellierten Systems die geltenden Gesetzmäßigkeiten (z.B. physikalischen Gesetze) auf das objektorientierte Modell über die Zustände und Methoden übertragen werden.

Bemerkung - Digitaler Zwilling

[Bearbeiten]

Die Analogie zwischen beoachtbarem Ausschnitt der Realität und dem mathematischen Modell sollte nach Möglichkeit gleichwertig (äquivalent) sein, da das OOMM nach Möglichkeit nur die erlaubten Zustände und möglichen Prozesse aus einem beoachteten System abbilden soll. Da die OOMM in der Regel auch digital in eine Computersimulation übertragen werden, finden man die mathematische Modellbildung auch in Kontext von Digitalen Zwillingen.

Bemerkung - Modellierungsgüte

[Bearbeiten]

Durch den Vergleich von beoachtetem System und modellierten System über Messdaten kann man feststellen, ob tatsächlich in OOMM nur erlaubten Zustände und physikalisch mögliche Prozess adäquat die Dynamik des beoachteten Systems beschreibt. Insgesamt schließt die Anwendung OOMM ein iterative (wiederholten) Durchlauf Modellbildungskreisläufen ein, die das Ziel hat, diese Erkenntnisse aus dem beoachteten System auf das modellierte System zu übertragen und die Modellierungsgüte des OOMM zu verbessern.


Aufgabe für Studierende

[Bearbeiten]
  • Betrachten Sie das Konzept des Digitalen Zwillings und wenden Sie dieses auf eine Domäne Ihrer Wahl an. Identifizieren Sie dabei, die modellierten Zustände und Prozesse, die Sie in das OOMM aufnehmen möchten.
  • Versuchen Sie herauszufinden, wer "All models are wrong, but some are useful" (alle Modelle sind falsch, aber manche sind nützlich) gesagt hat und analysieren Sie Motivation für diese Aussage. Übertragen das auf die mathematischen Anforderung der OOMM.

Zielsetzung

[Bearbeiten]

Diese Lernressource zu Thema Objektorientierte Mathematische Modellbilung in der Wikiversity hat das Ziel, mathematische Modellbildung mit Prinzipien der Objektorientierung zu verbinden.

Nachhaltigkeitsziele

[Bearbeiten]

Vor dem Hintergrund der Nachhaltigkeitsziele der Vereinten Nationen versucht man Objekte in einem System zu klassifizieren, deren Ressourcenverbrauch zu modellieren und diesen auch zu optimieren.

Zielgruppe

[Bearbeiten]

Die Zielgruppen der Lernressource zum Thema Objektorientierte Mathematische Modellbilung sind

  • Studierende im Fach Mathematik
  • Studierende im Fach Umweltwissenschaften

Lerneinheiten

[Bearbeiten]

Klassen

[Bearbeiten]

Einführende Aufgaben

[Bearbeiten]

Mit den folgenden Aufgaben zum Thema Objektorientierte Mathematische Modellbilung werden zunächst grobe Strukturen eines Systems definiert.

  • Betrachten Sie das Thema Mobilität und Transport und definieren Sie in betrachteten System die Objekte und Klassen, die Sie in die mathematische Modellbildung einbinden möchten (z.B. Autos, Schiffe, ÖPNV).
  • Welche internen Zustände möchten Sie in diesem Modellen betrachten (z.B. Füllstand in Tank, Ladezustand von Batterien, ...)?
  • Welche Prozesse möchten Sie in dem Modell abbilden (z.B. die Bewegung im Raum zusammen mit dem Ressourceverbrauch)?

Objektorientierte Programmiersprachen

[Bearbeiten]

Objektorientierte Programmiersprachen unterstützen die Programmstrukturierung mit einem speziellen Datentyp – dem Objekt, der die Objektorientierung ermöglicht. Die rein objektorientierten Sprachen, wie Smalltalk, folgen dem Prinzip: „Alles ist ein Objekt.“ Auch elementare Typen wie Ganzzahlen werden dabei durch Objekte repräsentiert – selbst Klassen sind hier Objekte, die wiederum Exemplare von Metaklassen sind. Die verbreiteten objektorientierten Programmiersprachen, unter anderem C#, C++ und Java, handhaben das Objektprinzip nicht alle so streng. Bei ihnen sind elementare Datentypen keine vollwertigen Objekte, da sie auf Methoden und Struktur verzichten müssen. Sie stellen dem Entwickler auch frei, wie stark er die Kapselung objektinterner Daten einhält.

Die erste bekannte objektorientierte Programmiersprache war Simula-67. Später wurden die Prinzipien der Kapselung in einer Klassenhierarchie dann in Smalltalk weiter ausgebaut. Mit dem ANSI/X3.226-1994-Standard wurde Common Lisp/CLOS zur ersten standardisierten objektorientierten Programmiersprache und mit ISO 8652:1995 wurde Ada 95 als erste nach dem internationalen ISO-Standard normierte objektorientierte Programmiersprache festgelegt.

Gängige moderne Programmiersprachen (z. B. Python) unterstützen sowohl die OOP als auch den prozeduralen Ansatz, der in den klassischen Programmiersprachen der 1970er- und 1980er-Jahre wie Pascal, Fortran oder C vorherrschte. Im Gegensatz dazu setzt Smalltalk, die älteste heute noch bedeutsame OOP-Sprache, auf kompromisslose Objektorientierung und hatte damit starken Einfluss auf die Entwicklung populärer OOP-Sprachen, ohne selber deren Verbreitung zu erreichen, weil keine kostengünstig allgemein verfügbare Implementierung angeboten wurde. Auch wenn der Durchbruch der OOP erst in den 1990er-Jahren stattfand, wurde die objektorientierte Programmierung bereits Ende der 1960er Jahre mit Simula-67 als Lösungsansatz für die Modularisierung und die Wiederverwendbarkeit von Code entwickelt.


Techniken

[Bearbeiten]

Objekt-Konzepte in Programmiersprachen

[Bearbeiten]

In einigen objektorientierten Programmiersprachen wie Go, NewtonScript und Self wird auf die Deklaration von Klassen gänzlich verzichtet. Stattdessen werden neue Objekte von bestehenden Objekten, den sogenannten Prototypen, abgeleitet. Die Attribute und Methoden des Prototyps kommen immer dann zum Einsatz, wenn sie im abgeleiteten Objekt nicht explizit überschrieben wurden. Dies ist vor allem für die Entwicklung kleinerer Programme von Vorteil, da es einfacher und zeitsparend ist.

In manchen Programmiersprachen, beispielsweise in Objective-C, gibt es zu jeder Klasse ein bestimmtes Objekt (Klassenobjekt), das die Klasse zur Laufzeit repräsentiert; dieses Klassenobjekt ist dann auch für die Erzeugung von Objekten der Klasse und den Aufruf der korrekten Methode zuständig.

Klassen werden in der Regel in Form von Klassenbibliotheken zusammengefasst, die häufig thematisch organisiert sind. So können Anwender einer objektorientierten Programmiersprache Klassenbibliotheken erwerben, die zum Beispiel den Zugriff auf Datenbanken ermöglichen.

Entwurf von Objekt-Konzepten

[Bearbeiten]

Die Wortarten einer sprachlichen Problembeschreibung können hilfreiche Hinweise dafür geben, eine Objekt-basierte Modellierung zu konzipieren (sogenannte Verb-Substantiv-Methode).[1] Dabei werden Objekte und Klassen in der Regel sprachlich durch Substantive beschrieben, wobei Eigennamen auf Objekte und Appellative wie Haus und Tier auf Klassen hindeuten.[2] Verben stehen in der Regel für Methoden, wobei Adverbien und Substantive ergänzende Charakterisierungen der Methoden geben können. Die Werte von Objektattributen entsprechen häufig Numeralien oder Adjektiven.[3]

Es gibt inzwischen auch Verfeinerungen der objektorientierten Programmierung durch Methoden wie Entwurfsmuster, Design by contract und grafische Modellierungssprachen wie die Unified Modeling Language.

Einen immer höheren Stellenwert nimmt die aspektorientierte Programmierung ein, bei der Aspekte von Eigenschaften und Abhängigkeiten beschrieben werden. Erste Ansätze sind beispielsweise in Java mit Jakarta EE oder der abstrakten Datenhaltung über Persistenzschichten sichtbar.

Grenzen der OOP

[Bearbeiten]

Das objektorientierte Paradigma hat Vor- und Nachteile je nach Anwendungsfeld in der Softwaretechnik oder konkreter Problemstellung.

Abbildung von Problemstellungen auf OOP-Techniken

[Bearbeiten]

Die OOP kann, wie auch andere Programmierparadigmen, verwendet werden, Probleme aus der realen Welt abzubilden. Als ein typisches Beispiel für Problemstellungen, die sich einer geschickten Modellierung mit OOP-Techniken entziehen, gilt das Kreis-Ellipse-Problem.

Objektorientierte Programmiersprachen und natürliche Sprachen

[Bearbeiten]

Objektorientierte Programmiersprachen können auch unter sprachwissenschaftlichen Aspekten mit natürlichen Sprachen verglichen werden. OO-Programmiersprachen haben ihren Fokus auf den Objekten, welche sprachlich Substantive sind. Die Verben (Aktionen) sind sekundär, fest an Substantive gebunden (gekapselt) und können im Allgemeinen nicht für sich allein stehen. Bei natürlichen Sprachen und z. B. prozeduralen Sprachen existieren Verben eigenständig und unabhängig von den Substantiven (Daten), z. B. als Imperativ und Funktion. Es kann argumentiert werden, dass diese sprachliche Einschränkung in einigen Anwendungsfällen zu unnötig komplizierten Beschreibungen von Problemen aus der realen Welt mit objektorientierten Sprachen führt.[4][5]

OOP und Kontrollfluss

[Bearbeiten]

Häufig genannte Vorzüge des OOP-Paradigmas sind eine verbesserte Wartbarkeit und Wiederverwendbarkeit des statischen Quellcodes.[6] Hierzu werden jedoch die Kontrollflüsse und das dynamische Laufzeitverhalten den Daten/Objekten im Allgemeinen untergeordnet, abstrahiert und weggekapselt. Die Kontrollflüsse bilden sich nicht mehr für den Entwickler transparent direkt in den Codestrukturen ab (wie z. B. bei prozeduralen Sprachen), eine Umsetzung in dieser Hinsicht wird dem Compiler überlassen. Hardware-nähere Sprachen wie das prozedurale C oder Assembler bilden den echten Kontrollfluss und das Laufzeitverhalten transparenter ab.[7] Mit der wachsenden Bedeutung von paralleler Hardware und nebenläufigem Code wird jedoch eine bessere Kontrolle und Entwickler-Transparenz der komplexer werdenden Kontrollflüsse immer wichtiger – etwas, das schwierig mit OOP zu erreichen ist.[8][9]

OOP und relationale Datenbanken

[Bearbeiten]

Ein häufig genannter Bereich, in dem OOP-Techniken als unzureichend gelten, ist die Anbindung von relationalen Datenbanken. OOP-Objekte lassen sich nicht direkt in allen Aspekten mit relationalen Datenbanken abbilden. Umgekehrt können über OOP die Stärken und Fähigkeiten von relationalen Datenbanken ebenfalls nicht vollständig ausgeschöpft werden. Die Notwendigkeit, eine Brücke zwischen diesen beiden Konzeptwelten zu schlagen, ist als object-relational impedance mismatch bekannt. Hierzu existieren viele Ansätze, beispielsweise die häufig verwendete objektrelationale Abbildung, jedoch keine allgemeingültige Lösung ohne den einen oder anderen Nachteil.[10]

Laufzeitverhalten und Energieeffizienz

[Bearbeiten]

Die Effektivität des Laufzeitverhaltens von Anwendungen, die auf OOP-Techniken basieren, wird seit jeher kontrovers diskutiert. Alexander Chatzigeorgiou von der Universität Makedonien verglich die Laufzeiteffektivität und die Energieeffizienz von typischen Algorithmen (Gauß-Jordan-Algorithmus, Trapez-Integration und QuickSort) von prozeduralen Ansätzen und OOP-Techniken, implementiert als C- und C++-Software. Auf dem verwendeten ARM-Prozessor ergab sich für drei Algorithmen im Mittel eine um 48,41 % bessere Laufzeiteffektivität mit den prozeduralen C-Algorithmusvarianten. Es ergab sich außerdem eine im Mittel um 95,34 % höhere Leistungsaufnahme der C++-Varianten zu den C-Varianten.[11] Für Anwendungen auf mobilen Geräten, wie Handys oder MP3-Spielern mit begrenzten Leistungs- und Energiespeichervermögen, sind derartige Unterschiede signifikant, allerdings machen derartige Algorithmen in der Regel nur einen Bruchteil der Applikationen aus. Als Grund für den Unterschied in Effektivität und Energieeffizienz werden in dem Artikel generelle Abstraktions-Leistungseinbußen und die deutlich größere Anzahl von Zugriffen auf den Arbeitsspeicher durch OOP-Techniken genannt.

Kritik

[Bearbeiten]

Modularisierung und andere Prinzipien nicht ausgereift

[Bearbeiten]

Luca Cardelli untersuchte 1996 für das DEC Systems Research Center die Effizienz von OOP-Ansätzen in dem Artikel Bad Engineering Properties of Object-Oriented Languages mit den Metriken Programmablaufgeschwindigkeit (economy of execution), Kompilationsgeschwindigkeit (economy of compilation), Entwicklungseffizienz für große und kleine Teams (economy of small-scale development und economy of large-scale development) und die Eleganz des Sprachumfangs selbst (economy of language features). Er kam zu dem Schluss, dass das objektorientierte Sprachdesign noch viel aus dem prozeduralen Sprachendesign lernen müsste, insbesondere im Bereich der guten Modularisierung, der Datenabstraktion und des Polymorphismus, um die hochgesteckten Erwartungen zu erfüllen.[12]

Keine Erhöhung der Produktivität gegenüber prozeduralen Ansätzen

[Bearbeiten]

Eine Studie von Potok et al. aus dem Jahre 1999 zeigte keine signifikanten Produktivitätsunterschiede zwischen OOP und prozeduralen Ansätzen.[13]

Die Autoren definieren „Produktivität“ in der Einheit „entwickelte/geänderte Programmzeilen pro Zeiteinheit“ und untersuchen insbesondere den Einfluss von Code Reuse auf diese Metrik. Sie weisen darauf hin, dass eine Konzentration auf Code Reuse unter Umständen der objektorientierten Programmierung nicht gerecht wird, da sie sich noch auf andere Weisen positiv auf die Produktivität auswirken könnte (beispielsweise durch ein einfacheres Design).

Die Autoren führen mehrere Gründe an, weshalb die Ergebnisse ihrer Studie verzerrt sein könnten:

  • Es könnte sein, dass als „objektorientiert“ deklarierte Software in Wirklichkeit prozedural entwickelt wurde.
  • Sie analysierten nur zwei Generationen objektorientierter Software, was ihrer Aussage nach zu wenig sein könnte.
  • Es könnte sein, dass die Qualifikation der verschiedenen Entwicklungsteams unterschiedlich war. Insbesondere wäre es möglich, dass die objektorientierte Software von geringer qualifizierten Teams entwickelt wurde.

Die Autoren vertreten die Meinung, diese Punkte träfen nicht zu.

[Bearbeiten]

Einzelnachweise

[Bearbeiten]
  1. David J. Barnes, Michael Kölling: Java lernen mit BlueJ: Eine Einführung in die objektorientierte Programmierung. München 2009, ISBN 978-3-86894-001-5, S. 496.
  2. Russell J. Abbott: Program design by informal English descriptions. In: Communications of the ACM. 26. Jahrgang, 1983, S. 882–894, doi:10.1145/182.358441.
  3. Jörg Bewersdorff: Objektorientierte Programmierung mit JavaScript: Direktstart für Einsteiger. 2. Auflage. Wiesbaden 2018, ISBN 978-3-658-21076-2, S. 30–33, doi:10.1007/978-3-658-21077-9_4.
  4. Steve Yegge: Execution in the Kingdom of Nouns. steve-yegge.blogspot.com. 30. März 2006. Abgerufen am 3. Juli 2010..
  5. Timothy Boronczyk: What’s Wrong with OOP. zaemis.blogspot.com. 11. Juni 2009. Abgerufen am 3. Juli 2010..
  6. Scott Ambler: A Realistic Look at Object-Oriented Reuse. drdobbs.com. 1. Januar 1998. Abgerufen am 4. Juli 2010..
  7. Asaf Shelly: Flaws of Object Oriented Modeling. Intel® Software Network. 22. August 2008. Abgerufen am 4. Juli 2010..
  8. Justin James: Multithreading is a verb not a noun. techrepublic.com. 1. Oktober 2007. Abgerufen am 4. Juli 2010..
  9. Asaf Shelly: HOW TO: Multicore Programming (Multiprocessing) Visual C++ Class Design Guidelines, Member Functions. support.microsoft.com. 22. August 2008. Abgerufen am 4. Juli 2010..
  10. Ted Neward: The Vietnam of Computer Science. Interoperability Happens. 26. Juni 2006. Archiviert vom Original am 4. Juli 2006. Abgerufen am 2. Juni 2010..
  11. Alexander Chatzigeorgiou: Performance and power evaluation of C++ object-oriented programming in embedded processors. In: Information and Software Technology. 45. Jahrgang, Nr. 4, 2003, ISSN 0950-5849, S. 195–201, doi:10.1016/S0950-5849(02)00205-7.
  12. Luca Cardelli: Bad Engineering Properties of Object-Oriented Languages. In: ACM Comput. Surv. 28. Jahrgang. ACM, 1996, ISSN 0360-0300, S. 150, doi:10.1145/242224.242415 (@1@2Vorlage:Toter Link/lucacardelli.name(Seite nicht mehr abrufbar, Suche in Webarchiven: lucacardelli.name) [abgerufen am 21. April 2010]).
  13. Thomas Potok, Mladen Vouk, Andy Rindos: Productivity Analysis of Object-Oriented Software Developed in a Commercial Environment. In: Software – Practice and Experience. 29. Jahrgang, Nr. 10, 1999, S. 833–847 (@1@2Vorlage:Toter Link/www.csm.ornl.gov(Seite nicht mehr abrufbar, Suche in Webarchiven: ornl.gov) [abgerufen am 21. April 2010]).

Siehe auch

[Bearbeiten]

Seiteninformation

[Bearbeiten]

Diese Lernresource können Sie als Wiki2Reveal-Foliensatz darstellen.

Wiki2Reveal

[Bearbeiten]

Dieser Wiki2Reveal Foliensatz wurde für den Lerneinheit Mathematische Modellbildung' erstellt der Link für die Wiki2Reveal-Folien wurde mit dem Wiki2Reveal-Linkgenerator erstellt.

Wikipedia2Wikiversity

[Bearbeiten]

Diese Seite wurde auf Basis der folgenden Wikipedia-Quelle erstellt: