重构 - 从特定接口转到通用接口

时间:2018-05-15 04:42:11

标签: java generics interface refactoring

我对重构以及如何使接口和类通用有疑问。

假设我遇到以下情况: 在飞机起飞之前,必须进行一些检查(验证)。 其中一些验证是在平面上进行的(例如,飞机有足够的燃料)。 其他验证是乘客级别的(例如系好安全带)。

这个想法如下: 您可以编写一些测试特定条件的验证规则(片段)。 例如,您可以使用平面级验证器: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(作为类)。

我是否走在正确的轨道上?

0 个答案:

没有答案