【重构】重新组织函数

重构: 

【名词】对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。

【动词】使用一系列重构手法,在不改变软件观察行为的前提下,调整其结构

【意义】重构使软件更容易理解,填补“想要他做什么”,和“准确说出我所要的”之间的间隙

【范围】在不同的领域中有着不同的重构手法,例如多线程环境和单线程环境,函数式编程和命令式编程语言等,更多要求的是你自己本身具有一定的创造力,发现适合你的重构技巧。

重新组织函数篇:

1、Extract Method 抽离函数出来,其实和整洁代码的理念差不多;让Method在同一层次中很重要哦;这点我又想起微服务了;什么样才是足够小呢?

  • 定义:有一段代码可以组织在一起被单独提取出来;
  • 名称:很多小型函数有很多好处,而且只有在你为小型函数真正命好名的时候才会凸显其作用,如果你想不出一个好名称,那就不要提
  • 长度:函数长度其实不是问题,问题在于函数名称和函数语义之间的距离;既然函数名称比函数体还长也没关系。另外,如果函数体本身清晰易读,就没有必要提取了,关键在于意图;
  • 难点:局部变量。

2、Inline Method 内联函数,一个和Extract Method相反的用法,通常没必要的间接层只会是累赘,另外,如果小函数划分混乱的时候,也可以应该方法先合并为大函数,再拆分小函数。记住,并不是所有间接层都有价值。

3、Replace Temp With Query ,临时变量坏处多,用查询改变临时变量是好的,可能会增加性能开销,但不要担心,优化的时候才是你需要担心的,阻塞才是要害怕的;

  定义:将一个表达式提炼到一个独立的函数中,将这个临时变量的所有引用点替换为对新函数的调用,此后,新函数就可被其他函数使用。

  查询:查询就是赋值给临时变量的那个表达式,该表达式可以利用Extract Method被提炼出一个函数;

  问题:临时变量的问题在于,他们只是暂时的,而且只能在所属函数中使用,它会驱使你写长函数,而且让代码不清晰,不整洁。

4、Replace Type Code with State/Strategy 如果一个类有状态类型,最好转换为状态类、或者策略类;把行为封装进去;

5、如何去掉switch语句,switch一般是根据状态而选择行为,有必要的时候,去掉它,状态机中就是如此,但比较简单的可以暂时先不急着下手;其实就是用好状态模式提供的多态能力;

6、Introduce Explaining Variable 引入解析性变量;将复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解析表达式用途。该方法和Extract Method有相同的效果,如果是量小的情况下尽量用后者,而很多临时变量或者临时变量要用多次为提高性能,我们也应该引入解析性变量;

7、Split Temporary Variable,分解临时变量,临时变量有各种不同用途,其中某些用途会很自然导致临时变量被多次复赋值,如“循环变量”、“结果收集变量”就是两个例子;分解临时变量就是要注意,一个变量不应该承担一个以上的责任。

8、Remove Assignments to Parameters,移除对参数的赋值;一般参数职责为:被传入的某些东西;

9、Replace Method with Method Object,很多时候临时变量多,特别是大型函数的时候,难以用Extract Method,我们可以把整个函数做成一个对象,然后变量就变成了这个对象的成员,然后我们这个对象就可以利用成员变量拆分成许多小函数了。

原文地址:https://www.cnblogs.com/iCanhua/p/10290360.html