编码原则实例------c++程序设计原理与实践(进阶篇)

编码原则:

  • 一般原则
  • 预处理原则
  • 命名和布局原则
  • 类原则
  • 函数和表达式原则
  • 硬实时原则
  • 关键系统原则

(硬实时原则、关键系统原则仅用于硬实时和关键系统程序设计)

(严格原则都用一个大写字母R及其编号标识,而推荐原则都用小写字母r及其编号标识,对于前者程序员必须严格遵守,而后者则偶尔可以不遵守)

 

1、一般原则

R100:任何函数和类的代码规模都不应超过200行(不包括注释)。

原因:长的函数和类会更复杂,因而难以理解和测试。

 

r101:任何函数和类都应该能完全显示在一屏上,并完成单一的逻辑功能。

原因:如果程序员只能看到函数或类的一部分,就很可能漏掉错误的部分。如果一个函数试图完成多个功能,与单功能的函数相比,其规模就可能很大,而且会更复杂。

 

R102:所以代码都应该遵守ISO/IEC 14882:2011(E)C++标准。

原因:在ISO/IEC 14882标准之上的扩展金额变形可能会不稳定,定义不明确,而且可能影响移植性。

 

2、预处理原则

R200:除了用于源码控制的#ifdef和#ifndef之外,不要使用宏。

原因:宏不遵守定义域和类型规则,而且使代码变得更不清晰、不易读。

 

R201:#include 只能用于包含头文件(*.h)。

原因:#include 用于访问接口的声明而非实现细节。

 

R202:所以的#incldue语句都应位于任何非预处理声明之前。

原因:如果#include语句位于程序中间,就很可能被阅读程序的人忽略,而且容易导致程序不同部分对名字的解析不一致。

 

R203:头文件(*.h)不应包含非常量变量的定义或非内联、非模板函数定义。

原因:头文件应该包含接口声明而非实现细节。但是,常量常被看作接口的一部分;出于性能的考虑,一些非常简单的函数应该作为内联函数(因此应该放在头文件中);而当前的编译器要求完整的模板定义都放在头文件中。

 

3、命名和布局原则

R300:应该使用缩进,并且在一个源码文件中缩进风格应该一致。

原因:可读性和代码风格。

 

R301:每条新语句都另起一行。

原因:可读性。

例子:

int a=7;x=a+7;f(x,9);    //违反
int a=7; x=a+7; f(x,9); //正确

例子:

if(p<q)cout<<*p;    //违反

if(p<q)
    cout<<*p;    //正确

  

R302:标识符的名字应该都具有描述性。

     标识符可以包含常见的缩写和字头缩略。

    如果x、y、i、j是按习惯方式使用,可以认为是有描述性的。

      使用下划线风格(number_of_elements)而不是字头缩略风格(numberOfElement)。

      不要使用匈牙利命名法。

      类型、模板和命名空间的命名都以大写字母开头。

      避免过长的名字。

例子:Device_driver 和Buffer_poor。

原因:可读性。

注意:c++标准规定,以下划线开头的标识符留作语言实现所用,因此在用户程序中应被禁止。

例外:调用经过认证的库,来自库中名字是可以使用的。

 

R303:标识符不能只在以下方面不同:

  • 大小写不同;
  • 只相差下划线;
  • 只是字母O、数字0或字母D间的替换;
  • 只是字母I、数字1后字母l之间的替换;
  • 只是字母S和数字5之间的替换;
  • 只是字面Z和字数2之间的替换;
  • 只是字母与n和字母h直接的替换。

例子:Head和head  //违反

原因:可读性。

 

R304:标识符不能只包含大写字母和下划线。

例子:BLUE和BLUE_CHEESE  //违反

原因:全部大写字母的标识符被广泛用于宏名,可能用于经过认证的库中的#include文件,而不应该用于客户程序。

例外:宏名用于保护#include不被重复包含。

 

4、函数和表达式原则

r400:内层循环的标识符和外层循环的标识符不应重名。

原因:可读性和代码风格。

例子:

int var=9;{int var=7;++var}    //违反:var重名

  

R401:声明的作用域应该尽量小。

原因:保持变量的初始化和使用尽量靠近,以降低混乱的可能性;令离开作用域的变量释放其资源。

 

R402:所以变量都要初始化。

例子:

int var;    //违反:var没有初始化

原因:未初始化的变量通常是错误之源。

例外:如果数组或容器会立即从输入接受数据,则不必初始化。

注意:许多类型,例如vector和string,有默认的构造函数来完成初始化。

 

R403:不应使用类型转换。

原因:类型转换是错误之源。

例外:dynamic_cast可以使用。

