Summary: 你有一个函数,其中彻底取决于参数值而采起不一样行为。针对该参数的每个可能值,创建一个独立函数。java
动机:函数
Replace Parameter with Explicit Methods 偏偏相反于Parameterize Method。若是某个参数有不少种可能的值,而函数内又以条件表达式检查这些参数值,并根据不一样参数值作出不一样的行为,那么就应该使用本项重构。调用者本来必须赋予参数适当的值,以决定该函数作出何种响应。如今既然你提供了不一样的函数给调用者私用,就能够避免出现条件表达式。此外你还能够得到编译期检查的好处,并且接口也更清楚。若是以参数值决定函数行为,那么函数用户不但须要观察该函数,并且还要判断参数值是否合法,而“合法的参数值”每每不多在文档中被清楚地提出。测试
就算不考虑编译器检查的好处,只是为了 得到一个清晰的接口,也值得你执行本项重构。哪怕只是给一个内部的布尔变量赋值,相较之下,Witch.beOn()也比Switch.setState(true)要清晰得多。spa
可是,若是参数值不会对函数行为有太多影响,你就不该该使用Replace Parameter with Explicit Methods。若是状况真这样,而你也只须要经过参数为一个字段赋值,那么直接使用设值函数就好了。若是的确须要条件判断的行为,可考虑使用Replace Conditional with Polymorphism。code
作法:对象
1. 针对参数的每一种可能值,新建一个明确函数。接口
2.修改条件表达式的每一个分支,使其条用合适的新函数。ci
3.修改每一个分以后,编译并测试。文档
4.修改原函数的每个被调用点,改而调用上述的某个合适的新函数。编译器
5.编译,测试。
6.全部调用端都修改完毕后,删除原函数。
范例:
下列代码中,咱们根据不一样的参数值,创建Employee之下不一样的子类。如下代码每每是Replace Constructor with Factory Method的施行成果:
static final int ENGINEER = 0; static final int SALESMAN = 1; static final int MANAGER = 2; static Employee create(int type){ switch(type){ case ENGINEER: return new Engineer(); case SALESMAN: return new Salesman(); case MANAGER: return new Manager(); defaule: throw new IllegalArgumentException("Incorrect type code value"); } }
因为这是一个工厂函数,咱们不能实施Replace Conditional with Polymorphism,由于使用该函数时对象根本还没建立出来。因为能够预见到Employee不会有太多新的子类,因此咱们能够放心地为每一个子类创建一个工厂函数,而没必要担忧工厂函数的数量会剧增。首先,根据参数值创建相应的新函数:
static Employee createEngineer(){ return new Engineer(); } static Employee createSalesman(){ return new Salesman(); } static Employee createManager(){ return new Manager(); }
而后把switch语句的各个分支替换为对新函数的调用,每修改一个分支,都须要编译并测试,直到全部分支修改完毕为止:
static Employee create(int type){ switch(type){ case ENGINEER: return Employee.createEngineer(); case SALESMAN: return Employee.createSalesman(); case MANAGER: return Employee.createManager(); defaule: throw new IllegalArgumentException("Incorrect type code value"); } }
接下来,咱们把注意力转移到旧函数的调用端。咱们把诸以下面这样的代码:
Employee kent = Employee.create(ENGINEER);
替换为:
Employee kent = Employee.createEngineer();
修改完create()函数的全部调用者以后,就能够把create()函数删掉了。同时也能够把全部常量都删掉。