让我看看谁还写if/switch

利用多态代替if switch优化代码

最近在读一本叫做《 重构:改善既有代码的设计 》的书,觉得很不错。书中有一个令我印象深刻的优化方式是利用多态代替判断。正好我在公司中也在开发类似代码,于是就想写个demo测试一下。如果可行,准备去优化公司现有代码

代码实现

整体架构

请添加图片描述

具体代码

优化之前
Animal 类
import java.io.Serializable;

/**
 * @Author: Yuyan_i
 * @Title: Animal
 * @Date: 2023-04-05 22:40
 * @Description: 动物类
 */
public class Animal implements Serializable {
    private String type;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}
BeforeMain main文件
import java.io.Serializable;

/**
 * @Author: Yuyan_i
 * @Title: BeforeMain
 * @Date: 2023-04-05 22:44
 * @Description:
 */
public class BeforeMain {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.setType("cat");
        if ("fish".equals(animal.getType())){
            System.out.println("游");
        }else if ("cat".equals(animal.getType())){
            System.out.println("跑");
        }else {
            System.out.println("出错了");
        }
    }
}
优化之后
OperateChooser类
import com.mydemo.after.domain.Animal;
import com.mydemo.after.domain.animalimpl.Cat;
import com.mydemo.after.domain.animalimpl.Fish;
import com.mydemo.after.operate.AnimalOperate;

/**
 * @Author: Yuyan_i
 * @Title: AnimalChooser
 * @Date: 2023-04-05 21:18
 * @Description: 操作选择器
 */
public class OperateChooser {
    public static AnimalOperate chooseAnimalOperate(Animal animal){
        switch (animal.getType()){
            case "cat":
                return new Cat();
            case "fish":
                return new Fish();
            default:
                return null;
        }
    }
}
Animal 抽象类
import com.mydemo.after.operate.AnimalOperate;

import java.io.Serializable;

/**
 * @Author: Yuyan_i
 * @Title: Animal
 * @Date: 2023-04-05 21:12
 * @Description: 动物 超类
 */
public abstract class Animal implements Serializable, AnimalOperate {
    String type;
    public String getType(){
        return this.type;
    }
}
Cat 猫–子类
import com.mydemo.after.domain.Animal;

import java.io.Serializable;

/**
 * @Author: Yuyan_i
 * @Title: Cat
 * @Date: 2023-04-05 21:15
 * @Description: 猫
 */
public class Cat extends Animal implements Serializable {
    private static String type = "cat";
    public String getType(){
        return this.type;
    }

    @Override
    public void run() {
        System.out.println("跑");
    }
}
Fish 鱼–子类
import com.mydemo.after.domain.Animal;

import java.io.Serializable;

/**
 * @Author: Yuyan_i
 * @Title: Fish
 * @Date: 2023-04-05 21:16
 * @Description: 鱼
 */
public class Fish extends Animal implements Serializable {
    private static String type = "fish";
    public String getType(){
        return this.type;
    }

    @Override
    public void run() {
        System.out.println("游");
    }
}
AnimalOperate 操作接口
/**
 * @Author: Yuyan_i
 * @Title: AnimalOperate
 * @Date: 2023-04-05 21:22
 * @Description: 操作接口
 */
public interface AnimalOperate {
    public void run();
}
PolymorphicTest main文件
import com.mydemo.after.chooser.OperateChooser;
import com.mydemo.after.domain.animalimpl.Cat;
import com.mydemo.after.domain.animalimpl.Fish;

/**
 * @Author: Yuyan_i
 * @Title: PolymorphicTest
 * @Date: 2023-04-05 21:34
 * @Description: main文件
 */
public class PolymorphicTest {
    public static void main(String[] args) {
        Fish fish = new Fish();
        OperateChooser.chooseAnimalOperate(fish).run();

        Cat cat = new Cat();
        OperateChooser.chooseAnimalOperate(cat).run();
    }
}

后言

读到这里可能有人会说,本来几行代码的事情,但是被优化之后变成了如此麻烦的代码,并没有看出重构之后,代码优化在哪里。

是的,因为我们的例子特别简单,所以并不能体现出重构的优点,但如果放到一个相当大,并且需求在不断更新的项目中呢?

另外,于我个人而言。这不仅仅是写代码,更是一种意识。

demo源码地址:

https://gitee.com/yuyan_i/psid
### JavaScript `switch` 语句作为 `if...else` 的替代 在特定场景下,`switch` 语句能够提供一种更加清晰和高效的方式来代替冗长的 `if...else if...else` 结构。对于那些基于单一表达式的多条件判断来说尤为适用。 #### 使用 `switch` 替代简单的 `if` 考虑一个简单的情况,其中要根据变量的不同取值来执行不同的操作: ```javascript let dayOfWeek = 'Monday'; // Using if statements if (dayOfWeek === 'Monday') { console.log('Start of the week'); } else if (dayOfWeek === 'Friday') { console.log('End of workweek'); } else { console.log('Mid-week'); } ``` 同样的逻辑可以通过 `switch` 实现得更为直观[^2]: ```javascript let dayOfWeek = 'Monday'; switch (dayOfWeek) { case 'Monday': console.log('Start of the week'); break; case 'Friday': console.log('End of workweek'); break; default: console.log('Mid-week'); } ``` 这种转换不仅使代码看起来更整洁,而且由于 `switch` 是通过哈希表查找的方式工作,在某些情况下性能也会更好[^3]。 #### 处理范围或复合条件 然而需要注意的是,`switch` 并不适合用于涉及数值区间或其他复杂条件的情形。此时仍然应该采用 `if...else` 或者其他高级技术如对象字面量映射等[^1]。 例如下面的例子展示了如何利用对象字面量来进行类似的多分支选择: ```javascript const actions = { Monday: () => console.log('Start of the week'), Friday: () => console.log('End of workweek') }; actions[dayOfWeek]?.() || console.log('Mid-week'); // ES6 Optional Chaining ``` 这种方法提供了更大的灵活性,并且易于扩展维护。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值