优化ifelse语句

背景说明

假设在开发一个大型平台时,如果在编码初期就频繁使用 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著、郭涛译》

相关推荐

  1. 优化ifelse语句

    2024-07-22 21:54:03       17 阅读
  2. [C/C++入门][ifelse]20、闰年判断

    2024-07-22 21:54:03       20 阅读
  3. [C/C++入门][ifelse]15、判断奇偶数

    2024-07-22 21:54:03       16 阅读
  4. [C/C++入门][ifelse]18、Switch星期课表

    2024-07-22 21:54:03       20 阅读
  5. MySQL中 GROUP BY 语句优化

    2024-07-22 21:54:03       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 21:54:03       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 21:54:03       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 21:54:03       45 阅读
  4. Python语言-面向对象

    2024-07-22 21:54:03       55 阅读

热门阅读

  1. redis常用指令

    2024-07-22 21:54:03       15 阅读
  2. 多站点环境下Memcached的配置与管理

    2024-07-22 21:54:03       18 阅读
  3. Vue3 深入组件

    2024-07-22 21:54:03       17 阅读
  4. Leetcode热题100 Day4

    2024-07-22 21:54:03       16 阅读
  5. Python每日学习

    2024-07-22 21:54:03       15 阅读
  6. web前端 React 框架面试200题(七)

    2024-07-22 21:54:03       15 阅读
  7. 鸡兔同笼求解器

    2024-07-22 21:54:03       17 阅读