Я пишу приложение для получения 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, но я не уверен. Есть мысли?