У меня вопрос о рефакторинге и о том, как сделать интерфейсы и классы общими .
Предположим, у меня следующая ситуация: Прежде чем самолет сможет взлететь, необходимо выполнить ряд проверок (проверок).Некоторые из этих проверок находятся на уровне самолета (например, в самолете достаточно топлива).Другие проверки на пассажирском уровне (например, пристегнут ремень безопасности).
Идея заключается в следующем: Вы можете написать ряд правил проверки (фрагментов), которые проверяют конкретные критерии.Например, вы можете иметь валидаторы уровня плоскости: 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 (как классы).
Я на правильном пути?