Vorlesung Programmieren Software Design Dr. Dennis Pfisterer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/pfisterer
Software Design Wie schreibe ich gute Software? Weniger Bugs in der Software Wiederverwendbarkeit sicherstellen Einarbeitungszeit Dritter minimieren Entwurfsmuster, Dokumentation Wie entwickle ich große Projekte? Wie organisiert man Teamarbeit? Wie baut man Projekte? Versionskontrollsysteme, Build-Management Tools 3
Entwurfsmuster
Entwurfsmuster: Motivation Entwicklung guter Software ist zu großen Teilen Erfahrungssache Erfahrene Entwickler haben viele <Problem, Lösung>-Tupel Bei neuen Projekten mit ähnlichen Problemen sucht man nach bekannten Lösungsstrategien (und passt diese an das neue Problem an) Wissen typischerweise nur in Köpfen verfügbar, nicht in Textform Entwickler sollen das Rad nicht jedes mal neu erfinden Aber: Wie lernen junge, unerfahrene Entwickler solche Muster? Kann man den Lernzyklus verkürzen? 5
Entwurfsmuster: Motivation Letzte große Entwicklungssprünge in der Softwaretechnik Assembler Strukturierte Programmierung Objektorientierte Programmierung???? Alleine die Objektorientierung garantiert keine gute Software Nicht nur Vererbung, Kapselung, Polymorphie sind entscheidend Wichtig sind die Interaktionen der einzelnen Klassen und Objekte Hier helfen Regeln ( Best-Practices ) Diese sind als Muster, Templates, Patterns bekannt geworden 6
Entwurfsmuster Abstraktion von konkreten Problemen zu abstrakten Lösungen für eine Klasse von Problemen führt zu Mustern Diese Problem-Lösungs-Paare zerfallen auf natürliche Art so in Gruppen von ähnlichen Problemen und Lösungen, dass sowohl für die Probleme als auch für die Lösungen ein Muster erkennbar ist. (aus [1]) Formalisiert durch Erich Gamma in seiner Dissertation in den 90ern Systematische Auflistung genereller Lösungsvorlagen für wiederkehrende Entwurfsprobleme der Softwareentwicklung Erweitert und zum Standardwerk geworden Etwas über 20 Entwurfsmuster Erich Gamma, Richard Helm, Ralph Johnson und John Vlissides (siehe Literatur) [1] R. Johnson: An Introduction to Patterns, Reports on Object Analysis and Design 7
Entwurfsmuster Ein Muster sollte/kann folgende Eigenschaften aufweisen: Löst ein oder mehrere Probleme Bietet ein erprobtes, in der Praxis bewährtes Konzept Geht über das offensichtliche hinaus Stellt Beziehungen zu anderen Mustern her Diskutiert Vor-/Nachteile beim Einsatz dieses Musters Nutzen von Entwurfsmustern Allgemeingültige Beschreibung einer Lösung für eine bestimmte Klasse von Entwurfsproblemen Unabhängig von Programmiersprachen Lösungen bekommen einen Namen Vereinfachung der Diskussion unter Entwicklern 8
Entwurfsmuster: Nutzen Wer alles kann, braucht keine Entwurfsmuster Strukturen der Entwurfsmuster sind nicht revolutionär Viele der Muster gab es schon lange vor deren Entdeckung Aber Bieten guten Einstieg zum strukturierten Lösen von Problemen Möglichkeit, ohne Umwege zu guten Entwürfen zu gelangen Erleichtern den Sprachgebrauch Daher Lektüre von Entwurfsmuster. Elemente wiederverwendbarer objektorientierter Software (Gamma et al.) sehr empfohlen 9
Entwurfsmuster nach Gamma et al. Unterteilung in Klassen von Mustern Erzeugende Muster (Erzeugung von Objekten) Strukturelle Muster (Vereinfachung der Struktur zwischen Komponenten) Verhaltensmuster (Zusammenarbeit, Nachrichtenaustausch) Liste der Muster Erzeugende Muster Strukturelle Muster Verhaltensmuster Abstract Factory (Abstrakte Fabrik) Adapter Chain of Responsibility (Zuständigkeitskette) Builder (Erbauer) Composite (Kompositum) Command (Kommando) Factory Method (Fabrikmethode) Bridge (Brücke) Interpreter Prototype (Prototyp) Decorator (Dekorierer) Iterator Singleton (Einzelstück) Facade (Fassade) Mediator (Vermittler) Heute Flyweight (Fliegengewicht) Proxy (Stellvertreter) Memento Null Object (Nullobjekt) Observer (Beobachter) State (Zustand) Strategy (Strategie) Template Method (Schablonenmethode) Visitor (Besucher) 10
Singleton-Entwurfsmuster Verhindert, dass von einer Klasse mehr als ein Objekt/eine Instanz erzeugt werden kann Wird verwendet, wenn von einer Klasse nur eine Instanz existieren darf Anwendungsbeispiele Klasse mit Konfigurationsoptionen für die Anwendung Log-Klasse um Debugausgaben an zentraler Stelle zu sammeln Zentrale Druckerwarteschlange Verwaltung einer Menge von Ressourcen 11
Singleton-Entwurfsmuster UML Diagramm Singleton Erzeugt und verwaltet das einzige Objekt der Klasse Bietet globalen Zugriff auf dieses Objekt über Methode (getinstance) Konstruktor ist privat keine Instanziierung von außen getinstance ist eine Klassenmethode ( static) Das private Attribut instance ist Klassenattribut (static) 12
Singleton-Implementierung in Java 13
Singleton-Implementierung in C++ 14
Singleton: Vorteile Singleton bietet Vorteile gegenüber globalen Variablen Zugriffskontrolle wird ermöglicht Singleton kann durch Unterklassenbildung spezialisiert werden Je nach Situation kann eine Instanz einer Unterklasse verwendet werden Entscheidung kann zur Laufzeit getroffen werden Singletoninstanz muss nur erzeugt werden, wenn sie benötigt wird Sollten später mehrere Objekte benötigt werden, ist eine Änderung leichter möglich als bei globalen Variablen 15
Singleton: Nachteile Singletons sind ähnlich zu globalen Variablen Exzessive Verwendung führt weg von objektorientierter Implementierung hin zu prozeduraler Abhängigkeiten zur Singleton-Klasse werden verschleiert Vorhandensein des Singletons ist aus Interface nicht ersichtlich (nur aus Implementierung) Es ist nicht ersichtlich, dass sich mehrere Klassen/Objekte eine Instanz teilen Zeitpunkt der Freigabe von Ressourcen ist bei Singletons oft unklar 16
Entwurfsmuster: Observer Weitergabe von Änderungen an von diesem Objekt abhängige Strukturen Auch bekannt unter Publish/Subscribe Beispiel: Darstellung des aktuellen Pulses als Text und Diagramm auf der GUI eines Medizingerätes Realisierung Puls-Objekt speichert aktuellen Puls Änderungen am Zustand des Pulst-Objektes Aktualisierung der GUI Ziel: Puls-Objekt soll die Schnittstelle der abhängigen Objekte nicht kennen Zur Minimierung von Abhängigkeiten im Code (bessere Wiederverwendbarkeit) 17
Entwurfsmuster: Observer Beobachtetes Objekt (hier: das Puls-Objekt) Bietet Mechanismus, um Observer an- und abzumelden Kann diese über Änderungen informieren Kennt nur Observer-Schnittstelle, nicht Struktur der Beobachter Meldet Änderungen unspezifisch an die Beobachter weiter ( ich habe meinen Zustand geändert ) Beobachter (hier: die GUI Elemente) Implementieren eine Methode um benachrichtigt zu werden Erfragen dann die relevanten Daten vom beobachteten Objekt 18
Entwurfsmuster: Observer UML Diagramm Beobachteter registriere(beobachter) entferne(beobachter) benachrichtige() Beobachter * Beobachter aktualisiere() Beobachteter Besitzt eine Menge von Beobachtern Ruft bei Änderungen die Methode aktualisiere bei allen Beobachtern auf 19
Entwurfsmuster: Observer 20
Entwurfsmuster: Observer 21
Entwurfsmuster: Vor-/Nachteil Vorteile Observables und Observer können unabhängig variiert werden Auf abstrakte und minimale Art lose gekoppelt Das beobachtete Objekt hat keine Kenntnis über Struktur der Observer Multicasts werden unterstützt Nachteile Hohe Observerzahl führt zu hohen Aktualisierungskosten Observer werden benachrichtigt, auch wenn die konkrete Änderung sie nicht betrifft Ruft ein Observer während einer Änderung eine Änderungsmethode auf, kann es zu Endlosschleifen kommen 22
Dokumentation von Programmen
Dokumentation von Programmen Dokumentationsformen Für Endkunden Handbuch zur Nutzung Für Entwickler Dokumentation für Verwendung/Weiterentwicklung Dokumentation von Entwicklern für Entwickler ist wichtig Überblick über Gesamtprojekt (z.b. in Code anderer Entwickler) Spezielle Annahmen, Probleme oder Fehlerfälle verstehen Funktionsweise der Methode verstehen Semantik von Parametern und Rückgabewerten verstehen Sinnvoll, die Dokumentation nah am Quelltext zu erstellen Getrennte Dokumentation (z.b. Word) läuft Gefahr, niemals aktuell zu sein 24
Dokumentation von Programmen In der Vergangenheit haben sich verschiedene Werkzeuge etabliert Javadoc für Java Doxygen für C++ (und andere: Java, C, Java, Python, C#, ) Perldoc für Perl Funktionsweise bei allen Werkzeugen gleich Entwickler schreiben spezielle Kommentare in den Quelltext Programm (z.b. javadoc) extrahiert Kommentare und erstellt Dokumentation Typischerweise verschiedenste Ausgabeformate wie HTML, PDF, Gesamte API Dokumentation von Java ist so generiert http://java.sun.com/javase/7/docs/api/ 25
Javadoc Beispiel 26
Javadoc Javadoc Kommentare beginnen mit /** statt /* Der erste Satz danach ist die Kurzbeschreibung Die folgenden Sätze sind die Langbeschreibung Spezielle Tags beginnen mit @ @param ParameterName Text @return dokumenation @see package.class#member Text @throws Exception Text {@link package.class#member Text} @author author-name @version versionsnummer @since versionsnummer @deprecated {@code CODE} 27
Javadoc Packages dokumentiert durch spezielle HTML-Datei Pro Package eine Datei mit festem Namen (package.html) Javadoc verarbeitet diese Datei wie folgt Kopiert den Inhalt zwischen den Tags <body> und </body> unter die Überblickstabelle eines Package. Ersetzt alle @see, @since or {@link} tags Kopiert den ersten Satz in den Kopf der Packetüberblicksseite 28
Auswahl zu dokumentierender Klassen Durch Packagenamen -sourcepath: Speicherort der.java -Dateien (z.b. src/) Angabe des packages: de.uniluebeck.test Durch Dateinamen Angabe der Dateien: test.java 29
Aufruf von Javadoc 30
Javadoc Ausgabe 31
Literatur Entwurfsmuster. Elemente wiederverwendbarer objektorientierter Software Erich Gamma, Richard Helm, Ralph E. Johnson, John Vlissides, Addison Wesley, München 2004, ISBN 3-8273-2199-9 Design Patterns. Elements of Reusable Object-Oriented Software Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Addison Wesley, 1995, ISBN 0-201- 63361-2 (englisch) How to Write Doc Comments for the Javadoc Tool http://java.sun.com/j2se/javadoc/writingdoccomments/ Doxygen documentation system Für C++, C, Java, Objective-C, Python, IDL, Fortran, VHDL, PHP, C#, D http://www.doxygen.org Ant http://ant.apache.org 32