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