2. Programmieren gegen Schnittstellen Advanced Programming Techniques Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt Sommersemester 2011 1
Einordnung in den gesamten Kurs 2 1. Einführung 2. Programmieren gegen Schnittstellen 3. Software-Kategorien 4. Dokumentieren und Testen 5. Design Patterns 6. Komponenten 7. Regeln zum Design von Komponenten 8. Fehlerbehandlung 9. Konfigurationsmanagement 10. Debugging, Tracing, Logging 11. Sicherheit 12. Funktionale Programmierung: Scala 13. Language-Oriented Programming 14. Refactoring
Agenda Prinzipien Schnittstellen Literatur 3
Die Urmutter aller Design-Prinzipien: Orthogonalität / Separation of Concerns Dimension 2 Eine Änderung in einer Dimension hat keine Auswirkung auf andere Dimensionen, z.b. DBMS-Technologie kann unabhängig von GUI-Technologie geändert werden Dimension 1 Trennung der Zuständigkeiten (Separation of concerns): Trenne Software unterschiedlicher Belange in verschiedene Bereiche auf 4
Geheimnisprinzip (Information Hiding) David L. Parnas Das Geheimnisprinzip eines der wichtigsten Konzepte des Software Engineering: Die Implementierung komplexer Datenstrukturen soll in einer Klasse (Komponente) verborgen werden. Nutzer erhalten nur eine abstrakte Sicht auf die Daten (abstrakte Datenstrukturen) Der Datenzugriff erfolgt nur über die Methoden (Encapsulation = Kapselung). 5
Diskussion Geheimnisprinzip Die Datenkapselung hat folgende Vorteile: - Gekapselte Klassen sind einfacher nutzbar (reduzierte Komplexität) - Sie können ohne Auswirkung auf andere Klassen geändert werden Es bestehen jedoch auch Nachteile: - Zugriff etwas weniger effizient - Eingeschränkte Flexibilität des Zugriffs, da nur über Methoden der Klasse auf die Daten zugegriffen werden kann Folge: Es werden stets zwei Rollen unterschieden: Anbieter und Nutzer 6
Agenda Prinzipien Schnittstellen Literatur 7
Programmieren gegen Schnittstellen (Interfaces) Interfaces 8 Das Programmieren gegen cd Collections Schnittstellen (Interfaces) ist eines der wichtigsten Konzepte der Programmierung Interface: - beschreibt die Außensicht, das heißt die Sicht des Nutzers - ist einfach - ist vielseitig verwendbar Klasse: - enthält die Innensicht, das heißt die Sicht des Programmierers - ist komplex - ist speziell «interface» List + add() : void + get() : void + contains() : void + remove() : void «realize» ArrayList «realize» LinkedList
Analogie Mensch Jeder Mensch hat viele Eigenschaften. Aber für bestimmte Personengruppen sind nur bestimmte Eigenschaften wichtig: - Verkehrspolizist: Führerschein - Arbeitgeber: Lebenslauf, Aufgaben, Einkommen - Bibliothek: Leihausweis - Familie: jede Menge anderer Eigenschaften Eine Klasse, zum Beispiel Customer, kann viele Eigenschaften haben. Aber für bestimmte Collaborations sind nur bestimmte Eigenschaften wichtig: Kundenverwaltung: fachliche Attribute und Funktionen SortedSet: Comparable Client-Server Kommunikation: Serializable 9
Schnittstellen oder wie man es auch sehen kann ;-) Patient Katze Haustier 10 class Katze implements Patient, Haustier { } Quelle: Roger King
Definition Schnittstelle und Operation 11 Eine Schnittstelle (Interface) fasst Operationen zusammen. Sie wird spezifiziert durch: - (1) Einen eindeutigen Namen, - (2) Die Menge der zugehörigen Operationen - (3) Ein Schnittstellen-Protokoll im Sinne von Reihenfolgen und Restriktionen beim Aufruf der Operationen. Operationen (Operations) beschreiben das Verhalten von Komponenten. Sie werden spezifiziert durch: - (1) Signatur: Name der Operation, Parameter und Rückgabewerte und deren Typen, Ausnahmen - (2) Semantik: Verhalten der Operation - (3) Nichtfunktionale Eigenschaften: z.b. Performanz, Verfügbarkeit, Kosten etc.
Spezifikation von Schnittstellen Schnittstelle Name Operationen Signatur Semantik Schnittstellenname public interface OrderManager { Rückgabetyp Operationsname Eingabeparameter und -typ Order placeorder (Customer c, Article a) throws NotAvailableException; } Prosa, Vorbedingungen, Nachbedingungen, etc. Ausnahme Nicht-funktionale Eigenschaften Protokoll Prosa Prosa, Sequenzdiagramme etc. 12
Vorbedingungen und Nachbedingungen 13 Vorbedingungen (Pre-conditions) - Bedingungen, die vor Ausführung der Operation erfüllt sein müssen, z.b. Eigenschaften der Parameter - muss der Nutzer der Operation zusichern - der Anbieter darf die Arbeit einstellen, wenn die Vorbedingung verletzt ist (zusätzliche Prüfung erhöht die Sicherheit: bei Verletzung Abbruch mit Ausnahme) - Beispiel: Artikel muss verfügbar sein, wenn er bestellt wird Nachbedingungen (Post-conditions) - Bedingungen, die nach Ausführung der Operation erfüllt sein müssen, z.b. Eigenschaften des Ergebnisses - Muss der Anbieter der Operation zusichern - Nutzer der Operation kann davon ausgehen (Zusätzliche Prüfung erhöht die Sicherheit: bei Verletzung Abbruch mit Ausnahme) - Beispiel: Nach erfolgreicher Bestellung ist Rechnung erzeugt
Deklaration eines Interface in Java Interfaces enthalten: - Instanzmethoden - Konstanten Interfaces haben keine Konstruktoren. Interfaces enthalten keine Implementierung. interface Customer { public String getname(); public void setname(string name); } 14
Nutzung eines Interface in Java Man sagt: Eine Klasse implementiert ein Interface, wenn sie jede einzelne Methode des Interfaces bereitstellt. Eine Klasse kann beliebig viele Interfaces implementieren. Ein Interface kann von beliebig vielen Klassen implementiert werden. Eine Referenz auf ein Interface kann überall dort im Code eingesetzt werden, wo auch eine Referenz auf eine Klasse erlaubt ist. class CustomerImpl implements Customer { public CustomerImpl(String name) {...} public String getname() {...} public void setname(string name) {...} } 15
Beispiel: Zugriff auf Kundendaten (mit Interface) Customer mycustomer = new CustomerImpl("Willi");... Map <String, Customer> mycustomers; mycustomers = new HashMap <String, Customer>(); mycustomers.put("kunde1234", mycustomer);... mycustomer = mycustomer.get("kunde1234"); class SomeOtherClass { public boolean processcustomer(customer cust) {... }; } 16
Gegen Schnittstellen programmieren Configuration Application Interface <<uses>> Implementation 17
Nutzer- und Anbieterrollen: Interfaces Nutzer import import Anbieter // Deklaration und Konfiguration I i = new C(); // Nutzung i.m(); Nutzung C wird nur in der Konfiguration sichtbar Definition (Außensicht) public interface I { public void m (); } Implementierung (Innensicht) public class C implements I { public void m() { } } 18
Übersicht über Collections, Maps und deren Interfaces <<interface>> Collection <<interface>> Map <<interface>> List <<interface>> Set <<interface>> SortedMap HashMap TreeMap HashTable ArrayList Vector <<interface>> SortedSet LinkedList Stack TreeSet 19
Jede Menge *ables Adjustable Appendable Callable Cloneable Comparable Destroyable Externalizable Flushable Formatable Identifyable Iterable Joinable Manageable Printable Readable Referenceable Refreshable Runnable Scrollable Serializable Streamable Throwable Timeable Transferable Writeable 20
Nutzung von Schnittstellen: Das Prinzip der minimalen Annahme Prinzip der minimalen Annahme Nutze Schnittstellen, wo sie zur Verfügung stehen, z.b. List statt ArrayList, Map statt HashMap Nutze die allgemeinste Schnittstelle, die den erforderlichen Dienst bereitstellt, z.b. Collection statt List, Iterator statt ListIterator 21
Agenda Prinzipien Schnittstellen Literatur 22
Literatur Johannes Siedersleben (Hrsg.): Quasar: Die sd&m Standard-Architektur, Teil 1 https://www.fbi.h- da.de/fileadmin/personal/b.humm/publikationen/siedersleben_- _Quasar_1 sd_m_brosch_re_.pdf Abschnitt 1.3.1 Schnittstellen 23