《重构——改善既有代码的设计》读书笔记(四)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LL596214569/article/details/84994670

重构之函数部分

1.提炼函数。

对于过长的、需要添加注释的、同样的代码被多次调用的,这种代码都应该被整理成为一个单独的函数。函数不怕多,只怕功能混乱,尽量将每一个功能都提炼为一个单独的函数并通过名字以及注释表达清楚其作用。

2.处理局部变量。

局部变量的处理主要有三种,

第一种是作为存值的局部变量,这种局部变量应观察其赋值的代码段是否可以被单独提炼为函数,然后以函数的返回值来替换局部变量,需要注意的是有时可能提炼出的一段代码中可能含有多个需要被返回的值,那么如果在含有传递引用的语言中例如C++就可以传引用作为参数进去来解决这个问题,当然在定义一个函数时,我个人推荐尽量多使用传递引用作为参数来修改其值,而不是将值作为函数返回值,例如下面这两种方式:

vector<int>  GetPoint();        // 不推荐

bool GetPoint(vector<int>& pointVec);           // 推荐

第二种是清除多余的局部变量。多余的局部变量就是可以用其他来替代的局部变量,例如可以使用函数的返回值代替新申请一个变量,或是这个变量对应的值根本就不需要保存,这时就将对应的变量清除。

还有一种问题是某一个局部变量被多次使用并被多次改变值,这也是很不推荐的做法,应尽量避免。当一个变量被多次赋值那么很大几率说明这个变量做了不止一件事,这样容易给后来者留下坑,很可能粗心的后来者修改一段代码时只关注了这种变量的某一部分功能从而导致修改出现问题。所以最好是一个临时变量只被赋一次值,如果真的是相似的功能哪怕定义为a1,a2,a3这样,也比定义一个a而赋值三次来得好。

3. 多使用内联

使用内联并不局限与将函数定义为内联函数,而是可以更直接的以代码段来代替函数和变量。首先对于一些频繁调用的表达式或是短函数我们可以尽量将其定义为内联;另一方面可以将表达式直接进行赋值或是作为返回值,当然这样被使用的表达式不能长,而且应容易理解,调用次数也不应太过多。

4.移除对参数的赋值

这里说的参数是指值传递的参数,而不是传递的引用参数,大致就是如下:

int ModifyParam(int param);        // 最好不要在函数体中修改param的值,哪怕是其最后作为返回值也不要

bool ModifyParam(int& param);        // 这种传递引用进去默认就是要修改其值的

另外最好为每一个传递进去不想要其被改值的参数加一个const.

5.其他:以查询取代变量,引入解释型变量,分解临时变量,优化算法

这几方面其实也可以包含在前面几种,查询取代变量就是要多写函数;引用解释型变量就是用不同的变量保存不同的值,然后用名字表示清楚其含义;分解临时变量就是不要让一个临时变量被多次赋值,即一个临时变量只能做一件事;优化算法这个就是要优化算法。。。只要用到算法的程序当然都是算法越优越好。。。。。

 

 

其实我觉得这一章的思想大致就是说在代码中不论函数还是变量,都要一次只做一件事,作者一直提倡写代码时函数尽量简短清晰、变量不要多次修改等等就是为了“只做一件事”,一个函数只做一件事就很容易被理解,也很容易用一个名字来表达出来,变量也是。如果一个函数是一个很复杂的功能,换个说法也就是包含了很多个功能,那么它就很难理解也很容易出问题,而如果一个大的函数里面全是调用了小函数,那么就很容易理解也很清晰;同理,一个变量被多次赋值,那么在后续的使用以及优化中就极易出问题,而且会使得其极难被修改,因为没修改一点就可能对后续产生一系列的影响。其实所谓的优化代码说穿了就是刚开始学编程时大家都会学到的那条准则:高内聚,低耦合。代码间的耦合度低了,自然就清晰且容易理解,当然写出一份好的代码不是一件容易的事,将原本复杂混乱的代码优化的简单直白也不容易,只能不断的去实践学习、

展开阅读全文

没有更多推荐了,返回首页