重构第九章——简化条件语句

7 篇文章 0 订阅
4 篇文章 0 订阅

重构第九章,讲解如何简化条件语句(if then else、switch case),使得程序逻辑更加清楚,同时方便扩展,主要手法有8种。我在每种手法的后面加了一句话,总结这种手法的目的或者做法。

1、分解条件:结合Extract Method使得逻辑更清晰

做法:将if-else if-else语句块的 条件每个条件执行的逻辑,分解成方法。这样一来,条件更加清楚(通过方法名来传达),每个条件执行的逻辑也通过方法名来传达,同时缩短了原条件语句长度。

2、合并条件语句:能合则合

如果多个条件都返回同样的结果,将这多个条件合并,并以一个函数(Extract Method)的形式表示这个条件。

3、合并重复的条件执行片段

重复的条件执行片段,可以提出到条件之外,根据情况提到条件之前或条件之后。

4、移除控制标志flag:flag使逻辑混乱

做法:使用break continue,代替控制标志(flag)。同时作者更倾向于使用return来代替break来终止条件,只要Extract Method做的细,总是可以用return代替break的。

复杂情况:当控制flag不仅起到了条件判断的作用,还起到了带出返回值的作用,这个时候可以拆解这个flag,使其只起到条件判断的作用,就可以使用上面的做法了,同时Extract Method添加一个新的函数,使这个函数代替flag带出返回值。

5、用守卫语句代替嵌套条件:特别条件直接return

含义:守卫语句就是要么return要么抛异常的语句。

用法:守卫语句通常用在一些不。寻常的条件处,表示一旦发生直接返回。守卫语句可以减少很多if - then - else的跳转,使逻辑变得清晰明了。有的时候,为了使用守卫语句,需要将已有的条件逆转,在逆转条件的时候不要使用非操作,这样不直接,非操作的条件都可以改成反向的条件。

6、使用多态代替条件:干掉条件干掉switch

见:重构第八章——重新组织数据的14 15

7、引入Null对象:Null对象也是对象,利用多态

何时:重复检查一个对象是否为null时,可以代替null值为一个null对象。

注意:空对象一定是常量,它们的任何成分从来不发生变化。因此,我们实现空对象的时候使用单例模式。

做法:主要是考虑 NullObject和isNull方法,以Customer类对例

1)增加NullObject:新增NullCustomer类,它作为原Customer类的子类

2)增加isNull方法:原Customer类增加isNull()方法(注:修改了原Customer类),返回false;子类NullCustomer覆盖isNull()方法,返回true。如果不能修改Customer类,则可以使用测试接口(testing interface)。
注意:1)和2)都是使用接口来实现。通过让Customer实现Nullable接口。
注意:使用testing interface,做法是创建一个Null的接口,然后让NullCustomer继承Customer,同时实现Null接口,然后通过instanceof操作符检测是否为null。这样做的优点就是不用修改原Customer类(不需要在Customer中添加isNull方法)。

3)为Customer类增加创建NullCustomer对象的工厂方法。

4)把customer赋值给null的地方,变为赋值为NullObject对象。

5)将原来需要根据是否为null然后进行相应处理的方法,在NullObject类中添加对应的方法,使得是否为null这样的条件判断消失。空对象的方法,可能经常会返回其他的NullObject,以满足为原条件null时的逻辑。

特殊情况:NullObject本质上就是特例模式,实际上可以有多个这样的特例模式。如:UnknownCustomer、NoCustomer。

8、引入断言:必须声明满足的地方加断言。目的在于用断言代替注释。

定义:断言是一个总是应该为真的条件表达式。断言的失败表明程序员犯了错误,如果断言为假,会导致一个unchecked exception。

作用:①断言有助于发现bug,因为断言失败的地方就是接近bug的地方 ②作为一个声明,相当于注释。

注意:①断言不影响系统的运行,断言往往在生产环境代码中被移除 ②如果断言为假程序仍工作,那么断言就是多余的,应移除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值