简单易懂读《重构》 - Switch Statement (switch语句过多)

  • 含义:
    少用switch语句,尽量用多态取代
  • 坏处:
    switch带来代码重复的问题
  • 目标:
    使用多态代替switch
  • 实现方法:
    • 如果需要根据类型码进行选择,使用Extract Method(提炼函数),在使用**Move Method(搬移函数)**搬到需要改为多态性的类中。
    • 之后,可以考虑使用Replace Type Code with Subclasses(以子类代替类型码)Replace Type Code with State/Strategy(用状态或策略模式代替类型码)
    • 完成了前面的步骤,就可运用Replace Conditional with Polymorphism (使用多态代替条件语句) 来消除switch了。
    • 如果想要替换的数据值是类型码,而这些类型码并不影响行为,则可以运用Replace Type Code with Class (以类取代类型码)
    • 如果有与类型码相关的条件表达式,可运用Replace Type Code with Subclass (以子类替代类型码)Replace Type Code with State/Strategy(以状态/策略取代类型码)
    • 如果switch语句并不多,就不宜使用多态方式了,这时候可以考虑使用Replace Parameter with Explicit Methods(以明确的函数取代参数)
    • 如果选择的条件中,有null的,可以试试Introduce Null Object(引入Null对象)

本文涉及的重构方法

Extract Method(提炼函数)
Move Method(搬移函数)
Replace Type Code with Subclasses(以子类代替类型码)
Replace Type Code with State/Strategy(用状态或策略模式代替类型码)
Replace Conditional with Polymorphism (使用多态代替条件语句)
Replace Type Code with Class (以类取代类型码)
Replace Type Code with Subclass (以子类替代类型码)
Replace Type Code with State/Strategy(以状态/策略取代类型码

Replace Parameter with Explicit Methods(以明确的函数取代参数)
  • 作用:
    那些入参以后根据入参不同执行不同行为的情况,改为为每种入参创建独立的函数,减少不必要的判断
  • 步骤:
  1. 针对入参的每一个可能值,新建一个对应的函数
  2. 修改原先调用此函数的地点,改为直接调用对应的函数
  3. 编译,测试
  4. 删除原函数
  • 代码实例
//重构前
private int height = 0;
private int width = 0;
void setValue(String name, int value) {
	if (name.equals("height")) {
		this.height = value;
	} else if (name.equals("width")) {
		this.width = value;
	} else {
		//...
	}
}
//重构后
private int height = 0;
private int width = 0;
void setHeight(int value) {
	this.height = value;
}
void setWidth(int value) {
	this.width = value;
}
  • 重构思路:
    如果某方法中有根据入参执行不同行为的情况,可以改为为该行为新建对应方法,减少代码中的判断语句。
Introduce Null Object(引入Null对象)
  • 作用:
    将null值用null对象代替,减少代码中判断null的代码。但是有时会造成问题的侦测和查找上的困难。

  • 重构思路:
    此方法java8以后使用Optional替代。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值