Ответ 1
Вы читали eclipse wiki FAQ Какая разница между командой и действием?
Вероятно, вы уже понимаете, что действия и команды в основном делают одно и то же: они вызывают выполнение определенного фрагмента кода. Они запускаются, главным образом, из искусственных объектов в пользовательском интерфейсе.
Основная проблема Действия заключается в том, что манифеста и код все хранятся в действии.
Хотя в действительных делегатах есть некоторое разделение, они все еще связаны с основным действием. События выбора передаются в действия, чтобы они могли изменять свое включенное состояние (программно) на основе текущего выбора. Это не очень элегантно. Также, чтобы поместить действие на определенную часть верстака, вы должны использовать несколько точек расширения.Команды в значительной степени решают все эти проблемы. Основная идея состоит в том, что команда - это абстрактная идея некоторого кода, который должен быть выполнен. Фактическая обработка кода выполняется с помощью обработчиков. Обработчики активируются определенным состоянием рабочего места. Это состояние запрашивается выражением ядра платформы. Это означает, что нам нужна только одна глобальная команда Save, которая ведет себя по-разному, исходя из того, какой обработчик в данный момент активен.
Эта статья подробно описывает различия
Действия
- Пользовательский интерфейс и обработка всегда привязаны. Вы не можете разделять друг друга
- В то время как Действия могут быть внесены в различные части рабочего места (всплывающее меню/панель инструментов), все они были разными точками расширения, и поэтому вы в конечном итоге дублируете XML в нескольких местах. Хуже всего то, что не все точки расширения ожидают той же конфигурации.
- Указание действий в нескольких местах - это кошмар обслуживания. Если вам нужно изменить значок действия, вам необходимо изменить во всех местах.
- Еще одна проблема с дублированием действий в plugin.xml заключается в том, что несколько экземпляров тех же действий будут созданы в памяти.
Команды содержат больше точек расширения, но:
- Обработчик может быть объявлен отдельно от команды. Это позволяет использовать объявления нескольких обработчиков для одной и той же команды.
- activeWhen для всех обработчиков оценивается и выбирается тот, который возвращает true для наиболее конкретного условия. Все эти вещи выполняются без загрузки загрузчика в память. Даже без загрузки плагина!
- Определение параметров - это возврат карты отображаемых имен и идентификаторов. Имя будет отображаться на странице привязки клавиш, и идентификатор будет использоваться для вызова команды при нажатии клавиши.
- Определите IExecutionListener, который является просто наблюдателем выполнения команды, поэтому он не может накладывать вето на него и не вносить никаких изменений в событие