背景说明
假设在开发一个大型平台时,如果在编码初期就频繁使用 ifelse 语句来决定不同业务模块的处理逻辑,随着业务的不断拓展和变更,代码的修改和维护将会变得异常艰难,可扩展性受到极大限制。
因此,如果能对ifelse 进行优化,那么将提高模块的可扩展性。在面向对象语言里,存在一个强大的控制流操作符:对象。我们能够运用多个已实现的接口,如此一来,便能够依据实例化的类来明确所要运行的代码。
下面是一个示例,此示例会根据用户类型,来切换用户的皮肤。
重构前
public enum UserType {
DIAMOND("DIAMOND","钻石级别用户"),
GOLD("GOLD","黄金级别用户"),
COMMON("COMMON","普通用户"),
;
private String code;
private String description;
UserType(String code, String description){
this.code = code;
this.description = description;
}
}
public void updateSkin(UserType userType){
if(userType== UserType.GOLD){
updateGoldSkin();
}else if(userType== UserType.DIAMOND){
updateCommonSkin();
}else{
updateDiamondSkin();
}
}
private void updateDiamondSkin(){
//change diamond user skin
}
private void updateGoldSkin(){
//change vip skin
}
private void updateCommonSkin(){
//change common user skin
}
重构后
可以使用接口的方式,将枚举值和ifelse语句进行优化。
public interface UserSkin {
/**
* 更换用户的皮肤
*/
void updateSkin();
}
public class Gold implements UserSkin{
@Override
public void updateSkin(){
//change gold skin
}
}
public class Diamond implements UserSkin{
@Override
public void updateSkin(){
//change diamond skin
}
}
public class Common implements UserSkin{
@Override
public void updateSkin(){
//change common user skin
}
}
public void updateSkin() {
UserType user1 = new Common();
UserType user2 = new Gold();
UserType user3 = new Diamond();
user1.updateSkin();
user2.updateSkin();
user3.updateSkin();
}
这种方式极大的提高代码可扩展性。以后可以很方便的添加新的用户类型,但不影响其他的代码。符合高内聚、低耦合原则。
拓展
switch 语句的分支若未设置 break ,将会产生贯穿性问题。而且,当存在 default 分支来处理其他情况时,可能会致使部分本应特殊处理的情形,也走入了默认分支。不过,switch 语句是能够转换为 ifelse 结构的。基于此,建议按照上述方式对 switch 进行重构。
那么,让重构成为我们的日常!
参考
《重构的时机和方法–Christian Clausen著、郭涛译》