Подтвердить что ты не робот

Замена if else с шаблоном

У меня есть оператор if else, который может вырасти в ближайшем будущем.

    public void decide(String someCondition){

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

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

           //
           someMethod("anotherParameter");

        }
        .
        .
        else{

            someMethod("elseParameter");

        }
}

Так как это уже выглядит беспорядочным, я думаю, было бы лучше, если бы я мог применять любые шаблоны дизайна здесь. Я просмотрел шаблон стратегии, но я не уверен, что это уменьшит если условие else. Любые предложения?

4b9b3361

Ответ 1

Это классический Заменить диспетчер условий с помощью команды в книге Рефакторинг в шаблоны.

enter image description here

В основном вы создаете объект Command для каждого из блоков кода в своей старой группе if/else, а затем создаете карту тех команд, где ключи являются вашим условием. Строки

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 для обработки случая, когда условие отсутствует на карте.

 Handler defaultHandler = ...

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

Ответ 2

Общая рекомендация Мартина Фаулера заключается в том, чтобы Заменить условный с полиморфизмом.

С точки зрения шаблонов проектирования это часто будет шаблон стратегии Заменить условную логику со стратегией.

Если у вас есть небольшой, конечный набор условий, я рекомендую использовать перечисление для реализации шаблона стратегии (предоставить абстрактный метод в перечислении и переопределить его для каждой константы).

public enum SomeCondition{
   CONDITION_ONE{

       public void someMethod(MyClass myClass){
              //...
       }
   },

   CONDITION_TWO{

       public void someMethod(MyClass myClass){
       }

   }

   public abstract void someMethod(MyClass myClass);

}

public class MyClass{
//...
    public void decide(SomeCondition someCondition){
        someCondition.someMethod(this);
    }

}

Если это действительно просто параметр, который вы хотите выбрать, тогда вы можете определить enum как это:

public enum SomeCondition{
   CONDITION_ONE("parameterOne"),

   CONDITION_TWO("parameterTwo");

   private SomeCondition(String parameter){
       this.parameter = parameter;
   }

   public String getParameter(){
       return parameter;
   }

}


public class MyClass{
//...
    public void decide(SomeCondition someCondition){
        someMethod(someCondition.getParameter());
    }

}

Ответ 3

Я думаю, вы, должно быть, уже это рассмотрели, но если вы используете JDK 7 или выше, вы можете включить строки. Таким образом, ваш код может выглядеть более чистым, чем куча инструкций if-else.