1. ホーム
  2. java

if else文をパターンに置き換える

2023-09-01 17:18:54

質問

近い将来、大きくなるかもしれないif else文があります。

    public void decide(String someCondition){

        if(someCondition.equals("conditionOne")){
            //
            someMethod("someParameter");

        }else if(someCondition.equals("conditionTwo")){

           //
           someMethod("anotherParameter");

        }
        .
        .
        else{

            someMethod("elseParameter");

        }
}

このように、すでにごちゃごちゃしているので、何かデザインパターンを適用した方が良いのではないかと思います。私はStrategyパターンを調べましたが、私はそれがここでif else条件を減らすことができるかどうかわからない。何か提案はありますか?

どのように解決するのですか?

これは古典的な コンディション・ディスパッチャをコマンドに置き換える であり、リファクタリング to パターンの本で紹介されています。

基本的には Command オブジェクトを作成し、それらのコマンドの Map を作成して、キーが条件の文字列となります。

interface Handler{
    void handle( myObject o);
}


 Map<String, Handler> commandMap = new HashMap<>();
 //feel free to factor these out to their own class or
 //if using Java 8 use the new Lambda syntax
 commandMap.put("conditionOne", new Handler(){
         void handle(MyObject o){
                //get desired parameters from MyObject and do stuff
          }
 });
 ...

そして、あなたのif/elseコードの代わりに、それは代わりになります。

 commandMap.get(someCondition).handle(this);

これで、後で新しいコマンドを追加する必要がある場合、ハッシュに追加するだけです。

デフォルトのケースを処理したい場合は Null Object パターンを使って、ある条件がMapにない場合を処理することができます。

 Handler defaultHandler = ...

if(commandMap.containsKey(someCondition)){
    commandMap.get(someCondition).handle(this);
}else{
    defaultHandler.handle(this);
}