从 Eclipse RCP 的一个部分中分离 UI 事件监听:如何正确地做到这一点?

Separating UI event listening from a Part in Eclipse RCP: how to do it properly?

我有一个巨大的 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,我看不到创建处理程序实例的简单方法 class。它不能是 @Singleton,因为它是一个可以有多个实例的 Part,并且将处理程序添加到 @PostConstruct 中的 IEclipseContext 是丑陋的,因为它添加了循环依赖在零件和处理程序之间。我可以通过 e4xmi 文件或其他替代方式强制实例化吗?

我目前的解决方案是将纯粹的功能提取到实用 bean 和 return 数据并将其设置在零件上,但这也不太好(需要大量额外的空检查、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 完成其工作所需的那些方法。如果所述接口变得太大,则表明还有更多的重构工作要做​​。