Eclipse RCP:动作与命令的区别

25

在 Eclipse RCP 的上下文中,操作(Actions)和命令(Commands)有什么区别?我知道它们都对菜单条目做出贡献,但哪个更好?为什么呢?

从我阅读的所有在线资源中,我无法获得对两者之间差异的明确理解。我实际上还没有尝试使用它们,只是想从更高层次的角度来理解它们。

谢谢

3个回答

41

你是否阅读过 Eclipse Wiki 上的“常见问题解答:命令和动作有什么区别?”

你可能已经明白,动作(Actions)和命令(Commands)基本上做的是相同的事情:它们会触发执行某个代码片段。它们主要是从用户界面的组件中触发的。

关于动作的主要问题在于该动作的界面展示和代码都存储在动作中
虽然动作委托存在一些分离,但它们仍与底层动作相关联。选择事件被传递给动作,以便它们能够根据当前选择(以编程方式)更改其启用状态。这不是很优雅。而且要将动作放置在特定的工作台部件上,您必须使用几个扩展点。

命令基本上解决了所有这些问题。其基本思想是命令只是某些代码要被执行的抽象概念。实际的代码处理由句柄(handlers)完成。句柄由工作台的某个状态激活。该状态由平台核心表达式查询。这意味着我们只需要一个全局保存命令,根据当前处于活动状态的句柄,其行为会有所不同。

命令属性

这篇文章详细介绍了它们之间的区别。

动作

  • UI 和处理逻辑总是紧密耦合的。你无法将它们分离。
  • 虽然可以将动作贡献到工作台的不同部分(弹出菜单/工具栏),但所有这些动作都有不同的扩展点,因此您最终需要在多个地方复制 XML。最糟糕的是,并非所有扩展点都希望得到相同的配置。
  • 在多个地方指定操作会成为一个维护噩梦。如果你需要更改操作的图标,你需要在所有地方都进行更改。
  • 在plugin.xml中复制操作的另一个问题是,内存中将创建多个相同的操作实例
  • 命令涉及更多的扩展点,但:

    • 处理程序可以与命令分别声明。这使得对于同一命令 可以声明多个处理程序
    • 所有处理程序的activeWhen都将被评估,并选择返回最具体条件为true的处理程序。所有这些事情甚至在不加载处理程序的情况下完成。即使没有加载插件
    • 定义参数只涉及返回显示名称和id的映射。名称将显示在按键绑定页面中,而id将用于在按下键序列时调用命令。
    • 定义IExecutionListener,它仅是命令执行的观察者,因此无法否决它或对事件进行任何更改。

    6

    在VonC的出色回答之外,如果您的应用程序相对较小,则使用命令可能有些过度。它们相对较难设置,并且当您拥有多个视角、编辑器和视图时,它们会发挥最大的作用。

    对于简单的事情,我会选择操作。


    3
    同意(+1)。但我一直觉得“清理”命令有点更加干净的感觉;) - VonC
    3
    由于应用程序往往会不断扩大,我开始使用动作(actions)进行操作,但现在我改用命令(commands),这是因为键绑定(keybindings)的原因。 - Mario Ortegón
    3
    我认为从Actions开始并不是一个好主意,正如Mario Ortegón所说,应用程序往往会变得越来越复杂...将Actions迁移到Commands可能会非常痛苦。- 但是,是的,设置Actions更容易。 - Zoltán Ujhelyi

    4

    请记住,Action可能在Eclipse的后续版本中被弃用。我建议您从一开始就使用Command。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接