1、 文件的属性以及开始和结束注释标记
a) 在每一个文件的头部用注释填写:章节号:文件名,以及该文件所完成的功能。
b) 如何一个文件是头文件,则什么也不用做
c) 如果这个文件中的程序中不含main()(即,不含主程序的.cpp的文件),这必须与其他部分连接,所以,在注释行的文件名后添加:{O}
d) 如果,文件是主程序(含有main()函数),但是需要和其他部分连接,则有独立的//{L}开头的行,并在{L}后填写所要连接的文件名(不含主程序的.cpp文件的名字)
2、 圆括号,大括号缩排
a) 单行定义常用于内联函数
b) 函数以及类的缩排如下:
Fun(){
/*Bodyhere */:
}
3、 标示符命名
a) 如果标示符是一个类:则第一个字母必须大写
b) 如果标示符是一个函数名或者变量名:则第一个字母必须小写
c) 剩余部分由一个或多个单词构成每个单词第一个字母必须大写
d) 编译时常量(const,#define),标示符的所有字母都必须大写
4、 头文件的包含顺序
C++编程思想里面倡导用“最特殊到最一般的”的顺序,即,首先为本地文件,接着为
自己的工具文件,最后,库文件。由于函数调用的顺序是按照头文件的包含顺序的来的。从而,使得用户的函数不被系统的以及第三方的库文件的函数所冲掉。可以,让用户程序员清晰的指导自己定义的接口是否和第三方或者系统的库函数所冲突。
另外,Google C++编程规范倡导的刚好相反:“从最一般到最特殊”,所以,能大量减少隐藏的头文件依赖。同时,在其中倡导应该首先包含首选头文件,即a.cpp文件中包含头文件时应该是首先包含a.h文件。
综上,C++编程思想的编程风格虽有缺点,但是好处还是很多。
5、 在头文件中包含警卫
总是在头文件中包含警卫,从而,避免单个.cpp文件期间一个头文件被多次包含。如下:
//IncludeGuard.h
#ifndefINCLUDEGUARD_H
#defineINCLUDEGARD_H
//Bodyof header file here…
#endif//INCLUDEGARD_H
从中可以看出,警卫以头文件名为基础,将文件名的字母大写,然后用下划线代替’.’。
6、 使用名字空间
在头文件中,必须保证其中没有包含任何有“污染”的名字空间,即如果改变函数或者
类外面的名字空间,将导致包含刺头文件的所有文件的改变。所以,在C++中不允许在函数的声明外面有任何using声明,同时不允许在头文件中有全局的using声明。
7、 使用“前置条件”和后置条件
Require()和assure()都在require.h中,在“核心函数”开始之前,用检查前置条件来保证
“核心函数”执行所需要的条件都是否满足,而,核心函数执行完毕之后使用后置条件来检查核心函数是否已经正确执行,且返回正确的结果。
第十八章——编程准则
1. 首相让程序运行,然后在追求速度。即使这段程序非常重要,而且,是我们的瓶颈。不要优化,首先用尽可能简单的设计让程序可以运行,如果速度不满足要求再对其进行优化。我们总能够发现“我们的”瓶颈并不是问题的所在。节省时间做真正有意义的事。
2. 编写简洁优美的程序有很多潜在的好处。简洁优美的程序不仅易读,易调试,而且,易于理解和维护。这正是能带来经济利益的地方。最初看啦简洁优美的程序会使我们的效率变低,但是,等到我们的程序能够无缝地嵌入到系统时,我们发现一切都是值得的,特别当修改我们的程序时更将淋漓的体现。
3. 分而治之。如果,感到问题复杂,是猜测程序的最基本的操作,为最难的部分创造一个对象——书写代码并且应用这个对象,然后将这个最难的部分嵌入其他的对象,等等。
4. 不用C++重写C的代码,除非我们需要做功能上大的调整(能用即不重做)。但用C++编译器编译C代码却好处多,可以发现代码中潜在的问题。
5. 如果有许多C代码需要改变,首先隔离不需要修改的代码,最好将那些函数打包成“API”的静态成员函数。然后集中精力到要修改的代码,将它们精化成类以使以后的维护修改更容易。
6. 要区别类的创建者和类的使用者(客户程序员)。类的使用者不需要也不想知道类的内部是如何实现的。被创建的类可以被没有经验的程序员使用,而且要工作良好,库只是在透明的情况下才会容易使用。
7. 创建类时,要尽可能用有意义的类名。目标是创建一个尽可能简单接口,这可以通过函数重载和默认参数的方法实现。
8. 数据隐藏允许我们不破坏用户代码下随心所欲的修改代码。所以,我们把对象的成员尽可能的定义为private,而只让接口的部分为public,而且总是使用函数而不是数据。如果类的使用者不需要调用这个函数,那么让这个函数也成为private,如果类的一部分让派生类可见,就定义为protected,并且提供一个接口不是直接暴露数据,这样,实现部分的改变将对派生类产生最小的影响。
9. 不要陷入分析瘫痪中。有些东西只有在编程时才能学到并使各系统正常。C++有内建的防火墙,让它为我们服务,在类或一组类中的错误不会破坏整个系统的完整性。
10. 我们的分析和设计至少要在系统中创建类、它们的公共接口、它们与其他类的关系、特殊的基类。如果我们的方法产生的东西比这些更多,就应当问问自己,是不是所有的成分在程序设计的整个生命周期内都是有价值的,如果不是,将会增加我们的维护开销。许多设计方法并不大奏效,这是事实。
11. 首先写测试代码(在写类之前),并和代码一起提交,运用makefile或其他工具使运行测试自动化。这样在运行测试代码之前就可以自动校验改变,迅速发现错误。因为我们拥有检测错误的体系,所以,当发现需要修改代码时,会更大胆地尽心尝试。
12. 首先写测试代码(在写类之前)可以保证类设计的完整性。如果不懈测试代码,就不知道我们的类能做什么。另外,写测试代码的过程会使我们想到类中所需要的其他特性或约束条件——这些特性或约束条件通常在设计时是不易觉察的。
13. 软件工程的基本原则:所有的问题都可以通过引进一个额外的间接层来简化。这是抽象方法额基础,而抽象是面向对象编程的首要特征。
14. 尽可能地原子化类。也就是每一个类都有一个单一、清楚地目的。如果,我们设计的类或我们设计的系统过于复杂,就应该将所有复杂的类分解成多个简单的系统。
15. 注意较长的成员函数定义,长的复杂的函数难于维护,而且很可能这个函数自己做了太多的事。如果看到这样的一个函数,至少预示着应该分解为几个函数,甚至预示着应该创造一个新类。