李琳
摘要: 编程的基本原则是尽可能避免代码重复。在程序编写的过程当中,涉及很多的结构比如循环、函数调用、类等,这很容易导致代码的冗余。该文以C++编程语言为例,列举了几种常见的代码重复的情况.并提出了相应的解决方案。
关键词: 循环;函数调用;类;代码冗余; C++
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)32-0101-02
Discussing Technology for Avoiding Code Duplication in C++ Programming
LI Lin
(School of Computer and Information Engineering, Luoyang Institute of Science and Technology, Luoyang 471023,China)
Abstract: The basic principle of programming is that avoiding code duplication. During the progress of coding, many kinds of structures causes code duplication easily such as loop, function call, class.etc. This paper Based on C++ programming language, listed five common situations that induced code duplication and also provided the solutions.
Key words: loop; function call, class; code duplication; C++ programming
众所周知,在编程过程中因为各种原因会产生重复性的冗余代码。这些多余的代码往往会引起一些小的bug而不易被觉察到。原因在于它并不会影响最终的运行结果,却严重影响了执行效率。在有些函数被多次使用时,这种情况就更容易出现。本文以C++编程语言为例,列举了在编程过程中最常遇见的几种情况,用一个个具体的实例描述造成重复代码的原因.并提出了相应的解决方案。
1 函数大致相同,但是参数或者返回的类型不同
1) 举例描述:如图1所示,这里有2段代码。第一段代码是输出整型数据类的数组,第二段代码是输出双精度类型的数组。可以看到它们所要完成的功能是相同的,只是数据的操作类型不同。
2) 出现的问题:成员函数拥有相同的结构和作用,仅仅差别在实际操作的对象不同。造成一定程度的代码冗余。
3) 解決方案:利用C++提供的成员函数模板就能较好的解决这个问题。因为模板具有共通性。可以将相同的代码部分由模板参数定义获得。这样就能够针对不同的数据类型使用同一段代码完成。所以可以用下列代码(如图2)来完成:将原来数据类型的地方比如int用一个参数A代替,这样就抽象出一个模板。当实参的数据类型是整型时,编译器会自动用整型类型来替代类型参数A,如果实参的数据类型变为双精度型,那么编译程序又会用双精度型来替代类型参数A。
2 构造函数的重载
1) 举例描述:如图3所示,propertypage类有2个构造函数,他们的区别在于一个是无参数的构造函数,一个是有参数的构造函数。
2) 出现的问题:两个构造函数的成员初始化工作相同,只因为有无参数的差别,需要分别构建,导致代码冗余。
3) 解决方案:利用委托构造函数解决此类问题就是很好的做法。可以让其中一个构造函数在初始化的阶段调用另一个同类的构造函数,这样就可以由委托的函数代替完成初始化的工作,从而减少了代码的重复率。
3 在调用函数时遇到很长的参数列表
1) 举例描述:有的时候我们调用的函数参数会特别多
2) 出现的问题:,example( )函数被调用了3次,参数非常的多,3次函数调用中只有细微的差别。代码被大量重复。
3) 解决方案:利用绑定成员函数的方法来减少重复性代码。Std::bind是C++提供的一种很好的机制,可以用来绑定多个不同参数,其参数的类型和个数都不受限制,然后将其返回到另一个可以接收这些参数的函数。用于接收参数绑定值的可以是函数、函数指针、lambda表达式、成员函数等。下图6中参数Work使用占位符_1绑定,说明对done()的调用只需要提供一个参数即可。
4 小结
通过成员函数模板、委托构造函数、绑定成员函数等几种方法能较好的减少代码的冗余,让代码的结构更加清晰,执行率更高。当然,一味地减少代码不是最终目的,重要的是减少代码出现Bug的几率,从而便于后期的代码维护。
参考文献:
[1] 迈耶斯.Effective Modern C++[M].南京:东南大学出版社,2015.
[2] 任智康.c++中的函数模版和类模版[EB/OL].http://www.cnblogs.com/renyuan/archive/2013/05/26/3100047.html.endprint