Eclipse RCP: действия против команд - PullRequest
25 голосов
/ 16 февраля 2009

В чем различия между действиями и командами в контексте Eclipse RCP? Я знаю, что они оба вносят свой вклад в пункты меню, но какой из них лучше? А почему?

Из всех онлайн-ресурсов, которые я прочитал, я не смог получить четкое представление о различиях между ними. На самом деле я не пытался их использовать, но просто хотел понять их, чтобы начать с точки зрения более высокого уровня.

Спасибо

Ответы [ 3 ]

39 голосов
/ 16 февраля 2009

Читали ли вы вики затмения FAQ В чем разница между командой и действием?

Вы, наверное, уже понимаете, что Действия и Команды в основном делают одно и то же: они вызывают выполнение определенного фрагмента кода. Они запускаются, в основном, из сертификатов в пользовательском интерфейсе

Основная проблема с Действиями заключается в том, что манифестация и код хранятся в действии .
Хотя в делегатах действий есть некоторое разделение, они все еще связаны с базовым действием. События выбора передаются в действия, чтобы они могли изменять свое включенное состояние (программно) на основе текущего выбора. Это не очень элегантно. Также, чтобы разместить действие на определенной части верстака, вы должны использовать несколько точек расширения.

Команды в значительной степени решают все эти проблемы. Основная идея заключается в том, что Команда - это просто абстрактная идея некоторого кода, который должен быть выполнен. Фактическая обработка кода выполняется, ну, в общем, обработчиками . Обработчики активируются определенным состоянием рабочей среды. Это состояние запрашивается основными выражениями платформы. Это означает, что нам нужна только одна глобальная команда Save, которая ведет себя по-разному в зависимости от того, какой обработчик активен в данный момент.

properties of a command

Эта статья подробно описывает различия

Действия :

  • Интерфейс и обработка всегда связаны . Вы никак не можете отделить друг друга
  • Хотя действия могут быть добавлены к различным частям рабочей среды (всплывающее меню / панель инструментов), все они были различными точками расширения , поэтому в конечном итоге вы дублируете XML в нескольких местах. Хуже всего то, что не все точки расширения ожидают одинаковую конфигурацию.
  • Указание действий в нескольких местах - это кошмар обслуживания . Если вам нужно изменить значок действия, вам нужно изменить во всех местах.
  • Другая проблема с дублированием действий в plugin.xml заключается в том, что несколько экземпляров одних и тех же действий будут созданы в памяти .

Команды включают больше точек расширения, но:

  • Обработчик может быть объявлен отдельно от команды. Это позволяет для нескольких объявлений обработчиков для одной и той же команды .
  • activeWhen для всех обработчиков оценивается и выбирается тот, который возвращает true для наиболее конкретного условия. Все эти вещи выполняются даже без загрузки вашего обработчика в память. Даже без загрузки вашего плагина !
  • Определение параметров - это возвращение карты отображаемых имен и идентификаторов. Имя будет отображаться на странице привязки клавиш, а идентификатор будет использоваться для вызова команды при нажатии последовательности клавиш.
  • Определите IExecutionListener, который является просто наблюдателем выполнения команды, поэтому он не может ни наложить вето на него, ни внести какие-либо изменения в событие
6 голосов
/ 16 февраля 2009

Просто добавив к отличному ответу VonC, команды могут быть немного излишними, если ваше приложение относительно небольшое. Их относительно сложно настроить, и они лучше всего светятся, когда у вас несколько перспектив, редакторов и видов.

Для чего-то простого, я бы пошел с действиями.

4 голосов
/ 14 июня 2010

И помните, что действие может быть устаревшим в более поздней версии Eclipse. Я бы предложил вам использовать команду с самого начала.

...