Попытка удалить избыточные случаи коммутатора - PullRequest
0 голосов
/ 07 марта 2019

В данный момент я работаю над проектом, и в моем коде есть несколько переключателей с красным флагом, которые я бы хотел уменьшить.Мое объяснение довольно длинное, пожалуйста, потерпите меня.

У меня есть контейнерный объект.Этот контейнер имеет значение определенного типа (bool, int, email ...), и мне нужно иметь возможность переключать этот тип.Например, мне нужно переключить «String» -контейнер на «Integer» -контейнер, если значение является конвертируемым.Сначала я думал об использовании Generics, но по другим причинам я не могу переделать контейнерный объект.Я должен быть в состоянии изменить это, не делая новый контейнер.Я создал суперкласс Supertype и для каждого возможного значения подкласс: IntType, BooleanType и т. Д. Проблема с этим подходом состоит в том, что в каждом подклассе есть метод "canValueConvertToType (перечисление, соответствующее типу)msgstr "в котором есть оператор switch, который проверяет различные типы, которые мы можем использовать.

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

Моя идея состояла в том, чтобы преобразовать текущее значение в строку и сравнить эту строку со всеми типами в централизованном классе, чтобы при наличии нового типа я добавлял только одно сравнение в одном месте.

Есть ли лучший способ решить эту проблему?

Редактировать:

<<centralized class>>
public class HulpMethodes {


    public static SuperType createSuperType(Enum type, Object value){
        switch(type){
            case BOOLEAN: return new BoolType((Boolean) value);
            case INTEGER: return new IntType((Integer) value);
        }

        return null;
    }

    public static  boolean canValueConvertToType(Enum type, String value){
        switch(type){
            case BOOLEAN: return <<method to check this>>
            case INTEGER: return <<method to check this>>
        }
    }
}

В старой версии этот переключатель был бы там для каждого подкласса.

<<Old example of canConvert-Method in IntType>>
@Override
   public boolean canValueConvertToType(Enum type) {
       switch(type){
           case BOOLEAN:
               return false;
           case EMAIL:
               return false;
           case STRING:
               return true;
           case INTEGER:
               return true;
       }
       return false;
   }

Способ вызова этих методов изменится на.

public class Container {

    private SuperType type;

    public Container(Enum type, Object value){
        this.type = HulpMethodes.createSuperType(type,value);
    }

    public void canValueConvertToType(Enum type){
        HulpMethodes.canValueConvertToType(type, this.type.valueToString());
    }


}

vs

public class Container {



    private SuperType type;

        public Container(Enum type, Object value){
            this.type = HulpMethodes.createSuperType(type,value);
        }

        public void canValueConvertToType(Enum type){
            this.type.canValueConvertToType(type);
        }


    }

PS: пришлось комбинировать код из черновика с быстро написанной идеей, поэтому я надеюсь, что я не сделалименная ошибка или что-то.

...