Лучший способ создать класс, который возвращает команды в регулярных выражениях - PullRequest
2 голосов
/ 14 февраля 2020

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

if (Regex.Match(...,.....).Success)
{
// Do #1
}
else if (Regex.Match(...,.....).Success)
{
// Do #2
}

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

Может быть, класс с именем CommandDictionary, который сканирует строки на предмет совпадения, генерирует список команд, соответствующих каждому успешному совпадению с регулярным выражением, а затем выбирает команду, связанную с наивысшим приоритетом? Например, если «Hello» соответствует «Greet» и «Ignore», но «Greet» имеет более высокий приоритет, ответом будет «Do Greet».

1 Ответ

4 голосов
/ 14 февраля 2020

Вы можете реализовать шаблон стратегии. Создайте интерфейс, создайте конкретные реализации этого интерфейса, по одной для каждой команды, а затем поменяйте их местами на основе команд.

public interface IBotCommand
{
    string RegexMatch { get; }
    int Priority { get; }
    bool CanProcess(string input);
    void Do();
}


public class BotCommandOne : IBotCommand
{
    public string RegexMatch => "[a-z]g"; // whatever regex criteria you need for bot one
    public int Priority => 1;
    public bool CanProcess(string input)
    {
        return Regex.Match(input, RegexMatch).Success;
    }

    public void Do()
    {
       //Do command here for bot one
    }
}

Тогда, если вы используете внедрение зависимостей, go зарегистрирует весь ваш интерфейс / реализации как одиночные.

Затем в своем коде вызова вы можете вставить IEnumerable<IBotCommand>

public class BotClass
{
    private readonly IEnumerable<IBotCommand> _commands;

    public BotClass(IEnumerable<IBotCommand> commands)
    {
        _commands = commands;
    }

    public void PerformCommand(string userInput)
    {
         //go find the right command for your input
         var botCommand = _commands.Where(c => c.CanProcess(userInput).OrderBy(c => c.Priority).First();
         botCommand.Do();
    }

}

Таким образом, когда вам нужно добавить больше команд бота, вы можете просто реализовать интерфейс, зарегистрируйте его для DI, и ваш код вызова будет просто работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...