Я пытаюсь создать нагрузку "команд" - в основном строка, определяющая имя команды, и около 4 связанных с ней функций. Обычно я собирал каждую "команду" в статический класс и просто имел много разных статических классов для каждой команды.
Однако я также хочу иметь список всех доступных команд, поэтому у меня есть возможность вызвать функции, зная имя команды - это невозможно сделать со статическими классами.
Я думал об использовании рефлексии для создания списка. Я также подумал об использовании шаблона singleton и в каждом конструкторе, добавив единственный объект в статический список, общий для всех классов "команда". Ни один из этих методов не является особенно опрятным, хотя...
Существует ли шаблон проектирования для этого сценария? Или любые методы, которые люди использовали в прошлом? Все советы были оценены!
Я использую С#, хотя это не очень актуально для вопроса.
Вы наметили два лучших метода.
В шаблоне реестра есть класс (реестр), в котором есть список всех доступных команд. Преимущество в том, что это просто, недостатком является то, что разработчик должен знать, что команда должна быть зарегистрирована. Используйте базовый класс, чтобы помочь разработчику (кто будет писать больше команд) в том, что делать.
Съемный шаблон - это то, где вы используете отражение, чтобы найти все загруженные типы в Current AppDomain. Это имеет то преимущество, что это можно сделать после загрузки приложения, что дает вам возможность динамически загружать сборки.
Чтобы помочь сохранить ваш код в обслуживании, я бы рекомендовал сделать простейшую вещь, которая работает, направляя разработчика (кто будет создавать новые команды), что делать.
Я не знаю, что способ, которым я это делаю, моделируется после определенного шаблона, но у меня есть программа, используемая в производстве, которая использует словарь и интерфейс. Интерфейс достаточно прост
public interface KeyboardActionCommand
{
void ExecuteOnKeyDown();
void ExecuteOnKeyUp();
}
Чтобы сделать список предопределенных команд, было легко в этом случае с помощью Dictionary<string, KeyboardActionCommand>
. Откат назад к этому был, если в моем случае, когда мне в конечном итоге пришлось добавлять настройки, например, когда я создал новый класс под названием OpenProgramKeyboardActionAcommand
как и выведено по имени он открыл программу, но было нецелесообразно создавать кучу предопределенных версий этого класса. Вместо этого я должен был создать класс, чтобы помочь в создании этих типов команд. Однако в моем словаре у меня было несколько. example я availableCommands.Add("Open Calculator", new OpenProgramKeyboardActionCommand(@"C:\Windows\System32\calc.exe"));
поэтому у него есть откат.
Другая идея состоит в том, чтобы сделать делегата для значащей части словаря. Затем вы можете создать свой статический класс с кучей реализованных методов делегирования. Это тоже неплохо.