Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Seminar Software Design Patterns

Ähnliche Präsentationen


Präsentation zum Thema: "Seminar Software Design Patterns"—  Präsentation transkript:

1 Seminar Software Design Patterns
Eclipse Patterns Seminar Software Design Patterns

2 Seminar Software Design Patterns Eclipse Patterns
Agenda Einführung in Eclipse IAdaptable Arbeitsbereichskern – Ressourcen Zustände persistent speichern mit Memento Lazy Loading mit virtuellen Proxies Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

3 Seminar Software Design Patterns Eclipse Patterns
Eclipse-Plattform Eine Kurzeinführung Konvention: Interfaces beginnen mit „I“ Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

4 Seminar Software Design Patterns Eclipse Patterns
„The Eclipse Platform is an IDE for anything, and for nothing in particular“ (Eclipse Website) Im November 2001 von IBM, Object Technology International (OTI) und acht weitern Firmen ins Leben gerufen In der Zwischenzeit sind mehr als 50 Firmen beteiligt Februar 2004: Umwandlung in eine unabhänige „not-for-profit corporation“ Ende Juni 2004: Release 3.0, Eclipse als Rich Client Plattform Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

5 Seminar Software Design Patterns Eclipse Patterns
Was ist Eclipse ? Eclipse verkörpert drei Dinge: Eine JAVA Entwicklungsumgebung Eine Plattform für Tool-Integration Eine Open Source-Gemeinde Das Eclipse SDK besteht aus drei Ebenen Plattform Java Development Tools (JDT) Plug-In Development Environment (PDE) Plattform JDT PDE Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

6 Variabler Plugin Mechanismus
Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

7 Laufzeitkern - IAdaptable
Erweiterung von Schnittstellen Konvention: Interfaces beginnen mit „I“ Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

