2009-12-06 2 views
0

Я пишу приложение для приема SMS-сообщений через HTTP-шлюз. Основными параметрами, которые я буду обрабатывать, являются номер телефона отправителя и само сообщение. Однако, в зависимости от ключевого слова в сообщении, мне нужно выполнить другую логику/вернуть другой ответ. Для начала я использовал простой if/else, который превратился в оператор switch, и теперь я ищу его немного почистить.Какой шаблон дизайна подходит для счета в этом сценарии?

Я думаю, что это какая-то реализация шаблона команды, но я не уверен. Я мог бы реализовать каждую операцию как объект команды и зарегистрировать их все с помощью командного процессора, но тогда мне пришлось бы реализовать что-то вроде функции CanExecute (...), чтобы определить соответствующую команду для выполнения. Условия, для которых должна выполняться команда, могут зависеть от нескольких факторов, таких как ключевое слово или конкретный контент сообщения.

Я думаю, что-то вроде следующего:

public interface ISmsCommand 
{ 
    bool CanExecute(string sender, string message); 
    string Execute(string sender, string message); 
} 

public class SmsHelpCommand : ISmsCommand 
{ 
    public bool CanExecute(string sender, string message) 
    { 
     return (message.ToLower().StartsWith("help")); 
    } 

    public string Execute(string sender, string message) 
    { 
     return "For more info, visit..."; 
    } 
} 

public class SmsHttpHandler : IHttpHandler 
{ 
    List<ISmsCommand> _commands = new List<ISmsCommand>(); 

    public bool IsReusable 
    { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     var sender = context.Request.Form[...]; 
     var message = context.Request.Form["Message"]; 

     foreach (var command in _commands) 
     { 
      if (command.CanExecute(sender, message)) 
      { 
       var response = command.Execute(sender, message); 
       SendTextMessage(sender, response); 
       break; 
      } 
     } 
    } 
} 

Что-то в этом коде кажется подозрительным мне, хотя. Я думаю, мне не нравится отправлять аргументы как функции CanExecute, так и функции Execute, но я не уверен. Есть предположения?

+0

Будут ли ответы на различные ключевые слова динамическими/плагинами? Это может повлиять на способ сделать это. – David

+0

Не совсем.Командные процессоры довольно статичны - мне просто нужен лучший способ отвлечь логику от приемника/обработчика команд. – Chris

ответ

1

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

Хотя обычно в шаблоне команды вы снабжаете его чем-то, чтобы выполнить его команду. Подумайте, как работает объект SqlCommand, вы даете ему SqlConnection и просто скажите ему выполнить. Объект команды использует SqlConnection для выполнения необходимых действий. Вы помещаете ногу на педаль газа, и она перемещает все связи, чтобы сделать машину быстрее. Вы не нажимаете на педаль газа, а затем открываете дроссель самостоятельно.

Я бы предположил, что вы либо даете команду SendTextMessage функции или объекта, которые позволяют использовать эту функциональность (подумайте о SqlConnection) в ее конструкторе. Или просто подайте его с помощью метода Execute вместе с sender и message. Это дает вам возможность просто позволить команде выполнять свою работу. В то же время, позволяя вам ограничить его способность делать это с помощью функциональности SendTextMessage, вы предоставляете ее. Он будет делать это, если это возможно, и если он не может, поскольку он не должен давать сообщение, он не отправит сообщение.

1

Разбор сообщения должен быть выполнен досрочно перед передачей команды. По крайней мере, достаточно, чтобы определить, какая команда применима. Другими словами, не обязательно, чтобы объект команды определял, представляет ли сообщение эту команду. Метод состояния команды должен определять только, применима ли конкретная команда в заданном состоянии. Вам не нужно запрашивать каждую команду, если она хочет сообщение.

У меня были бы команды, такие как GetBalanceCommand, TransferMoneyCommand и т. Д. Затем простейший текстовый токенизатор проанализирует сообщение и определит, какой командный объект создает экземпляр и передает токенированную строку методам CanExecute/Execute команды.

+0

Это вернуло бы меня туда, где я сейчас .. немного длинный, если/else или оператор switch, выполняющий разбор команд ... – Chris

+0

Я должен уточнить, что логика, чтобы определить, какая команда должна быть выполнена, не так проста как говорят, 1 команда за каждое ключевое слово. Если бы это было так, я бы просто использовал поиск словаря, чтобы определить, какую команду выполнить. – Chris

Смежные вопросы