Eclipse Patterns Seminar Software Design Patterns Mittwoch 23

  • Slides: 42
Download presentation
Eclipse Patterns Seminar Software Design Patterns Mittwoch, 23. Juni 2004 Hochschule der Medien, Stuttgart

Eclipse Patterns Seminar Software Design Patterns Mittwoch, 23. Juni 2004 Hochschule der Medien, Stuttgart Philipp Schill Ralf Schmauder Alexander Eberhardt

Agenda • Einführung in Eclipse • IAdaptable • Arbeitsbereichskern – Ressourcen • Zustände persistent

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

Eclipse-Plattform Eine Kurzeinführung 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar

Eclipse-Plattform Eine Kurzeinführung 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 3

Eclipse • „The Eclipse Platform is an IDE for anything, and for nothing in

Eclipse • „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 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 4

Was ist Eclipse ? • Eclipse verkörpert drei Dinge: – Eine JAVA Entwicklungsumgebung –

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) PDE JDT Plattform 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 5

Variabler Plugin Mechanismus 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar

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

Laufzeitkern - IAdaptable Erweiterung von Schnittstellen 23. 6. 2004 - Philipp Schill, Ralf Schmauder,

Laufzeitkern - IAdaptable Erweiterung von Schnittstellen 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 7

Ziel • Eclipse soll eine erweiterbare Plattform sein d. h. – zusätzliche Dienste oder

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 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 8

Beispiel IFile public interface IFile { … } public interface IProperty. Source { …

Beispiel IFile public interface IFile { … } public interface IProperty. Source { … } public interface IFile extends IProperty. Source 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 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 9

Exkurs: Adapter (Wrapper) • Passe die Schnittstelle einer Klasse an eine andere von ihren

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

Lösung: Erweiterungsobjekt • „Vorwegnehmen dass die Schnittstelle eines Objekts zukünftig erweitert werden muss. Nach

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 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 ? 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 11

Implementierung in Eclipse • Klassenbasierter Mechanismus • Zusätzliches Verhalten wird durch eine Schnittstelle beschrieben

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 get. Adapter(Class adapter); } 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 12

Beispiel für die Benutzung • Beispiel wie die Properties-Ansicht das momentan markierte Objekt nach

Beispiel für die Benutzung • Beispiel wie die Properties-Ansicht das momentan markierte Objekt nach seiner IProperty. Source Schnittstelle abfragt org. eclipse. ui. views. properties/Property. Sheet. Entry IProperty. Source get. Property. Source(Object object){ … if (object instanceof IAdaptable) { IAdaptable a = (IAdaptable)object; return (IProperty. Source)a. get. Adapter( IProperty. Source. class); } } 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 13

Verwendung von IAdaptable • Eine Klasse möchte zusätzliche Schnittstellen anbieten ohne sie in der

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

Schnittstelle mit IAdaptable offen legen Methode get. Adapter() in einer Klasse die IProperty. Source

