2009-12-06 6 views
0

HTTP 게이트웨이를 통해 SMS 메시지를 수신하는 응용 프로그램을 작성하고 있습니다. 처리 할 주요 매개 변수는 발신자의 전화 번호와 메시지 자체입니다. 그러나 메시지 내의 키워드에 따라 다른 논리를 실행하거나 다른 응답을 반환해야합니다. 우선, switch 문으로 바뀐 간단한 if/else를 사용했습니다. 이제는 조금 깔끔하게 정리하려고합니다.이 시나리오에서 청구서에 맞는 디자인 패턴은 무엇입니까?

내가 원하는 것은 명령 패턴의 일종의 구현이라고 생각하지만 확실하지 않습니다. 각 작업을 명령 개체로 구현하고 명령 프로세서로 모두 등록 할 수는 있지만 실행하기 적합한 명령을 결정하기 위해 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 생각)를 생성자에 제공한다는 것입니다. 또는 sendermessage과 함께 Execute 방법을 지정하면됩니다. 이렇게하면 명령이 명령을 내릴 수있게됩니다. 동시에 당신이 SendTextMessage 기능을 통해 능력을 제한 할 수있게 해주는 동안 그것을 제공합니다. 할 수 있으면 할 것이다. 할 수 없다면 메시지를 보내지 않기 때문에 메시지를 보내지 않을 것이다.

1

메시지 구문 분석은 명령을 전달하기 전에 미리 수행해야합니다. 적어도 적용 가능한 명령을 판별하기에 충분합니다. 즉, 메시지가 해당 명령을 나타내는 지 여부를 판별하는 것은 명령 오브젝트의 책임이 아니어야합니다. 명령의 상태 메서드는 특정 명령이 특정 상태에 적용 가능한지 여부 만 결정해야합니다. 메시지를 원한다면 각 명령에 대해 묻지 않아도됩니다.

나는 GetBalanceCommand, TransferMoneyCommand 등과 같은 명령을 가지게됩니다. 간단한 문자열 토크 나이저를 사용하여 메시지를 구문 분석하고 토큰 화 된 문자열을 명령의 CanExecute/Execute 메소드에 전달할 명령 개체를 결정하십시오.

+0

그게 바로 지금 내가 어디에 놓을까요 .. 조금 길어/else 또는 명령문 구문 분석을 수행하는 switch 문 ... – Chris

+0

어떤 명령을 실행해야하는지 결정하는 논리를 간단하게 작성하지 않아야합니다. 예를 들어, 핵심 단어 당 1 명령. 그렇다면 사전 조회를 사용하여 실행할 명령을 결정하기 만하면됩니다. – Chris

관련 문제