版权归原作者所有,如有侵权,请联系我们

[科普中国]-程序设计三次法则

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

程序设计中的三次法则是代码重构的一条经验法则,涉及到当代码片段出现重复时,如何决定是否用一个新的子程序替代之的标准。

简介程序设计中的三次法则(Three rules of programming)是代码重构的一条经验法则,涉及到当代码片段出现重复时,如何决定是否用一个新的子程序替代之的标准。

三次法则的要求是:

允许按需直接复制粘贴代码一次,但如果相同的代码片段重复出现三次以上的时候,将其提取出来做成一个子程序就势在必行。

马丁·福勒在《重构》一书中介绍了三次法则1,并认为这一法则是Don Roberts所提出。

原理在编程中,由于会提高代码维护的难度,直接复制代码段的习惯并不好;具体来说,当有代码片段需要变更时,代码维护者就必须找出程序中所有与之相同的代码片段,并都进行修改,但这一过程易出差错,而且也常会带来许多麻烦。相对的,如果代码只在一个地方出现,修改起来就容易多了。

这一法则在代码量(即行数)较少(甚至只有一行)的时候还有另一种形式的应用,例如:如果你想调用一个函数,并在调用失败的时候再尝试调用一次,那使用两处调用亦可;但若你想在放弃尝试前至少尝试5次(注意,这里的5匹配>=3的要求),那就应该将其写成循环形式,使代码中只有一个调用位置2。

C++编程中的三次法则三次法则在C++里,它是一个以设计的基本原则而制定的定律。它的要求是,假如类有明显定义下列其中一个成员函数,那么程序员必须写入其他两个成员函数到类内,也就是说下列三个成员函数缺一不可。

析构函数

复制构造函数

赋值运算符 (C++)

上述三个函数是特别的成员函数,假如程序员没有自行定义或宣告这三个函数,编译器会自动地创建他们并且编译到应用程序内。然而,如果程序员仅定义其中一个,其余两个函数仍然会由编译器自动产生,这种混杂的情况非常容易产生程序员难以预期的错误。三法则的存在,正是提醒程序员避免那样的陷阱。

C/C++ 源代码三次法则示例头文件header.h#ifndef _HEADER_H_#define _HEADER_H_//// 判断是否为微软编译器#ifndef _MSC_VER#undef NULL#define NULL 0#endif//#include #include //using std::cin;using std::cout;using std::endl;//// 类别:方块class CCube{public: // 建构子 CCube(); // 含有参数的建构子 CCube(double length, double width, double height); // 三法则:解构子 ~CCube(); // 三法则:复制建构子 CCube(const CCube &sample); // 三法则:设定运算子 CCube& operator=(const CCube &sample); // 设定长宽高 void setLength(double length); void setWidth(double width); void setHeight(double height); // 取得长宽高 double getLength() const; double getWidth() const; double getHeight() const; // 计算体积 double getVolume() const;protected:private: // 长宽高 double m_Length; double m_Width; double m_Height;};//void PAUSE(void);//#endif主函数main.cpp#include"header.h"//// 判断是否为微软编译器#ifndef _MSC_VERint#elsevoid#endifmain(int argc, char* argv[]){ // 方块零 CCube cube0(4.3, 5.2, 6.1); // 第一个方块 { cout