2017-12-30 96 views
0

봇 프레임 워크 (https://dev.botframework.com/)로 개발 된 봇을 가지고 있으며이 봇은 들어오는 명령을 기반으로 특정 작업을 수행해야합니다.문자열 비교를 패턴으로 바꾸기

따라서 내 코드에는 여러 개의 (정확하게 9 개의 if) if 문이 포함 된 메서드가 있습니다. (아래 예 참조). 들어오는 명령을 구문 분석합니다. 나는 코드를 더 좋게 만드는 좋은 패턴을 찾으려고 노력하고있다. 아마도 9 개의 if 문은 괜찮지 만 향후 이러한 문구가 증가 할 수있는 잠재적 위험이 있음을 알 수 있습니다. 나는 전략적 패턴을보고 있었지만 실제로 그것이 좋은 후보로 보이지는 않는다. 여러 개의 if 문을 대체 할 수있는 패턴은 무엇입니까?

if (text.Contains("command1")) { 
    doA(); 
} 

if (text.Contains("command2")) { 
    doB(); 
} 

... an so on. 
+0

문자열' "aaabbb는"'모두'doA'에 의해 처리된다 당신의 예제에서'doB'? –

+1

어떤 언어를 사용하고 있습니까? – Sweeper

+0

언어는 C#이고 "aaa"및 "bbb"문자열은 예제 일뿐입니다. 더 나은 가치로 질문을 업데이트했습니다. – Robert

답변

1

전략 패턴을 사용할 수 있습니다. 아래의 간단한 예 :

선언 :

class ResponseStrategy 
{ 
    private readonly IEnumerable<IInputHandler> _responses; 

    public ResponseStrategy(IEnumerable<IInputHandler> responses) 
    { 
     // TODO protect from null input, etc. 
     _responses = responses; 
    } 

    public ?void? Respond(string input) 
    { 
     // TODO put error handling in place and expect input to match no handlers 
     _responses 
      .First(r => r.CanHandle(input)) 
      .Handle(input); 
    } 
} 

interface IInputHandler 
{ 
    bool CanHandle(string input); 
    ?void? Handle(string input); 
} 

class DoAInputHandler : IInputHandler 
{ 
    public bool CanHandle(string input) 
    { 
     return input.contains("command1"); 
    } 

    public ?void? Handle(string input) 
    { 
     // DoA(); 
    } 
} 

class DoBInputHandler : IInputHandler 
{ 
    public bool CanHandle(string input) 
    { 
     return input.contains("command2"); 
    } 

    public ?void? Handle(string input) 
    { 
     // DoB(); 
    } 
} 

설정 :

var responses = new List<IInputHandler> 
{ 
    new DoAInputHandler(), 
    new DoBInputHandler(), 
    // other handlers 
}; 
var responseStrategy = new ResponseStrategy(responses); 

사용법 :

responseStrategy.Respond("asl;daskjnfsd command1 asdsdgdfn");