Eclipse RCP:操作VS命令

Eclipse RCP上下文中的Actions和Commands之间有什么区别? 我知道他们都对菜单条目有贡献,但哪一个更好? 为什么?

在我阅读的所有在线资源中,我无法深入了解两者之间的差异。 我实际上并没有尝试过使用它们,但只是想从更高层次的角度来理解它们。

谢谢

您是否阅读过eclipse wiki FAQ命令与动作之间有什么区别?

您可能已经了解动作和命令基本上做同样的事情:它们导致执行某段代码。 它们主要由用户界面中的artificats触发

Actions的主要关注点是表现forms和代码都存储在Action中
尽管Action Delegates中存在一些分离,但它们仍然与基础操作相关联。 选择事件将传递给Actions,以便它们可以根据当前选择更改其启用状态(以编程方式)。 这不是很优雅。 另外,要在某个工作台部件上放置动作,您必须使用多个扩展点。

命令几乎可以解决所有这些问题。 基本思想是命令只是要执行的一些代码的抽象概念。 代码的实际处理由处理程序完成 。 处理程序由工作台的某个状态激活。 平台核心表达式查询此状态。 这意味着我们只需要一个全局Save命令,该命令根据当前处理的处理程序而表现不同。

命令的属性

本文详细介绍了这些差异

行动

  • UI和处理总是相互关联的 。 你无法互相分离
  • 虽然Actions可以贡献给工作台的不同部分(弹出菜单/工具栏),但它们都是不同的扩展点 ,因此您最终会在多个位置复制XML。 最糟糕的是,并非所有扩展点都期望相同的配置。
  • 在多个地方指定操作是一项维护噩梦 。 如果您必须更改操作的图标,则需要更改所有位置。
  • 在plugin.xml中复制Actions的另一个问题是将在内存中创建相同Actions的多个实例

命令涉及更多扩展点,但是:

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

只要添加到VonC的优秀答案,如果您的应用程序相对较小,命令可能有点过分。 它们设置起来相对困难,当您有多个视角,编辑器和视图时,它们发挥得最多。

对于简单的事情,我会采取行动。

请记住,可能会在更高版本的Eclipse上弃用Action。 我建议你从一开始就使用Command。