例外:新风格的类型转换可以使用,用来将硬件地址转换为指针,或者将从程序外部(如GUI库)获取的void*转换为恰当类型的指针。

 

R404:函数接口中不应使用内置数组类型,即,如果一个函数参数是指针,那么它必须指向单个元素。如果希望传递数组,应使用Array_ref。

原因:数组只能以指针方式传递,而元素数目无法附着其上,只能分开传递。而且,隐式的数组到指针的转换和派生类到基类的转换会引起内存错误。

 

5、类原则

R500:对于没有共有数据成员的类,用class声明。对没有私有数据成员的类,用struct声明。不要定义既有共有数据成员,又有私有数据成员的类。

原因:清晰性。

 

r501:如果类包含析构函数或者指针/引用类型的成员,必须为其定义恰当的或禁止(即,不能使用默认版本)拷贝构造函数和拷贝赋值运算符。

原因:析构函数通常会释放资源。对于具有析构函数或者指针和引用类型的类,默认拷贝语义几乎不可能”做正确的事“。

 

R502:如果类包含虚函数,那么它必须具有虚析构函数。

原因:虚函数可以通过基类接口使用,通过基类接口访问对象的函数可能会删除对象,派生类必须有某种机制(析构函数)来进行清理工作。

 

R503:接受单一参数的构造函数必须显式声明。

原因:避免奇怪的隐式类型转换。

 

6、硬实时原则

R800:不应使用异常。

原因:异常不可预测。

 

R801:new只能在初始化时使用。

原因:不可预测。

例外:可以用定址的new从栈中分配内存。

 

R802:不应使用delete。

原因:不可预测,可能会引起碎片。

 

R803:不应使用dynamic_cast。

原因:不可预测(假定使用普通方法实现的)。

 

R804:不应使用标准库容器,std::array除外

原因:不可预测(假定是用普通方法实现的)。

 

7、关键系统原则

R900:递增和递减运算不能作为子表达式。

例子:

int x=v[++i];    //违反

++i;
int x=v[i];   //正确

原因:可能会被漏掉。

 

R901:代码不应依赖于算法表达式优先级之下的优先级规则。

例子:

x=a*b+c;    //正确

例子:

if(a<b||c<=d)    //违反:应加上括号(a<b)和(c<=d)

原因:c/c++基础较差的程序员写出的代码中常常会有优先级混乱的情况。

 

c++程序设计原理与实践(进阶篇)

转载于:https://www.cnblogs.com/l2017/p/7841652.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书是经典程序设计思想与C++开发实践的完美结合,是C++之父回归校园后对C++编程原理和技巧的全新阐述。书中全面地介绍了程序设计基本原理,包括基本概念、设计和编程技术、语言特性以及标准库等,教你学会如何编写具有输入、输出、计算以及简单图形显示等功能的程序。此外,本书通过对C++思想和历史的讨论、对经典实例(如矩阵运算、文本处理、测试以及嵌入式系统程序设计)的展示,以及对C语言的简单描述,为你呈现了一幅程序设计的全景图。   ·C++初学者的权威指南。无论你是从事软件开发还是其他领域的工作,本书将为你打开程序开发之门。   ·中高级程序员的必备参考。通过观察程序设计大师如何处理编程中的各种问题,使你获得新的领悟和指引。   ·全面阐释C++基本概念和技术。与传统的C++教材相比,本书对基本概念和技术的介绍更为深入,为你编写实用、正确、易维护和有效的代码打下坚实的基础。   ·强调现代C++编程风格。本书从开篇就介绍现代C++程序设计技术,并揭示了大量关于如何使用C++标准库来简化程序设计原理,使你快速掌握实用编成技巧。 图书目录   出版者的话   译者序   前言   第0章 致读者   第1章 计算机、人与程序设计   第一部分 基本知识   第2章 Hello,World!   第3章 对象、类型和值   第4章 计算   第5章 错误   第6章 编写一个程序   第7章 完成一个程序   第8章 函数相关的技术细节   第9章 类相关的技术细节   第二部分 输入和输出   第10章 输入/输出流   第11章 定制输入/输出   第12章 一个显示模型   第13章 图形类   第14章 设计图形类   第15章 绘制函数图和数据图   第16章 图形用户界面   第三部分 数据结构和算法   第17章 向量和自由空间   第18章 向量和数组   第19章 向量、模板和异常   第20章 容器和迭代器   第21章 算法和映射   第四部分 拓宽视野   第22章 理念和历史   第23章 文本处理   第24章 数值计算   第25章 嵌入式系统程序设计   第26章 测试   第27章 C语言   术语表   参考书目   第五部分 附录?   附录A C++语言概要   附录B 标准库概要   附录C Visual Studio简要入门教程   附录D 安装FLTK   附录E GUI实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值