将 UI 事件侦听与 Eclipse RCP 中的部件分开:如何正确操作?



我有一个巨大的Part源代码,我必须在 1 个地方触摸。它违反了很多原则,所以我想至少提取我必须修改的函数,这是一个@UIEventTopic处理程序。没有测试,我想在这里添加它们,这样我知道我不会破坏现有功能。

我想远离这个:

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

像这样:

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

使用 Eclipse DI,我看不到创建处理程序类实例的简单方法。它不能是@Singleton,因为它是一个可以有多个实例的Part,并且将处理程序添加到@PostConstruct中的IEclipseContext是丑陋的,因为它在部件和处理程序之间添加了循环依赖关系。有什么神奇的方法可以通过 e4xmi 文件或某种替代方式强制执行实例化吗?

我目前的解决方案是将功能纯粹提取到实用程序 bean 中并返回数据并将其设置在零件上,但这也不太好(需要大量额外的 null 检查、ifs 等(。

我不完全确定我是否理解你的问题,但是,这就是我将如何进行:

提取委托

event()中的代码移动到MyEventHandler,以便MyClass完全委派事件处理

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

这应该是一个足够安全的重构,无需测试即可完成 - 最后,您别无选择,因为没有测试。

确保现状

现在我会为handleEvent()编写测试,模拟所需的MyPart方法,从而确保我不会破坏现有行为。

实现新功能

之后,我将能够以测试驱动的方式对MyEventHandler::handleEvent进行所需的更改。

收拾

然后,我将从MyPart中提取一个接口,该接口仅具有MyEventHandler完成其工作所需的那些方法。如果所述接口变得太大,则表明还有更多的重构工作要做。

最新更新