8 Seminar Software Design Patterns Eclipse Patterns
Ziel Eclipse soll eine erweiterbare Plattform sein d.h. zusätzliche Dienste oder Verhaltensweise müssen zu vorhandenen Klassen hinzugefügt werde können API‘s müssen stabil bleiben (→ keine Interfaces abändern oder neue hinzufügen Strenge Trennung von Benutzeroberfläche und nicht zum UI gehörenden Teilen Nicht UI Schnittstellen dürfen nicht mit Details der Benutzeroberfläche verunreinigt werden  Wie erweitere ich die Definition einer Schnittstelle ohne die Definition der Basisschnittstelle zu ändern und ohne die Erweiterung offenzulegen Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

9 Seminar Software Design Patterns Eclipse Patterns
Beispiel IFile public interface IFile { } public interface IPropertySource { public interface IFile extends IPropertySource Probleme: bei vielen Service-Schnittstellen aufgeblähte Interfaces Soll die Properties Ansicht erst später hinzugeügt werden ist dies eine API Änderung IFile sollte nicht von der Benutzeroberfläche wissen Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

10 Exkurs: Adapter (Wrapper)
Passe die Schnittstelle einer Klasse an eine andere von ihren Klienten erwartete Schnittstelle an. Client Operation() Ziel Operation() AdaptierteKlasse SpezifischeOperation() Adapter Operation() Spezifische Operation Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

11 Lösung: Erweiterungsobjekt
„Vorwegnehmen dass die Schnittstelle eines Objekts zukünftig erweitert werden muss. Nach dem Muster Erweiterungsobjekt kann man einer Klasse Schnittstellen hinzufügen und Clients können abfragen, ob ein Objekt eine bestimmte Erweiterung hat.“ Möchte man dieses Muster implementieren stellen sich folgende Fragen Möchte ich ein einzelnes Objekt oder eine Klasse erweitern. Bei einem klassenbasierten Mechanismus fügt man Verhalten (Methoden) der ganzen Klasse hinzu, kann aber keinen Zustand (Felder) hinzufügen Wie wird eine Erweiterung beschrieben und identifiziert ? Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

12 Implementierung in Eclipse
Klassenbasierter Mechanismus Zusätzliches Verhalten wird durch eine Schnittstelle beschrieben Klassen die Anpassungsfähigkeit unterstützen implementieren die Schnittstelle IAdaptable public interface IAdaptable { public Object getAdapter(Class adapter); } Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

13 Beispiel für die Benutzung
Beispiel wie die Properties-Ansicht das momentan markierte Objekt nach seiner IPropertySource Schnittstelle abfragt org.eclipse.ui.views.properties/PropertySheetEntry IPropertySource getPropertySource(Object object){ if (object instanceof IAdaptable) { IAdaptable a = (IAdaptable)object; return (IPropertySource)a.getAdapter( IPropertySource.class); } Pfeile z.B. IFile Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

14 Verwendung von IAdaptable
Eine Klasse möchte zusätzliche Schnittstellen anbieten ohne sie in der API offen zu legen. Die Methode getAdapter() wird dann von der Klasse selbst implementiert. Fügt man neue Schnittstellen hinzu muss getAdapter() geändert werden. Eine Klasse wird von außen erweitert um zusätzliche Dienste anzubieten. Dann ist keine Änderung in der Klasse notwendig, getAdapter() wird von einer Fabrik bereitgestellt. Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

15 Schnittstelle mit IAdaptable offen legen
Methode getAdapter() in einer Klasse die IPropertySource unterstützt: Object getAdapter(Class adapter) { if(adapter.equals(IPropertySource.class) return new PropertySourceAdapter(this); if(adapter.equals(IShowInSource.class) return new ShowInSourceAdapter(this); return super.getAdapter(this); } Adapter Klasse die IPropertySource implementiert: public class PropertySourceAdapter implements IPropertySource { private IFile source; public PropertySourceAdapter(IFile source) { this.source=source; Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

16 Seminar Software Design Patterns Eclipse Patterns
Adapterfabrik Eine Klasse AdapterFactory mit den Adaptern implementieren die man einem bestimmten Typ hinzufügen möchte class FileAdapterFactory implements IAdapterFactory { public Class[] getAdapterList() { return new Class[] {IPropertySource.class}; } public Object getAdapter(Object o, Class adapter) { if(adapter == IPropertySource.class) return new FilePropertySource((IFile)o); return null; //… Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

17 Schnittstelle zu vorh. Typen hinzufügen
Die Fabrik für einen bestimmten Typ beim AdapterManager, den die Klasse Plattform bereitstellt, registrieren IAdapterManger manger = Platform.getAdapterManager(); IAdapterFactory factory = new FileAdapterFactory(); Manger.registerAdapter(factory,IFile.class); Aufrufe von getAdapter() auf die Factory umleiten org.eclipse.core.internal.resources/File Object getAdapter(Class adapter) { Platform.getAdapterManager().getAdapter(this,adapter); } Mehrere Factorys für eine Klasse registrieren Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

18 Arbeitsbereichskern - Ressourcen
Zugriff auf Dateisystemressourcen Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

19 Seminar Software Design Patterns Eclipse Patterns
Hintergrund In Eclipse ist das Dateisystem dominant d.h. Der Arbeitsbereich wird direkt auf das Dateisystem abgebildet so daß es kein zwischengelagertes Repository gibt Änderungen auf Ressourcen entweder direkt im Dateisystem oder aus Eclipse heraus Ressourcen-Plug-In unterstützt die Verwaltung eines Arbeitsbereiches und seiner Ressourcen Bsp: VisualAge Repository erklären Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

20 Seminar Software Design Patterns Eclipse Patterns
Ziel Möglichkeit eine Ressource im Dateisystem zu verfolgen Ressourcen ändern sich im Verlauf des Lebenszyklus durch: Erstellung Inhaltsänderung Versionen Löschen Neue Erzeugung Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

21 Lösung Dateisystemzugriff
 Wie greife ich auf das Dateisystem zu? Zugriff auf Ressource über Handle und nicht direkt Handle wirkt wie ein Schlüssel auf eine Ressource (Proxy) „Kontrolliere den Zugriff auf ein Objekt mithilfe eines vorgelagerten Stellvertreterobjekts“ Handle speichert die Pfadinformationen der Ressource Handles sind als Schnittstellen definiert Handle kann auf nicht existierende Ressource verweisen Handle speichert keinerlei Zustandsinformationen Zustand erhält man durch erneutes abrufen des zugehörigen Info-Objekts (Brücke) „Entkopple eine Abstraktion von ihrer Implementation, so daß beide unabhängig voneinander variiert werden können“ Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

22 Seminar Software Design Patterns Eclipse Patterns
Umsetzung IResource Proxy org.eclipse.core.resources IWorkspaceRoot IProject IFolder IFile getFullPath() getMarker() getModificationStamp() getSessionProperty() Brücke API Nicht - API ResourceInfo Resource getResourceInfo() getMarker() getModificationStamp() Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

23 Seminar Software Design Patterns Eclipse Patterns
Beispiel Erzeugung eines untergeordneten Handles IProject project; IFolder folder = project.getFolder(„someFolder“); Erzeugung einer Ressource folder.create(…); Ein paar Handle-Operationen folder.getFullPath(); folder.getParent(); folder.exists(); Operationen die vom Vorhandensein der Ressource abhängig sind lösen eine CoreException – Ausnahme aus Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

24 Lösung Ressourcenänderung
 Wie wird der Client über Änderungen informiert? Beobachten von Änderungen über Ressourcen-Listener Welcher vom Arbeitsbereich zur Verfügung gestellt wird (Beobachter) Beobachter registriert sich beim Arbeitsbereich (Subjekt) Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

25 Seminar Software Design Patterns Eclipse Patterns
Umsetzung IWorkspace * ResourcenChangeListener addResourceChangeListener() removeResourceChangeListener() resourceChanged(IResourceChangeEvent) Beobachter: Subjekt Beobachter IResourceChangeListener beobachtet IWorkspace Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

26 Benachrichtigungsprinzip
Push-Modell Subjekt schickt detaillierte Info von Änderungen an alle Beobachter egal ob von Interesse oder nicht (IResourceDelta) Entsprechendes IResourceChangeEvent welches vom Listener empfangen wird enthält sämtliche Ressourcenabweichungen inklusive sämtlicher Änderungen untergeordneter Elemente * IResourceChangeEvent IResourceDelta getDelta() getResource() getKind() getResource() getKind() getAffectedChildren() Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

27 Benutzeroberfläche der Workbench 1
Zustände persistent speichern mit Memento Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

28 Seminar Software Design Patterns Eclipse Patterns
Ziel Bewahrung von Kontinuität über Sitzungen hinweg Wiederherstellung des letzten Zustandes nach Sitzungsende Neustart Beim Öffnen von z.B. einer Java-Klassen „User Continuity Rule“: Bewahren Sie den Zustand der Benutzeroberfläche zwischen zwei Sitzungen Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

29 Seminar Software Design Patterns Eclipse Patterns
Ziel visualisiert entsprechenden Editor starten Perspektive laden Position merken Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

30 Seminar Software Design Patterns Eclipse Patterns
Lösungsansatz JDK bietet bereits Möglichkeit der Serialisierung „implements Serializable“ Wird jedoch von Eclipse nicht verwendet Anfälligkeit gegenüber Änderungen über verschiedene Versionen hinweg JDK Eclipse-Klassenimplementierungen Das Speicherformat muss angesichts von Änderungen robust sein. Eine neuere Version einer Klasse muss in der Lage sein, die Daten von einer älteren Version wiederherzustellen. Insbesondere kann die Klasse in einer späteren Sitzung überhaupt nicht mehr verfügbar sein. Der Speichermechanismus muss komplexe Strukturen unterstützen Der Speichermechanismus muss in der Lage sein, beliebige Objekte zu speichern und wiederherzustellen Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

31 Seminar Software Design Patterns Eclipse Patterns
Lösung: Memento „Erfasse und externalisiere den internen Zustand eines Objektes, ohne seine Kapselung zu verletzen, sodass das Objekt später in diesen Zustand zurückversetzt werden kann.“ Originator setMemento(Memento m) createMemento(): Memento state Memento getState() setState() state Caretaker Ein Memento speichert eine Momentaufnahme des internen Zustands eines anderen Objekts. erzeugt & verwendetMemento speichert Status Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

32 Lösung in Eclipse: IMemento
org.eclipse.ui/Memento public interface IMemento { void putString(String key, String value); String getString(String key); void putString(String key, Integer value); Integer getString(String key); IMemento createChild(String type); IMemento[] getChildren(String type); //… } IMemento-Objekt speichert Schlüssel/Wert-Paare einfacher Typen Struktur wird durch Baum von IMementos erzeugt IMemento-Struktur wird durch XML-basiertes Speicherformat realisiert Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

33 Beispiel ResourceNavigator
Workbench übergibt ein IMemento-Objekt Dieses Objekt wird vom Client gefüllt Serialisierung durch Workbench Keine symmetrische Wiederherstellung Zustand wird über beim Start des Clients über init() Methode empfangen Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

34 Beispiel ResourceNavigator cont.
org.eclipse.ui.views/ResourceNavigator private static final String TAG_SELECTION="selection"; private static final String TAG_ELEMENT="element"; public void saveState(IMemento memento) { //… //save selection Object elemements[]= ((IStructuredSelection)viewer.getSelection()).toArray(); if (elements.length>0) { IMemento selectionMem=memento.createChild(TAG_SELECTION); for (int i=0; i<elements.length; i++) { IMemento elementMem=selectionMem.createChild(TAG_ELEMENT); elementMem.putString(TAG_PATH, ((IResource)elements[i]).getFullPath().toString()); } Die Workbench übergibt ein IMemento-Objekt an saveState() und Clients füllen das Memento mit dem zu speichernden Zustand. Die Wiederherstellung des Zustands ist nicht symmetrisch, da es keine von der Wokrbench aufgerufene restoreState()-Methode gibt. Stattdessen empfangen Clients das Memento einer Ansicht in der Methode init(). Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

35 Beispiel ResourceNavigator cont.
org.eclipse.ui.views/ResourceNavigator IMemento memento; public void init(IViewSite site, IMemento memento) throws PartInitException { super.init(site, memento); this.memento=memento; } Keine symmetrische Wiederherstellung Empfang des Memento über init()-Methode Die Workbench übergibt ein IMemento-Objekt an saveState() und Clients füllen das Memento mit dem zu speichernden Zustand. Die Wiederherstellung des Zustands ist nicht symmetrisch, da es keine von der Wokrbench aufgerufene restoreState()-Methode gibt. Stattdessen empfangen Clients das Memento einer Ansicht in der Methode init(). Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

36 Benutzeroberfläche der Workbench 2
Lazy Loading mit virtuellen Proxies Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

37 Seminar Software Design Patterns Eclipse Patterns
Ziel Einfügen von Menüs, Menübefehlen und Symbolleistenschaltflächen in Eclipse Workbench als Paradebeispiel definiert viele Erweiterungspunkte Resourcen-Einsparung durch punktgenaues Laden von Klassen  Implementierung der Lazy Loading-Regel Erweiterungspunkt: Architekturmechanismus, der die Erweiterbarkeit von Plugins öffentlich deklariert. Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

38 Seminar Software Design Patterns Eclipse Patterns
Lösung in Eclipse Manifest-Datei plugin.xml Definiert Eigenschaften eines Plugins (Kontext-) Menüs, Schaltflächen, etc. Views und Editoren u.v.a. Einsatz von virtuellen Proxies: Workbench füllt ein PluginAction-Objekt mit Informationen im Manifest (Titel, Symbol, Tooltip) → Proxy-Objekt Eigentliche Aktion kann Proxy nicht ausführen Weiterleitung der run()-Anforderung an die eigentliche Erweiterungsklasse Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

39 Seminar Software Design Patterns Eclipse Patterns
Lazy Loading Auszug aus Plugin-Konfigurationsdatei plugin.xml: org.eclipse.team.cvs-ui/plugin.xml <extension point="org.eclipse.ui.actionSets"> <actionSet> <action toolbarPath="Normal/CVS" label="Neuer Menüpunkt" tooltip="Mein hinzugefüger Menüpunk" icon="icons/icon.gif" class="contrib.MyMenuClass" id="contrib.MyMenuClass" </action> </actionSet> </extension> Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

40 Seminar Software Design Patterns Eclipse Patterns
Lazy Loading Proxy: Subjekt Proxy: eigentliches Subjekt IAction PluginAction run() selectionChanged(ISelection) IActionDelegate run(IAction) selectionChanged(IAction, ISelection) Proxy MyMenuClass run(IAction) selectionChanged(IAction, ISelection) PluginAction lädt die eigentliche Aktion Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

41 Seminar Software Design Patterns Eclipse Patterns
Ressources Eclipse Erich Gamma, Kent Beck: „Eclipse erweitern“, Addison-Wesley, 2004 Sherry Shavor et. Al.: „Eclipse“, Addison-Wesley, 2004 Erweiterungsobjekt/Erweiterungsschnittstelle R. Martin: „Pattern Languages of Program Design 3“, Addison-Wesley, 1998 D. Schmidt et. Al.: „Pattern-Oriented Software Architecture Volume 2: Patterns for Concurrent and Networked Objects“, Jon Wiley & Sons, 2000 Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns

42 Vielen Dank für die Aufmerksamkeit! Fragen ?
Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns


Herunterladen ppt "Seminar Software Design Patterns"

Ähnliche Präsentationen


Google-Anzeigen