Рефакторинг - переход от конкретных к универсальным интерфейсам - PullRequest
0 голосов
/ 15 мая 2018

У меня вопрос о рефакторинге и о том, как сделать интерфейсы и классы общими .

Предположим, у меня следующая ситуация: Прежде чем самолет сможет взлететь, необходимо выполнить ряд проверок (проверок).Некоторые из этих проверок находятся на уровне самолета (например, в самолете достаточно топлива).Другие проверки на пассажирском уровне (например, пристегнут ремень безопасности).

Идея заключается в следующем: Вы можете написать ряд правил проверки (фрагментов), которые проверяют конкретные критерии.Например, вы можете иметь валидаторы уровня плоскости: EnoughFuelValidatorFragment и WorkingLightsValidatorFragment.Точно так же вы можете иметь валидаторы уровня пассажира: SeatbeltFastenValidatorFragment и PersonInRightSpotValidatorFragment.

Теперь , я написал два интерфейса PlaneValidatorFragment и PassengerValidatorFragment, с внутренними классами FragmentSequenceRunner и FragmentSequenceBuilder.Намерение состоит в том, чтобы вызвать выборку фрагментов валидатора на основе TYPE_OF_PLANE и TYPE_OF_PASSENGER.FragmentSequenceBuilder «связывает» цепочки валидаторов, тогда как FragmentSequenceRunner выполняет валидацию для всех выбранных валидаторов.

public interface PlaneValidatorFragment {

    List<ErrorMessages> validate(TYPE_OF_PLANE);

    class FragmentSequenceRunner implements PlaneValidatorFragment {
        // ...

        @Override
        List<ErrorMessages> validate(TYPE_OF_PLANE) {
            // Override implementation of validate() here. 
        }
    }

    class FragmentSequenceBuilder {
        // Enough to build the sequence of validation fragments. 
    }
}

public interface PassengerValidatorFragment {

    List<ErrorMessages> validate(TYPE_OF_PASSENGER, TYPE_OF_PLANE);

    class FragmentSequenceRunner implements PassengerValidatorFragment {
        // ...

        @Override
        List<ErrorMessages> validate(TYPE_OF_PASSENGER, TYPE_OF_PLANE) {
            // Override implementation of validate() here.
        }
    }

    class FragmentSequenceBuilder {
        // Enough to buikd the sequence of validation fragments.
    }

}

Идея состоит в том, чтобы иметь возможность сделать что-то вроде этого: Создать валидатор для любого типа самолета (например, Boeing737Validator), и проверить проверку на удаление, выбрав число существующихзапускаемые фрагменты валидатора.

Предположим, что TYPE_OF_PLANE и TYPE_OF_PASSENGER определены как классы, такие как: - Boeing737 - AirbusA300 - BusinessClass - EconomyClass

Моя текущая реализация НЕ является общей. Вместо PlaneValidatorFragment и PassengerValidatorFragment у меня есть Boeing737PlaneValidatorFragment и Boeing737PassengerValidatorFragment.

public interface Boeing737PlaneValidatorFragment {

    List<ErrorMessages> validate(Boeing737);

    class FragmentSequenceRunner implements Boeing737PlaneValidatorFragment {

        @Override
        List<ErrorMessages> validate(Boeing737) {...}
    }

    class FragmentSequenceBuilder {...}
}

public interface Boeing737PassengerValidatorFragment {

    List<ErrorMessages> validate(EconomyClass, Boeing737);

    class FragmentSequenceRunner implements Boeing737PassengerValidatorFragment {

        @Override
        List<ErrorMessages> validate(EconomyClass, Boeing737) {...}
    }

    class FragmentSequenceBuilder {...}

}

Здесь TYPE_OF_PLANE и TYPE_OF_PASSENGER явно определены.Вместо этого Я хотел бы сделать интерфейсы универсальными , чтобы работать со всеми типами самолетов и пассажиров (укажите класс в качестве параметра).

Примерно так:

public interface PlaneValidatorFragment<T> {

    List<ErrorMessages> validate(T typeOfPlane);

    class FragmentSequenceRunner<T> implements PlaneValidatorFragment<T> {

        @Override
        List<ErrorMessages> validate(T typeOfPlane) {...}
    }

    class FragmentSequenceBuilder {
        // Enough to build the sequence of validation fragments. 
    }
}

public interface PassengerValidatorFragment<T, S> {

    List<ErrorMessages> validate(T typeOfPassenger, S typeOfPlane);

    class FragmentSequenceRunner<T, S> implements PassengerValidatorFragment<T, S> {

        @Override
        List<ErrorMessages> validate(T typeOfPassenger, S typeOfPlane) {...}
    }

    class FragmentSequenceBuilder {
        List<PassengerValidatorFragment<T, S>> fragments; 
    }

}

TL; DR: Как сделать интерфейсы PlaneValidatorFragment и PassengerValidatorFragment общими?То есть;как я могу параметризовать их, чтобы взять в TYPE_OF_PLANE и TYPE_OF_PASSENGER (как классы).

Я на правильном пути?

...