首页 理论教育 《零基础C++从入门到精通》重构实例

《零基础C++从入门到精通》重构实例

时间:2023-08-20 理论教育 版权反馈
【摘要】:我们可以看到,在动手写12.11.1中存在着大量重复的代码,如果继续添加插入元素的代码,我们就要继续进行复制粘贴,而如果再要每次都打印vector的所有元素,则又要添加十几次这样打印元素的代码。动手写15.3.2动手写15.3.2展示了冗长函数分割的重构方法,这个示例将动手写12.8.3的two sum问题的解重构了。

《零基础C++从入门到精通》重构实例

在了解了重构的大概定义和适用场景后,我们来看几个示例,具体地了解一下重构是怎么进行的。

动手写15.3.1

动手写15.3.1展示了重复代码提炼的重构方法,运行结果如图15.3.1所示:

图15.3.1 重复代码提炼

本示例需要和动手写12.11.1来比较学习。我们可以看到,在动手写12.11.1中存在着大量重复的代码,如果继续添加插入元素的代码,我们就要继续进行复制粘贴,而如果再要每次都打印vector的所有元素,则又要添加十几次这样打印元素的代码。于是我们可以将打印大小和容量的代码提取成一个函数,并将插入元素的代码提取成函数,并且指定要插入的数字为参数,这样我们直接用循环来插入自然数到vector也只需要调用这两个函数。而如果再要每次都打印vector元素,就再写一个打印函数放到printSizeAndCap()中调用即可。

动手写15.3.2

(www.xing528.com)

动手写15.3.2展示了冗长函数分割的重构方法,这个示例将动手写12.8.3的two sum问题的解重构了。我们可以看到,冗长函数分割有时并没有减少代码量,而主要是为了让代码更易读。原本在一个函数中每几行代码可能就有一行注释,用来说明接下来的代码是做什么的。而将这样的子过程提取到函数中后,函数名就有充当注释的作用了,程序的结构也更加清晰。不过在一般情况下,这种长度的函数不需要提取,在这里只是为了说明其作用。

动手写15.3.3

动手写15.3.3展示了嵌套条件语句的优化。我们看到badCondition()中用了嵌套的条件语句来做判断,但是两个if语句却没有对应的else子句,这种情况下其实我们直接用逻辑与来连接关系表达式就能把嵌套if语句简化。除此之外,关系和逻辑表达式还有其他许多优化的方法,其中有一些也与逻辑代数有关。

动手写15.3.4

动手写15.3.4展示了消除过长参数的重构方法。我们可以看到badDotProduct()要传入6个坐标参数进行向量的点积计算,这不仅看起来令人头疼,在修改或代入参数的时候也容易出错。遇到这种情况时,我们可以直接传入类对象,或借此机会创建一个新的类,这可能也是一个很好的面向对象设计的机会。

此外,减少幻数和字符串字面量等也是一种提高可读性的方法。总而言之,我们应该用名字来替代各种字面量,程序中所有的名字都应该是直观易懂的。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