我有一个很大的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
进行工作所需的那些方法。如果所说的接口太大,则表明还有更多的重构要做。