Software-Entwicklung: Konzepte der Objektorientierung 1
Übersicht Objektorientierte Softwareentwicklung Klasse und Objekt Attribut und Operation Schnittstelle Taxonomie und Vererbung Weitere Begriffe 2
Softwareentwicklung Die Entwicklung hochwertiger Software ist aufwändig und wird immer aufwändiger... Ein paar Gründe: Umfang der zu erstellenden Applikationen Grafische Benutzeroberflächen (GUIs) Verteilte Applikationen Verteilte Datenhaltung... 3
Soziale Komplexität Software-Entwicklung ist nicht ausschliesslich eine technische Aufgabe, sondern auch ein komplexer sozialer Prozess Softwaresysteme sind (in unterschiedlichem Masse) in ein soziales Umfeld eingebettet Bei der Entwicklung solcher Systeme spielt auch linguistisches und psychologisches Wissen sowie kommunikative Fähigkeiten eine wichtige Rolle 4
Abstraktion Die Geschichte der Software- Entwicklung ist verbunden mit einer kontinuierlichen Steigerung der Abstraktion Bitmuster Makrobefehle Prozeduren Abstrakte Datentypen Objekte Frameworks Entwurfsmuster Komponenten? 5
Objektorientierung Eine bestimmte Art, Software zu organisieren Integration von Daten und Prozeduren in Form von Objekten im Vordergrund Objektorientiert: Resultierende Softwaresysteme Herangehensweisen bei der Softwareentwicklung Die verwendeten Programmiersprachen und Entwicklungsumgebungen 6
Begriffe und Abkürzungen OOA/OOD: Object-Oriented Analysis and Object-Oriented Design: Untersuchung eines Problembereichs und Entwickeln eines Modells auf der Grundlage objektorientierter Konzepte OOP: Object-Oriented Programming OOSE: Object-Oriented Software-Engineering OOPL: Object-Oriented Programming Language: Programmiersprache, die Konzepte der Objektorientierung wie Abstraktion, Kapselung, hierarchische Strukturen und Vererbung unterstützt; Beispiele: Smalltalk, C++ und Java 7
Analyse und Design Jeder Anwendungsrealisierung sollte unabhängig von der Art der Realisierung eine Planungsphase vorausgehen Es gibt verschiedene Methoden, Notationen und Werkzeuge, die diese Planungsphase zum Gegenstand haben Ziel ist es, die Komplexität, mit der man es bei der Entwicklung grosser Software-Systeme zu tun hat, beherrschbar zu machen 8
Notation UML: Unified Modelling Language Grady Booch, James Rumbaugh, Ivar Jacobson Object Management Group (OMG) als Standardisierungsgremium Die UML ist im wesentlichen eine Vereinheitlichung der grafischen Darstellung und Semantik der Modellierungselemente Es wird dadurch keine Methodik vorgegeben 9
Methodik Mit der UML ist eine Notation festgelegt Unabhängig davon existieren verschiedene Ansätze zur Entwicklungsmethodik (auch: Prozess, Vorgehensmodell) Beispiele: Unified Process (UP) Object Engineering Process (OEP) Rational Unified Process (RUP) 10
Werkzeuge Die UML ist ausdrucksstark und detailreich Die auf ihr basierenden Methoden sind oft für grösste Entwicklungsprojekte ausgelegt Es existieren leistungsfähige Werkzeuge, die Notation und Methodik unterstützen Aber: Das Zusammenspiel zwischen UML, Werkzeug und Methodik ist alles andere als trivial 11
Werkzeuge Im Normalfall muss Methodik und Werkzeugeinsatz daher an die Erfordernisse des Projekts angepasst werden Werkzeuge können dabei helfen, die Komplexität beherrschbar zu machen Aber: Werkzeuge können die fachlichen und methodischen Fehler ihrer Anwender nicht ausgleichen 12
Objektorientierte SwE Merkmale des objektorientierten Ansatzes: Ganzheitliche Arbeitsgegenstände: Einheit von Daten und Operationen (Klassenkonzept) statt deren Trennung Bessere Abstraktionsmöglichkeiten: Modellierung stärker vom Lösungs- in den Problembereich verschoben Methodische Durchgängigkeit: Ergebnisse können in die nachfolgenden Phasen übernommen werden 13
Abstraktion Alle Programmiersprachen unterstützen Abstraktionen, allerdings in unterschiedlichem Ausmass Je nach Art und Qualität der Abstraktionsmöglichkeiten lassen sich Probleme geringerer oder höherer Komplexität lösen Assemblersprachen bieten nur eine geringe Abstraktion der jeweiligen Maschinensprachen Sprachen wie Fortran, BASIC, und C sind Abstraktionen von Assemblersprachen 14
Abstraktion Bestimmte Sprachen unterstützen weitergehende Abstraktion, aber beschränkt auf bestimmte Problemklassen: Lisp: Listen als zentrale Datenstruktur Prolog: Folge von Entscheidungen und ein Backtracking-Algorithmus Objektorientierung: Nähe zwischen Problem- und Lösungsbereich abzubildende Elemente des Problembereichs können als Objekte beschrieben werden 15
Abstraktionsmittel Teil-Ganzes-Beziehung Ein Objekt besteht aus Teilen, es hat Teile Ein Auto besteht aus (hat) Motor, Karosserie, Sitzen In Programmiersprachen gibt es dafür Strukturen Oberbegriff-Beziehung Fasst mehrere Arten unter einem Begriff zusammen Ein Cabriolet ist ein Auto; Ein Auto ist ein Fahrzeug Nur in objektorientierten Programmiersprachen unterstützt 16
Methodische Durchgängigkeit Entwickler: Anwender: Entwickler: Anwender: "Was ist Euch wichtig?" "Der Kunde." "Was ist ein Kunde, welche Merkmale sind für Euch relevant?" "Der Kunde hat einen Namen, eine Anschrift, und eine Bonität, die wir überprüfen." 17
Methodische Durchgängigkeit "Der Kunde." Kunde name "Der Kunde hat einen Namen, eine Anschrift, und eine Bonität, die wir überprüfen." anschrift bonitaet bonitaetpruefen() Klasse 18
Methodische Durchgängigkeit Kunde name anschrift class Kunde { String name; Anschrift anschrift; Bonitaet bonitaet; bonitaet bonitaetpruefen() } public void bonitaetpruefen() {... } 19
Objektorientierte SwE Vorteile objektorientierter Software-Entwicklung: Nähe zum Problembereich: erleichtert Kommunikation zwischen Entwicklern und Experten Methodische Durchgängigkeit (s.o.) Objektorientierte Modelle sind änderungsfreundlicher, da Änderungen häufig lokal begrenzt möglich sind Abstraktionsmöglichkeiten ermöglichen bessere Wiederverwendbarkeit Aber: Auch mit diesem Ansatz ist es problemlos möglich, sehr schlechte Ergebnisse zu erzielen 20
Übersicht Objektorientierte Softwareentwicklung Klasse und Objekt Attribut und Operation Schnittstelle Taxonomie und Vererbung Weitere Begriffe 21
Modellbildung Objekte entstehen durch Zusammenfassung von Daten und zugehörigen Prozeduren Sie werden üblicherweise verwendet, um bestimmte Gegenstände oder abstrakte Konzepte des Aufgabenbereichs zu modellieren Dabei werden die Gegenstände vereinfacht, es wird von Details abstrahiert (Modellbildung) Strukturelle Ähnlichkeit zwischen Modell und modelliertem Bereich kann das Erarbeiten und Verstehen eines Modells vereinfachen 22
Klasse und Objekt Aus: Bernd Österreich Objektorientierte Softwareentwicklung 23
Klasse und Objekt Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte Ein Objekt ist eine zur Ausführungszeit vorhandene und für ihre Instanzvariablen Speicher belegende Instanz, die sich entsprechend dem Protokoll ihrer Klasse verhält Statt Objekt oder Instanz wird auch die Bezeichnung Exemplar verwendet 24
Klassen und Objekte Aus: Bernd Österreich Objektorientierte Softwareentwicklung 25
Klassen und Objekte Klasse «instance of» Objekt Kuh «instance of» Elsa 26
Übersicht Objektorientierte Softwareentwicklung Klasse und Objekt Attribut und Operation Schnittstelle Taxonomie und Vererbung Weitere Begriffe 27
Eigenschaften Objekte lassen sich folgendermaßen charakterisieren: Sie befinden sich in einem Zustand Sie zeigen ein bestimmtes Verhalten Zustand und Verhalten beschrieben durch: Attribute und Operationen Ausserdem spielen eine Rolle: Zusicherungen und Beziehungen 28
Eigenschaften Attribute In einem Objekt enthaltene Informationen bzw. Daten Operationen Beschreiben das Verhalten der Objekte (auch Methoden genannt) Zusicherungen Bedingungen, die Objekte erfüllen müssen Beziehungen Beziehungen zu anderen Klassen (Oberbegriff- Beziehung, Assoziation,...) 29
Klasse Notationselemente für Klassen Aus: Bernd Österreich Objektorientierte Softwareentwicklung 30
Klasse class Kreis { int radius; Point mittelpunkt; public void setradius(int neuerradius) { if (neuerradius > 0) { // Zusicherung radius = neuerradius;... } } public void setposition(point pos) {...} public void anzeigen() {...} public void entfernen() {...} } 31
Objekt Notationselemente für Objekte Aus: Bernd Österreich Objektorientierte Softwareentwicklung 32
Terminologie Der Zustand von Softwareobjekten wird beschrieben durch die im Objekt gespeicherten Daten Allgemein: Smalltalk: C++: Attribute Instanzenvariablen Elementdaten (member data) Das Verhalten der Objekten wird in Prozeduren beschrieben: Allgemein: Smalltalk: C++: Methoden, Operationen Methoden Elementfunktionen (member functions) 33
Klasse und Objekt: Abgrenzung Die Abgrenzung von Klassen und Objekten ist nicht immer ganz eindeutig Oft werden auch die Klassen zu den Objekten gezählt oder es gibt wie in den Delegation Languages überhaupt keine Unterscheidung zwischen Klassen und Instanzen In einigen Ansätzen lassen sich auch Klassen zu so genannten Metaklassen zusammenfassen; die Instanzen solcher Meta-klassen sind dann selbst Klassen 34
Nachrichtenaustausch Objekte senden sich gegenseitig Nachrichten zu Die Nachrichten führen dazu, dass Operationen ausgeführt werden Ein Objekt versteht genau die Nachrichten, zu denen es Operationen besitzt KreisEck setradius() Kreis 35
Nachrichtenaustausch Einem Objekt eine Nachricht schicken: Die zugehörige Operation für ein bestimmtes Objekt ausführen: einkreis setradius: 17. einkreis.setradius(17); "Smalltalk" // C++, Java Objektattribute sind gewöhnlich gekapselt und nur über entsprechende Operationen zugänglich Eine Nachricht kann von einem Objekt nur interpretiert werden, wenn es eine passende Operation besitzt 36
Spezielle Nachrichten Selektoren greifen auf den Zustand eines Objekts zu, ändern diesen aber nicht Konstruktoren erzeugen Instanzen von Klassen Destruktoren werden beim Löschen von Objekten aktiv Iteratoren erlauben den Zugriff auf Teilobjekte zusammengesetzter Objekte 37
Übersicht Objektorientierte Softwareentwicklung Klasse und Objekt Attribut und Operation Schnittstelle Taxonomie und Vererbung Weitere Begriffe 38
Kapselung und Schnittstelle Klassen fassen Attribute und Operationen zu einer Einheit zusammen Attribute sind nur i.a. indirekt über die Operationen der Klasse zugänglich (Datenkapselung) Die Schnittstelle legt fest, welche Operationen die Objekte einer Klasse ausführen können Die Implementierung realisiert die in der Schnittstelle festgelegten Operationen 39
Kapselung und Schnittstelle 40
Kapselung und Schnittstelle Die Trennung von öffentlicher Schnittstelle und interner Implementierung hat folgende Vorteile Die Schnittstelle dient zur Verwendung einer Klasse; sie versteckt alle für die Verwendung nicht relevanten Details und dient somit auch der Übersichtlichkeit Wenn die Schnittstelle stabil bleibt, kann die Implementierung einer Klasse modifiziert werden, ohne Einfluss auf andere Programmteile, die diese Klasse benutzen 41
Übersicht Objektorientierte Softwareentwicklung Klasse und Objekt Attribut und Operation Schnittstelle Taxonomie und Vererbung Weitere Begriffe 42
Taxonomie und Vererbung Vererbung, Generalisierung/Spezialisierung Klassen können Spezialisierungen anderer Klassen darstellen, d.h. Klassen können hierarchisch angeordnet werden Dabei übernehmen (erben) sie die Eigenschaften der ihnen übergeordneten Klassen Diese Eigenschaften können sie bedarfsweise spezialisieren (überschreiben) aber nicht eliminieren 43
Taxonomie und Vererbung Oberklasse Basisklasse Superklasse Unterklasse Subklasse Aus: Bernd Österreich Objektorientierte Softwareentwicklung 44
Taxonomie und Vererbung Substitution Objekte von Unterklassen müssen jederzeit auch anstelle von Objekten ihrer Oberklasse(n) eingesetzt werden können Mehrfachvererbung Wenn eine Klasse mehr als eine Oberklasse besitzen kann, spricht man von Mehrfachvererbung Warnung Man solle Vererbung vermeiden, wenn es Alternativen gibt 45
Strukturierung von Eigenschaften Jede Klasse soll für genau einen (sachlogischen) Aspekt des Gesamtsystems verantwortlich sein Die in diesem Verantwortlichkeitsbereich liegenden Eigenschaften sollen in einer Klasse zusammengefasst werden Eine Klasse soll keine Eigenschaften enthalten, die nicht zu diesem Verantwortungsbereich gehören Kohärenzprinzip 46
Strukturierung von Eigenschaften Aus: Bernd Österreich Objektorientierte Softwareentwicklung 47
Strukturierung von Eigenschaften Anzeigen und Entfernen sind gemeinsame Eigenschaften aller geometrischen Figuren Sie müssen aber individuell, abhängig von den Eigenschaften der Subklassen, realisiert werden In der Klasse GeomFigur sind die Operationen anzeigen() und entfernen() daher abstrakte Operationen 48
Strukturierung von Eigenschaften class GeomFigur extends Object { int x, y; boolean sichtbar; public abstract void anzeigen(); public abstract void entfernen(); public void setposition(int x, y) { if (sichtbar) { entfernen(); this.x = x; this.y = y; anzeigen(); } else { this.x = x; this.y = y; } } } 49
Strukturierung von Eigenschaften class Rechteck extends GeomFigur { int a, b; public void anzeigen() {... } public void entfernen() {... } public void seta(int a) { if (a > 0) { this.a = a; } } public void setb(int b) { if (b > 0) { this.b = b; } } } 50
Abstrakte Klassen Klassen, von denen keine konkreten Exemplare erzeugt werden können, bezeichnet man als abstrakte Klassen Abstrakte Klassen werden durch den Eigenschaftswert {abstact} unterhalb des Klassennamens oder durch kursiv gesetzten Klassennamen gekennzeichnet Im Beispiel wird es nur Objekte der Klassen Kreis, Rechteck und Dreieck geben, nicht aber von GeomFigur 51
Abstrakte Klassen Aus: Bernd Österreich Objektorientierte Softwareentwicklung 52
Übersicht Objektorientierte Softwareentwicklung Klasse und Objekt Attribut und Operation Schnittstelle Taxonomie und Vererbung Weitere Begriffe 53
Objektidentität Jedes Objekt ist per Definition unabhängig von seinen konkreten Attributwerten von allen anderen Objekten eindeutig zu unterscheiden Zu diesem Zweck werden künstlich erzeugte Schlüssel verwendet, die keinen inhaltlichen Bezug zu den Eigenschaften der Objekte haben In einem Programm aktive Objekte werden gewöhnlich durch ihre Speicheradresse identifiziert 54
Objektidentität Aus: Bernd Österreich Objektorientierte Softwareentwicklung 55
Sammlungen (Collections) Sammlungen (auch: Behälterklassen oder Containerklassen) sind Klassen, deren Objekte eine Menge von Objekten verwalten können Sammlungen sind in der Regel in Standardklassenbibliotheken definiert Sie verfügen unter anderem über Operationen zum Anfügen und Entfernen von Objekten Es gibt verschiedene Arten von Sammlungen grundsätzlich lassen sich sequentielle und assoziative Sammlungen unterscheiden 56
Sammlungen (Collections) Sammlungsklassen einer Smalltalk-Bibliothek Aus: Bernd Österreich Objektorientierte Softwareentwicklung 57
Polymorphie Polymorphie: Eine Operation kann sich (in unterschiedlichen Klassen) unterschiedlich verhalten Statische Polymorphie: Bereits zur Übersetzungszeit eines Programms, wird entschieden, welche Ausprägung einer Operation aufgerufen wird ("frühes Binden") Dynamische Polymorphie: Der genaue Speicherort einer Funktion wird erst ermittelt, wenn der Aufruf stattfindet, also dynamisch zur Laufzeit des Programms ("spätes Binden") 58
Dynamische Polymorphie Aus: Bernd Österreich Objektorientierte Softwareentwicklung 59
Dynamische Polymorphie void dostuff(shape& s) { s.erase(); //... s.draw(); } Circle c; Triangle t; Line l; dostuff(c); dostuff(t); dostuff(l); 60