我有一个巨大的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
完成其工作所需的那些方法。如果所述接口变得太大,则表明还有更多的重构工作要做。