Я пишу приложение, которое посылает команды командной строки стороннему приложению.
Итак, у меня есть список команд вроде:
"process images"
"apply effect blur"
"save as png"
...
Я не знаю, как лучше всего организовать их в стиле ООП.
Сейчас у меня есть:
switch ( e.KeyCode )
{
case Keys.A:
SendCommand ( "process images" );
break;
case Keys.B:
SendCommand ( "apply effect blur" );
break;
case Keys.C:
SendCommand ( "save as png" );
break;
...
}
Я хочу иметь возможность сделать это чистым способом. Может быть, как:
SendCommand (Commands.ApplyBlur)
и т.д.
Но я не знаю, какой путь лучший. Я думал хранить их в коллекции, но думал, что это будет не понятно или разумно.
Я предлагаю использовать словарь для сопоставления между входом и командой. Простейшим решением является отображение непосредственно между клавишами и текстом команды.
Dictionary<ConsoleKey, String> map = new Dictionary<ConsoleKey, String>()
{
{ ConsoleKey.A, "process image" },
{ ConsoleKey.B, "apply blur effect" },
{ ConsoleKey.C, "save as png" }
};
ConsoleKey key = Console.ReadKey().Key;
String command;
if (map.TryGetValue(key, out command))
{
SendCommand(command);
}
else
{
HandleInvalidInput();
}
В зависимости от ваших реальных потребностей это может быть более чистое решение для выполнения двухэтапного сопоставления - от входного ключа до значения перечисления и от значения перечисления до текста команды. Вы также должны подумать о создании класса команд и предоставлении статических экземпляров для своих команд.
public class Command
{
public Command(String commandText)
{
this.CommandText = commandText;
}
public String CommandText { get; private set; }
public void Send()
{
// Dummy implementation.
Console.WriteLine(this.CommandText);
}
// Static command instances.
public static readonly Command ProcessImage = new Command("process image");
public static readonly Command BlurImage = new Command("apply blur effect");
public static readonly Command SaveImagePng = new Command("save as png");
}
В этом классе код для отправки команд будет выглядеть примерно следующим образом.
Dictionary<ConsoleKey, Command> map = new Dictionary<ConsoleKey, Command>()
{
{ ConsoleKey.A, Command.ProcessImage },
{ ConsoleKey.B, Command.BlurImage},
{ ConsoleKey.C, Command.SaveImagePng }
};
ConsoleKey key = Console.ReadKey().Key;
Command command;
if (map.TryGetValue(key, out command))
{
command.Send();
}
else
{
HandleInvalidInput();
}
Я только начинаю понимать Design Patterns, но это кажется идеальным для Command Pattern.
Итак, вот мои предположения, стороннее приложение имеет конечный и статический набор командных переключателей, вы не будете возиться с набором коммутаторов, просто передавая их в приложение.
Мне кажется, что если эти предположения верны, командный шаблон является излишним, я бы просто склонялся к созданию статического класса Command (s), который просто предоставляет строки как статическое свойство или константу и содержит статическую команду send метод.
чтобы вы могли просто написать, как вы предположили...
Command.SendCommand(Command.ProcessImages);
Вы можете использовать шаблон команды, чтобы вы могли поместить каждую команду в свой класс. Это также позволит вам сделать команды доступными из нескольких мест в вашей программе без необходимости переписывать или копировать и вставлять код каждый раз, когда вы хотите что-то сделать.
Может быть полезно поставить имена команд в перечисляемый тип, чтобы другие программисты, которые используют ваш командный класс, не должны знать точную текстовую команду для отправки, они могут просто выбрать ее из набора, используя автозаполнение в Visual Studio
public enum CommandType
{
ApplyBlur,
ProcessImage,
Save
}