重构设计

「重构-简化条件表达式」之解

重构之旅行程已经快超过一半,本章主要讲解如何简化我们的条件表达式,业务逻辑中大量的if...else if…else的句式肯定还让我们记忆犹新,如何善待if判断中的条件语句是本章我们关注的重点。「重构-改善既有代码设计」前三章的链接如下:

第一篇:「重构-重新组织函数」之解
第二篇:「重构-在对象之间搬移特性」之解
第三篇:「重构-重新组织数据」之解

[1]Decompose Conditional(分解条件式)
解: 针对if语句过于复杂的条件判断,我们应该怎么做,才能达到这样的效果:既能保持原先的判定性不变,同时又能清晰明了的知道组合条件中每个分条件的表达含义,也许我们可以试着提炼这些判断逻辑构成一个新的独立函数。

[2]Consolidate Conditional Expression(合并条件表达式)
解: 说的是虽然我们写了两三个if条件判断,但是当满足这些if条件时,都返回相同值,这个时候我们是否可以考虑合并这些if条件,从而简化条件判断流程,厘清代码逻辑。

[3]Consolidate Duplicate Conditional Fragments(合并重复的条件判断)
解: 对于这一点似乎感触颇深,因为这对简化代码逻辑有着切实的意义,假设现在存在if...else的结构如下所示:

由上可知sendNotice()不管if条件是否成立,都会被调用,这个时候可以 (更多…)

「重构-重新组织数据」之解

继续「重构-改善既有代码设计」之旅,重构前两章的链接如下,本章内容有点多,有兴趣的请耐心观看。
第一篇:「重构-重新组织函数」之解
第二篇:「重构-在对象之间搬移特性」之解

[1]Self Encapsulate Field(自封装值域)
解: 相信该手法已经被我们烂熟于心了,我们都会为类中的值域提供getter和setter函数,但现在讨论的问题是这样的,假设在类A中存在这么一个值域length(表示长度),如果这个值域只是单纯被类A中的函数所调用,这个时候我们还有为length提供getter和setter的必要吗;如果值域length会被除类A之外的其他类函数引用到,这个时候为length提供getter和setter函数都没有意见。就自己的实际开发工作而言,如果只是本类中的函数去调用length,就不会提供getter和setter函数了,其他情况下会提供取值和设置函数。

[2]Replace Data Value With Object(以对象取代数据值)
解: 该手法有点为了以后扩展方便,代码组织清晰的意味。假设我们现在有这么一个订单类,类里面用CustomerName这个简单的String变量来表示这笔订单归属的客户名称,然而我们需要进一步的保存客户的送货地址,联系方式等信息,我们当然依旧可以 (更多…)

「重构-在对象之间搬移特性」之解

在继上一章重构-重新组织函数之后,继续下一章的学习,来总结一下在对象之间搬移特性的几种常用重构手法。在对象之间搬移特性的最初动力来源于我们想把类以及对象这两类角色所应承担的责任和功能厘清,下面我们分别进行一一说明。

[1]Move Method(搬移函数)
解: 现在假设存在一个类A,A里面的某个方法aMethod常常使用类B中的某些特性(可能是值域,也可能是函数),这时我们就要思考了:也许把类A的这个方法移到类B中更合适。也许是当时规划做的不够,不过都没有关系,重构给了我们去重新审视和设计的机会,UML表示如下图所示:
move-method

[2]Move Field(搬移值域)
解: 搬移函数讨论的是在类之间转移函数的行为,而搬移值域相对来说讨论和关注的范围更细,类A里面的某个属性值aTemp在其所属的类之外更被经常使用,这样说起来很官方,说白了就是在 (更多…)

「重构-重新组织函数」之解

近一段时间断断续续的在阅读「重构-改善既有代码的设计」,书中提及的重构手法实用且易于理解,可见作者实践水平和总结能力俱佳。很多问题在实际的开发过程中我们都有遇到过,但没有很好的指导准则引导我们如何去改善我们的代码设计实现,我们常常凭借的是已有的开发经验。

好了,废话不多说,我准备每阅读一章内容,就试着按照自己的风格去理解作者提及的重构手法。关于「重新组织你的函数」这一章,作者提及了以下九种重构手法,如下:
[1]Inline Method(内联函数)
解:函数本体太简单了,就一行语句的事,直接在调用该函数的地方用函数本体进行替换吧。但是请注意,如果在子类中需要重写这个函数,那还是算了吧,怎么样也重写不了一个压根不存在的函数,是不!

[2]Inline Temp(内联临时变量)
解:函数中存在着就这么个仅用了一次的小变量,作为某个查询函数返回的接受者,有点浪费,干脆在用到这个变量的地方用查询函数进行替换吧。做法:有这么一种屡试不爽的手法,在这个变量前加上final修饰符,看看是否存在好几处该变量值被修改而引起报错的地方 The final local variable xxx cannot be assigned, 如果真的有不止一处,那暂时还是算了吧,惹不起,这小变量作用大着呢,不然用查询函数 (更多…)