我对重构以及如何使接口和类通用有疑问。
假设我遇到以下情况: 在飞机起飞之前,必须进行一些检查(验证)。 其中一些验证是在平面上进行的(例如,飞机有足够的燃料)。 其他验证是乘客级别的(例如系好安全带)。
这个想法如下: 您可以编写一些测试特定条件的验证规则(片段)。 例如,您可以使用平面级验证器:EnoughFuelValidatorFragment和WorkingLightsValidatorFragment。 同样,您可以拥有乘客级验证器:SeatbeltFastenedValidatorFragment和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被定义为类,例如: - 波音737 - AirbusA300 - 商务课程 - 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(作为类)。
我是否走在正确的轨道上?