Как я могу организовать коллекции строк в ООП?

2

Я пишу приложение, которое посылает команды командной строки стороннему приложению.

Итак, у меня есть список команд вроде:

"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) и т.д.

Но я не знаю, какой путь лучший. Я думал хранить их в коллекции, но думал, что это будет не понятно или разумно.

Теги:

5 ответов

3
Лучший ответ

Я предлагаю использовать словарь для сопоставления между входом и командой. Простейшим решением является отображение непосредственно между клавишами и текстом команды.

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();
}
  • 0
    Очень хороший ответ
2

Я только начинаю понимать Design Patterns, но это кажется идеальным для Command Pattern.

2

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

Мне кажется, что если эти предположения верны, командный шаблон является излишним, я бы просто склонялся к созданию статического класса Command (s), который просто предоставляет строки как статическое свойство или константу и содержит статическую команду send метод.

чтобы вы могли просто написать, как вы предположили...

Command.SendCommand(Command.ProcessImages);
  • 0
    Ваши предположения верны.
1

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

  • 0
    Спасибо, но команды - это просто строки, имеет ли смысл создавать отдельные классы для каждого?
  • 0
    Они могут быть в одном файле. Шаблон команд действительно был разработан для более сложных команд, но, похоже, он лучше всего подходит для ваших нужд.
0

Может быть полезно поставить имена команд в перечисляемый тип, чтобы другие программисты, которые используют ваш командный класс, не должны знать точную текстовую команду для отправки, они могут просто выбрать ее из набора, используя автозаполнение в Visual Studio

public enum CommandType
{        
    ApplyBlur,
    ProcessImage,
    Save
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню