2017-08-16 3 views
1

J'ai un énorme code source Part Je dois toucher à 1 place. Il viole beaucoup de principes donc je voudrais extraire au moins la fonction que j'ai dû modifier qui est un gestionnaire @UIEventTopic. Il n'y a pas de tests et je voudrais les ajouter ici, donc je sais que je ne casse pas les fonctionnalités existantes.Séparation d'un événement de l'interface utilisateur écoutant une pièce dans Eclipse RCP: comment le faire correctement?

Je voudrais sortir de cette:

public class MyPart { 
    ... 

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

à quelque chose comme ceci:

public class MyPart { 
    ... 
} 

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

Avec l'Eclipse DI je ne vois aucun moyen facile de créer une instance de la classe de gestionnaire. Il ne peut pas être un @Singleton parce que c'est un Part qui peut avoir plusieurs instances, et ajouter le gestionnaire au IEclipseContext dans le @PostConstruct est moche car il ajoute une dépendance circulaire entre la pièce et le gestionnaire. Y a-t-il une magie pour que je puisse appliquer l'instanciation à travers les fichiers e4xmi, ou d'une autre manière? Ma solution actuelle est d'extraire purement la fonctionnalité à un bean utilitaire et de renvoyer les données et de les paramétrer sur la pièce, mais c'est aussi quelque chose de pas très sympa (nécessite beaucoup de vérifications supplémentaires, ifs, etc.).

Répondre

1

Je ne suis pas tout à fait sûr que je comprends votre question, cependant, voici comment je procéderais:

Extrait Délégué

Déplacer le code event() à la MyEventHandler afin que MyClass pleinement délègue la la gestion des événements

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 
    } 
} 

Cela devrait être un refactoring sûr, assez à faire sans avoir des tests - et à la fin, vous ne VHA pas e un choix car il n'y a pas de tests.

le statu quo comme

Maintenant, j'écrire des tests pour handleEvent(), se moquant des méthodes nécessaires de MyPart et donc faire en sorte que je ne cassera pas le comportement existant.

Mettre en oeuvre une nouvelle fonction

Après que je serais en mesure d'apporter les changements souhaités à MyEventHandler::handleEvent de manière piloté par les tests.

Clean Up

alors j'extraire une interface de MyPart qui n'a que les méthodes nécessaires à MyEventHandler pour faire son travail. Si cette interface devient trop grande, cela indiquerait qu'il y a plus de refactoring à faire.

+0

Salut Rüdiger, Ouais, merci beaucoup. À la fin, nous nous sommes retrouvés dans une situation similaire - en passant la partie parce que le fait de se moquer aurait rendu les tests un peu gonflés. Nous avons donc plutôt créé un objet résultat et je le mets à l'épreuve. Merci pour les idées. – rlegendi