Schnittstelle mit IAdaptable offen legen Methode get. Adapter() in einer Klasse die IProperty. Source unterstützt: Object get. Adapter(Class adapter) { if(adapter. equals(IProperty. Source. class) return new Property. Source. Adapter(this); if(adapter. equals(IShow. In. Source. class) return new Show. In. Source. Adapter(this); return super. get. Adapter(this); } Adapter Klasse die IProperty. Source implementiert: public class Property. Source. Adapter implements IProperty. Source { private IFile source; public Property. Source. Adapter(IFile source) { this. source=source; } … } 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 15

Adapterfabrik Eine Klasse Adapter. Factory mit den Adaptern implementieren die man einem bestimmten Typ

Adapterfabrik Eine Klasse Adapter. Factory mit den Adaptern implementieren die man einem bestimmten Typ hinzufügen möchte class File. Adapter. Factory implements IAdapter. Factory { public Class[] get. Adapter. List() { return new Class[] {IProperty. Source. class}; } public Object get. Adapter(Object o, Class adapter) { if(adapter == IProperty. Source. class) return new File. Property. Source((IFile)o); return null; } //… } 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 16

Schnittstelle zu vorh. Typen hinzufügen Die Fabrik für einen bestimmten Typ beim Adapter. Manager,

Schnittstelle zu vorh. Typen hinzufügen Die Fabrik für einen bestimmten Typ beim Adapter. Manager, den die Klasse Plattform bereitstellt, registrieren IAdapter. Manger manger = Platform. get. Adapter. Manager(); IAdapter. Factory factory = new File. Adapter. Factory(); Manger. register. Adapter(factory, IFile. class); Aufrufe von get. Adapter() auf die Factory umleiten org. eclipse. core. internal. resources/File Object get. Adapter(Class adapter) { Platform. get. Adapter. Manager(). get. Adapter(this, adapt er); } 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 17

Arbeitsbereichskern - Ressourcen Zugriff auf Dateisystemressourcen 23. 6. 2004 - Philipp Schill, Ralf Schmauder,

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

Hintergrund • In Eclipse ist das Dateisystem dominant d. h. – Der Arbeitsbereich wird

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 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 19

Ziel • Möglichkeit eine Ressource im Dateisystem zu verfolgen – Ressourcen ändern sich im

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 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 20

Lösung Dateisystemzugriff Wie greife ich auf das Dateisystem zu? • Zugriff auf Ressource über

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 einesvorgelagerten 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“ 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 21

Umsetzung IResource Proxy get. Full. Path() get. Marker() get. Modification. Stamp() get. Session. Property()

Umsetzung IResource Proxy get. Full. Path() get. Marker() get. Modification. Stamp() get. Session. Property() … Brück e org. eclipse. core. resources IWorkspace. Root IProject IFolder IFile API Nicht - API Resource. Info Resource 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt get. Resource. Info() get. Marker() get. Modification. Stamp() … Seminar Software Design Patterns Eclipse Patterns 22

Beispiel • Erzeugung eines untergeordneten Handles IProject project; IFolder folder = project. get. Folder(„some.

Beispiel • Erzeugung eines untergeordneten Handles IProject project; IFolder folder = project. get. Folder(„some. Folder“); • Erzeugung einer Ressource folder. create(…); • Ein paar Handle-Operationen folder. get. Full. Path(); folder. get. Parent(); folder. exists(); … • Operationen die vom Vorhandensein der Ressource abhängig sind lösen eine Core. Exception – Ausnahme aus 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 23

Lösung Ressourcenänderung Wie wird der Client über Änderungen informiert? • Beobachten von Änderungen über

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) 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 24

Umsetzung IWorkspace add. Resource. Change. Listener() remove. Resource. Change. Listener() * Resourcen. Change. Listener

Umsetzung IWorkspace add. Resource. Change. Listener() remove. Resource. Change. Listener() * Resourcen. Change. Listener resource. Changed(IResource. Change. Event) Beobachter: Subjekt Beobachte r IResource. Change. Listener beobachtet IWorkspace 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 25

Benachrichtigungsprinzip • Push-Modell – Subjekt schickt detaillierte Info von Änderungen an alle Beobachter egal

Benachrichtigungsprinzip • Push-Modell – Subjekt schickt detaillierte Info von Änderungen an alle Beobachter egal ob von Interesse oder nicht (IResource. Delta) – Entsprechendes IResource. Change. Event welches vom Listener empfangen wird enthält sämtliche Ressourcenabweichungen inklusive sämtlicher Änderungen untergeordneter Elemente IResource. Change. Event get. Resource() get. Kind() 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt * get. Delta() IResource. Delta get. Resource() get. Kind() Seminar Software Design Patterns Eclipse Patterns get. Affected. Children() 26

Benutzeroberfläche der Workbench 1 Zustände persistent speichern mit Memento 23. 6. 2004 - Philipp

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

Ziel • Bewahrung von Kontinuität über Sitzungen hinweg – Wiederherstellung des letzten Zustandes •

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 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 28

Ziel visualisiert entsprechenden Editor starten Perspektive laden Position merken 23. 6. 2004 - Philipp

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

Lösungsansatz • JDK bietet bereits Möglichkeit der Serialisierung – „implements Serializable“ • Wird jedoch

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 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 30

Lösung: Memento „Erfasse und externalisiere den internen Zustand eines Objektes, ohne seine Kapselung zu

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 Memento set. Memento(Memento m) create. Memento(): Memento get. State() state erzeugt & verwende t. Memento 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Caretaker speichert Status Seminar Software Design Patterns Eclipse Patterns 31

Lösung in Eclipse: IMemento org. eclipse. ui/Memento public interface IMemento { void put. String(String

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

Beispiel Resource. Navigator • Workbench übergibt ein IMemento-Objekt • Dieses Objekt wird vom Client

Beispiel Resource. Navigator • 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 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 33

Beispiel Resource. Navigator cont. org. eclipse. ui. views/Resource. Navigator private static final String TAG_SELECTION="selection";

Beispiel Resource. Navigator cont. org. eclipse. ui. views/Resource. Navigator private static final String TAG_SELECTION="selection"; private static final String TAG_ELEMENT="element"; public void save. State(IMemento memento) { //… //save selection Object elemements[]= ((IStructured. Selection)viewer. get. Selection()). to. Array(); if (elements. length>0) { IMemento selection. Mem=memento. create. Child(TAG_SELECTION); for (int i=0; i<elements. length; i++) { IMemento element. Mem=selection. Mem. create. Child(TAG_ELEMENT); element. Mem. put. String(TAG_PATH, ((IResource)elements[i]). get. Full. Path(). to. String()); } } } 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 34

Beispiel Resource. Navigator cont. org. eclipse. ui. views/Resource. Navigator IMemento memento; public void init(IView.

Beispiel Resource. Navigator cont. org. eclipse. ui. views/Resource. Navigator IMemento memento; public void init(IView. Site site, IMemento memento) throws Part. Init. Exception { super. init(site, memento); this. memento=memento; } • Keine symmetrische Wiederherstellung • Empfang des Memento über init()-Methode 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 35

Benutzeroberfläche der Workbench 2 Lazy Loading mit virtuellen Proxies 23. 6. 2004 - Philipp

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

Ziel • Einfügen von Menüs, Menübefehlen und Symbolleistenschaltflächen in Eclipse • Workbench als Paradebeispiel

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 Erweiterungspunkt: Architekturmechanismus, der die Erweiterbarkeit von Plugins öffentlich deklariert. Implementierung der Lazy Loading-Regel 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 37

Lösung in Eclipse • Manifest-Datei plugin. xml – Definiert Eigenschaften eines Plugins • (Kontext-)

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 Plugin. Action-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 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 38

Lazy Loading Auszug aus Plugin-Konfigurationsdatei plugin. xml: org. eclipse. team. cvs-ui/plugin. xml <extension point="org.

Lazy Loading Auszug aus Plugin-Konfigurationsdatei plugin. xml: org. eclipse. team. cvs-ui/plugin. xml <extension point="org. eclipse. ui. action. Sets"> <action. Set> … <action toolbar. Path="Normal/CVS" label="Neuer Menüpunkt" tooltip="Mein hinzugefüger Menüpunk" icon="icons/icon. gif" class="contrib. My. Menu. Class" id="contrib. My. Menu. Class" </action> </action. Set> </extension> 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 39

Lazy Loading Proxy: Subjekt IAction Plugin. Action Proxy: eigentliche s Subjekt IAction. Delegate run()

Lazy Loading Proxy: Subjekt IAction Plugin. Action Proxy: eigentliche s Subjekt IAction. Delegate run() selection. Changed(ISelection) run(IAction) selection. Changed(IAction, ISelection) Proxy My. Menu. Class Plugin. Action lädt die eigentliche Aktion 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns run(IAction) selection. Changed(IAction, ISelection) 40

Ressources • Eclipse – Erich Gamma, Kent Beck: „Eclipse erweitern“, Addison-Wesley, 2004 – Sherry

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 23. 6. 2004 - Philipp Schill, Ralf Schmauder, Alexander Eberhardt Seminar Software Design Patterns Eclipse Patterns 41

Vielen Dank für die Aufmerksamkeit! Fragen ? 23. 6. 2004 - Philipp Schill, Ralf

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