Objektorientierte Programmierung OOP
KE 1 Von der Aufgabenstellung zum Programm; Begriffe, Beispiele und Definitionen
KE 1 Von der Aufgabenstellung zum Programm; Begriffe, Beispiele und Definitionen
Kartei Details
Karten | 81 |
---|---|
Lernende | 11 |
Sprache | Deutsch |
Kategorie | Informatik |
Stufe | Universität |
Erstellt / Aktualisiert | 08.02.2013 / 28.11.2022 |
Weblink |
https://card2brain.ch/box/objektorientierte_programmierung_oop3
|
Einbinden |
<iframe src="https://card2brain.ch/box/objektorientierte_programmierung_oop3/embed" width="780" height="150" scrolling="no" frameborder="0"></iframe>
|
Begriff: enthält Beziehung (include)
Wenn ein Anwendungsfall das Verhalten eines anderen mit einschließt, so wird dieses durch eine Enthält-Beziehung ausgedrückt. Dabei zeigt ein gestrichelter Pfeil Enthält-Beziehung mit einer unausgefüllten Spitze auf den Anwendungsfall, der enthalten ist. Der Pfeil ist mit <<include>> beschriftet.
Begriff: Erweitert-Beziehung (extend)
Die Erweitert-Beziehung drückt aus, dass ein Anwendungsfall an einer bestimmten Stelle unter bestimmten Bedingungen durch einen anderen erweitert wird. Die Beziehung wird häufig dafür benutzt, optionales Verhalten vom Standardverhalten zu unterscheiden. Dabei zeigt ein gestrichelter Pfeil mit einer unausgefüllten Spitze auf den Anwendungsfall, der erweitert wird. Der Pfeil ist mit dem Stereotyp <<extend>> beschriftet.
Eine Generalisierung zwischen zwei Klassen drückt aus, dass die speziellere Klasse die Eigenschaften, das Verhalten und die Beziehungen der Allgemeineren erbt und dabei erweitern oder überschreiben kann. Ein Exemplar der spezielleren Klasse kann überall dort verwendet werden, wo ein Exemplar der allgemeineren Klasse verwendet werden kann.
Die allgemeinere Klasse wird in der Regel als Oberklasse und die speziellere als Unterklasse bezeichnet. Der Umstand, dass die Unterklasse von der Oberklasse Eigenschaften und verhalten übernimmt, wird auch Vererbung genannt.
Wenn eine Klasse die Spezialisierung mehrere anderer Klassen ist, so nennen wir dies Mehrfachvererbung.
Die Zusammenarbeit von Objekten läuft mit Hilfe von Nachrichten ab. Ein Objekt kann eine Nachricht an ein anderes Objekt oder gelegentlich auch sich selbst verschicken. Eine solche Nachricht enthält die Information, welche Methode ausgeführt werden soll, und wenn nötig noch weitere Informationen, die das Objekt benötigt, um die Nachricht zu verarbeiten. Das versendende Objekt wartet in der sequenziellen Programmierung so lange, bis das empfangende Objekt eine Antwort sendet, und setzt erst dann seine Arbeit fort
Stellen wir uns vor, eine Kundin will einen Strauß Blumen kaufen. Durch die Eingabe des Verkäufers wird das für einen Verkauf zuständige Objekt zunächst eine Nachricht an das Lagerobjekt verschickt, die es auffordert zu überprüfen, ob alle benötigten Blumen in ausreichender Anzahl verfügbar sind, und, wenn dies der Fall ist, die benötigten Blumen aus dem Lager zu entnehmen. Anschließend wird ein neues Rechnungsobjekt erzeugt. Dieses erhält die Nachricht, den Blumenstrauß als Rechnungsposten hinzuzufügen. Sodann kann das Rechnungsobjekt nach dem endgültigen Preis gefragt werden und nach erfolgreicher Bezahlung darüber informiert werden.
Bemerkung: Sequenzielle Programmierung
In diesem Kurs werden wir uns nur mit sequenzieller Programmierung beschäftigen. In der sequenziellen Programmierung wird zu jedem Zeitpunkt des Programms nur eine Aktion ausgeführt. In der nebenläufigen oder parallelen Programmierung können hingegen mehrere Aktionen gleichzeitig ausgeführt werden.
Beispiel: Ungenügende Modellanalyse
Ein Unfall einer Lufthansa-Maschine beim Landeanflug konnte eindeutig auf die unvollständige Modellierung der Phänomene der Wirklichkeit zurückgeführt werden:
Das Bremssystem dieser Maschine war so ausgelegt, dass der Umkehrschub, der ein Flugzeug nach der Landung stark abbremst, erst eingeschaltet werden kann, wenn die Maschine tatsächlich gelandet ist. Dadurch sollte ein versehentliches Einschalten des Umkehrschubs in der Luft verhindert werden. Allerdings hatten die Ingenieure den Zustand des Gelandetseins so festgelegt, dass beide Fahrwerke mit einem vorgegebenen Anpressdruck auf der Fahrbahn aufliegenmüssen. Da an jenem Tag starker Regen und strenge Scherwinde herrschten, erreichte die Maschine trotz Bodenkontakt nicht den vorgesehenen Anpressdruck. Der Umkehrschub konnte nicht rechtzeitig aktiviert werden, und die Maschine rollte mit hoher Geschwindigkeit über die Landebahn hinaus.
Bemerkung: Zur systematischen Aufgabenbeschreibung müssen wir uns folgende Fragen stellen.
• Welche dinglichen und abstrakten Gegenstände werden bearbeitet, verändert oder tauchen in Kommunikationssituationen auf?
• Welche Eigenschaften zeichnen diese Gegenstände aus? • Welche Beziehungen bestehen zwischen ihnen?
• Wie wird mit ihnen umgegangen?
• Welche Rollen treten auf, und für welche Handlungen sind sie verantwortlich?
Begriff: Substantivanalyse
Bei der Substantivanalyse werden Substantive als mögliche Kandidaten für Klassen, Attribute oder Assoziationen und Verben als Kandidaten für Methoden identifiziert. Konkrete Attributwerte oder Objekte interessieren bei der Erstellung des Klassenmodells eher weniger.
Betrachten wir die Fallstudie, so finden wir unter anderem uninteressante Substantive und konkrete Namen wie Zukunft, Geschäftsprozesse, Adas Blumenland und Ada König. Wir stoßen jedoch auch auf Klassenkandidaten wie Pflanze, Dekorationsartikel und Chefin.
Begriff: Assoziation im UML-Klassendiagramm
Eine Assoziation zwischen zwei Klassen wird als einfache Linie zwischen den Klassen angedeutet. Der Name der Assoziation wird an die Linie geschrieben. Solange keine einfachen Pfeilspitzen an den Enden angegeben oder die Enden mit einem X gekennzeichnet werden, ist die Navigierbarkeit der Assoziation undefiniert. Die Navigierbarkeit gibt an, welches der beteiligten Objekte einen Verweis auf das jeweils andere besitzt.
Begriff: Multiplizitäten
Um auszudrücken, dass eine Rechnung für genau einen Kunden ausgestellt wird, steht an dem Ende der Assoziation bei der Klasse Kunde eine 1. Die Aussage, dass es zu einem Kunden mehrere Rechnungen geben kann, wird durch ein * an dem anderen Ende der Assoziation dargestellt. Ein * steht dabei für beliebig viele.
Um konkrete Situationen beschreiben zu können, ist es manchmal hilfreich Objekte darzustellen. In einem UML-Objektdiagramm wird ein Objekt durch ein Rechteck dargestellt. In dem Rechteck stehen, durch einen Doppelpunkt getrennt, der Name und die Klasse des Objekts. Hat das Objekt keinen speziellen Namen, so kann dieser auch entfallen. Wenn gewünscht, kann auch noch ein Abschnitt für die Attributwerte ergänzt werden.
Will man die Zahlenfolge 6, 32, 1, 64, 12 sortieren, so handelt es sich dabei um ein konkretes Problem, für das man auch einfach eine Lösung benennen kann. Die dazugehörige Problemklasse ist jedoch die Sortierung einer beliebigen Zahlenfolge mit einer endlichen Anzahl an Elementen. Dafür kann man keine konkrete Lösung angeben, sondern lediglich ein Verfahren beschreiben, das alle Probleme dieser Art löst. Man könnte das Problem noch allgemeiner formulieren, wenn man nicht nur Zahlenfolgen, sondern Folgen mit beliebigen Elementen mit einer eindeutigen Ordnung sortieren will.
Ein Algorithmus ist eine wohldefinierte Verfahrensbeschreibung, die aus einem oder mehreren Eingabewerten einen oder mehrere Ausgabewerte mit bestimmten Eigenschaften produziert. Ein Algorithmus löst dabei immer eine Klasse von Problemen.
Eigenschaften: Algorithmus
• Terminierung: Ein Algorithmus muss bei allen möglichen Eingaben nach endlich vielen Schritten beendet sein und ein Ergebnis liefern. • Finitheit: Die Beschreibung des Algorithmus muss endlich sein, ebenso wie der zur Ausführung benötigte Speicher. • Effektivität: Alle Schritte eines Algorithmus müssen eindeutig und in einer endlichen Zeit ausführbar sein. • Determiniertheit: Ein Algorithmus liefert bei den gleichen Eingaben immer das gleiche Ergebnis. • Determinismus: Bei einer Ausführung ist zu jedem Zeitpunkt eindeutig festgelegt, welcher Schritt als nächstes ausgeführt wird.
Ein Algorithmus muss effektiv sein, d. h. in einer endlichen Zeit das Problem lösen. Häufig sind jedoch effiziente Algorithmen gesucht, die das Problem zum Beispiel in relativ kurzer Zeit oder mit wenig Speicher lösen.
Verfahrensbeschreibungen aus anderen Bereichen als der Informatik erfüllen oft nicht alle Eigenschaften, die wir von einem Algorithmus verlangen.
Noch viel früher in der Zeitrechnung als Al-Chwârismî entwarf im 3. Jahrhundert v. Ch. der Mathematiker Euklid aus Alexandria in Ägypten in seinem Buch „Die Elemente“ das noch heute gebräuchliche Verfahren zur Bestimmung des größten gemeinsamen Teilers zweier natürlicher Zahlen. Der nachfolgende Algorithmus bestimmt den größten gemeinsamen Teiler der positiven ganzen Zahlen a und b. 1. Wenn b > a ist, vertausche a und b. 2. Sei c der Rest der Division von a durch b. 3. Wenn c = 0 ist, dann ist der Algorithmus zu Ende und b das Ergebnis. 4. a wird der Wert von b zugewiesen und b der Wert von c. 5. Fahre mit Schritt 2 fort.
Ein Algorithmus ist korrekt, wenn er sich bei der Ausführung so verhält, wie wir dies bei der Formulierung beabsichtigten. In kritischen Anwendungsbereichen wie der Flugsicherung, der Medizin oder der Prozesssteuerung können durch inkorrekte Algorithmen verursachte Fehlfunktionen katastrophale Schäden anrichten. Ein fehlerhafter Algorithmus in einem Chipentwurf kann erhebliche Kosten für den verantwortlichen Hersteller nach sich ziehen, wenn der Fehler erst nach Auslieferung der Prozessoren entdeckt wird.
Beispiel: Spezifikation des Sortierproblems
Die Aufgabe eines Sortieralgorithmus besteht darin, eine gegebene Folge von Werten
hd1, d2, d3, . . ., dni
gemäß einer vorgegebenen Ordnung „≤“ in eine permutierte Folge:
hd ′ 1 , d ′ 2 , d ′ 3 , . . ., d ′ n i
zu bringen, sodass gilt:
d ′ 1 ≤ d ′ 2 ≤ d ′ 3 ≤ · · · ≤ d ′ n
Die Ausgangsreihe ist eine Permutation der Eingangsreihe.
Eine Permutation ist eine Umordnung einer Folge von Elementen in einer Weise, dass kein Element hinzugefügt wird oder verloren geht und auch kein Element verändert wird. Die Anzahl der Permutationen einer Folge mit n Elementen ergibt sich zu n! (Fakultät).
Begriff: Komplexität
Die Komplexität eines Algorithmus befasst sich mit dem Mindestaufwand, den ein Algorithmus zur Lösung einer Aufgabe benötigt. Die Komplexitätstheorie untersucht sowohl den Rechenaufwand als auch den Speicherplatzbedarf. Beim Rechenaufwand ist nicht die effektive Ausführungszeit auf einem Rechner von Belang, sondern die Zahl der Bearbeitungsschritte in Abhängigkeit von der jeweiligen Eingangsgröße. Auf die Details der Komplexitätsbewertung von Algorithmen können wir im Rahmen dieses Kurse jedoch nicht weiter eingehen.
Es gibt noch eine Reihe weiterer Eigenschaften von Algorithmen und Programmen, wie Robustheit, Anpassbarkeit, Wiederverwendbarkeit, die je nach Anwendungsfall mehr oder weniger von Bedeutung sind. Unter Robustheit verstehen wir die Eigenschaft eines Algorithmus, auch in ungewöhnlichen Situationen definiert zu arbeiten, d. h. fehlerhafte und widersprüchliche Eingabedaten abzuweisen und auch umfangreiche Eingabedaten abzuhandeln. Der Aspekt Robustheit ergänzt den Aspekt Korrektheit, denn die Korrektheit betrifft das Verhalten eines Algorithmus im Rahmen der durch die Spezifikation erfassten Fälle und Bedingungen. Robustheit charakterisiert dagegen das Verhalten bei nicht spezifizierten Bedingungen.
Anpassbarkeit ist ein Maß für den Aufwand, mit dem ein Algorithmus an eine geänderte Spezifikation angepasst werden kann. Diese Eigenschaft ist vor allem für große Programmsysteme von erheblicher Bedeutung, weil die Auswirkungen von Änderungen an einer Stelle - anders als in kleinen Programmen - kaum zu überschauen sind.
Die Wiederverwendbarkeit drückt aus, wie einfach ein Algorithmus in vielen verschiedenen Anwendungen ohne Änderung benutzt werden kann.
Aktivität In der UML ist eine Aktivität ein benanntes Verhalten. Ein Aktivitätsdiagramm spezifiziert eine solche Aktivität.
Begriff: Aktionen, Kontrollknoten, Sequenz, Initialknoten und Aktivitätsendknoten (UML-Aktivitätsdiagramm)
Innerhalb der Aktivität befinden sich die verschiedenen atomaren Kontrollknoten, die die Ausführungsreihenfolge der Aktionen festlegen. Diese sind mit gerichteten Kanten miteinander verbunden. Eine Aktion wird ebenfalls durch ein Rechteck mit abgerundeten Ecken dargestellt. Sie kann beispielsweise für den Aufruf einer Methode stehen, in diesem Fall wird entweder der Methodenname in die Aktion geschrieben oder das Verhalten anderweitig beschrieben. Die Beschreibung kann umgangssprachlich sein, wie zum Beispiel „Adresse erfassen“, oder auch formaler Natur in Form von Berechnungen „c = a + b“. Später werden wir zur Beschreibung solcher Aktionen auch Java-Quelltext verwenden. Im einfachsten Fall besteht eine Aktivität aus einer Sequenz mehrerer Aktionen. Dafür benötigen wir noch den Initial- und den Aktivitätsendknoten. Der Erste von beiden kennzeichnet den Beginn des Ablaufs und der Zweite markiert das Ende der Ausführung.