2017-12-30 89 views
0

私はBot Framework(https://dev.botframework.com/)で開発したボットを持っており、このボットは入ってくるコマンドに基づいて特定のものになっています。文字列比較とパターンの置換

私のコードでは、複数の(正確には9個の)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");