2017-08-16 1 views
1

Ich habe einen großen Part Quellcode, den ich an 1 Stelle berühren muss. Es verstößt gegen viele Prinzipien, daher möchte ich zumindest die Funktion, die ich ändern musste, extrahieren, die ein @UIEventTopic Handler ist. Es gibt keine Tests und ich möchte sie hier hinzufügen, also weiß ich, dass ich bestehende Funktionalität nicht zerbrich.Trennen der UI-Ereignisüberwachung von einem Part in Eclipse RCP: Wie wird es richtig gemacht?

Ich möchte von dieser weg bewegen:

public class MyPart { 
    ... 

    @Inject 
    @Optional 
    public void event(@UIEventTopic(EVENT) EventParam p) { 
    ... 
    } 
} 

Um so etwas wie dieses:

public class MyPart { 
    ... 
} 

public class MyEventHandler { 
    @Inject 
    @Optional 
    public void event(@UIEventTopic(EVENT) EventParam p, MyPart part) { 
    ... 
    } 
} 

Mit dem Eclipse-DI sehe ich keine einfache Möglichkeit, eine Instanz der Handler-Klasse zu schaffen. Es kann kein @Singleton sein, weil es ein Part ist, der mehrere Instanzen haben kann, und das Hinzufügen des Handlers zu dem IEclipseContext in ist hässlich, da es eine zirkuläre Abhängigkeit zwischen dem Teil und dem Handler hinzufügt. Gibt es eine Magie, wie ich die Instanziierung durch die e4xmi-Dateien erzwingen kann, oder auf eine andere Art und Weise?

Meine aktuelle Lösung rein um die Funktionalität zu einem Dienstprogramm Bohne zu extrahieren und die Daten zurück, und es auf Seiten gesetzt, aber das ist auch etwas, das nicht zu schön (erfordert viel zusätzlicher Null-Kontrollen, ifs, usw.).

Antwort

1

ich nicht ganz sicher bin, dass ich verstehe Ihre Frage, aber das ist, wie ich vorgehen würde:

Extract Delegate

den Code Bewegen in event() zum MyEventHandler so dass MyClass vollständig delegiert die Ereignis

public class MyPart { 
    @Inject 
    @Optional 
    public void event(@UIEventTopic(EVENT) EventParam param) { 
    new MyEventHandler().handleEvent(this, param); 
    } 
} 

class MyEventHandler { 
    void handleEvent(MyPart part, EventParam param) { 
    // all code from event() goes here 
    } 
} 

Handhabung Dies sollte ein sicherer genug Refactoring sein, ohne zu tun Tests mit - und am Ende, Sie nicht hav Eine Wahl, da es keine Tests gibt.

Sicherstellen, dass der Status Quo

Jetzt würde ich Tests für handleEvent() schreiben, die erforderlichen Methoden der MyPart spöttisch und somit sicherstellen, dass ich vorhandenes Verhalten nicht brechen.

Implementierung neue Feature-

Danach habe ich wäre in der Lage, die gewünschten Änderungen an MyEventHandler::handleEvent in einem Test Driven Weise zu machen.

Clean Up

Dann würde ich eine Schnittstelle aus MyPart extrahieren, die nur die Methoden, die für MyEventHandler hat seine Arbeit zu tun. Wenn diese Schnittstelle zu groß wird, würde dies anzeigen, dass noch mehr Refactoring zu tun ist.

+0

Hallo Rüdiger, Yeah, vielen Dank. Am Ende kam es zu einer ähnlichen Situation - wir haben die Prüfung bestanden, weil das Spotten die Tests etwas aufgebläht hätte. Also haben wir lieber ein Ergebnisobjekt erstellt und ich teste das. Danke für die Einsichten. – rlegendi

Verwandte Themen