我有一个很大的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,并且将处理程序添加到IEclipseContext中的@PostConstruct是很丑的,因为它在零件和处理程序之间添加了循环依赖性。我有什么魔术可以通过e4xmi文件或其他方法强制实例化?

我当前的解决方案是将功能纯粹提取到实用程序Bean并返回数据并在部分上进行设置,但这也不是一件好事(需要大量其他的空检查,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进行工作所需的那些方法。如果所说的接口太大,则表明还有更多的重构要做。

09-11 18:08