The Dearbookian #20041009: C++ Coding Standards 目录公开
2004-10-08 11:46
435 查看
The Dearbookian : Special Report #20041009
http://www.gotw.ca/publications/c++cs.htm
Table of Contents
1. Compile cleanly at high warning levels. 4
2. Use an automated build system. 7
3. Use a version control system. 8
4. Invest in code reviews. 9
6. Correctness, simplicity, and clarity come first. 13
7. Know when and how to code for scalability. 14
8. Don’t optimize prematurely. 16
9. Don’t pessimize prematurely. 18
10. Minimize global and shared data. 19
11. Hide information. 20
12. Know when and how to code for concurrency. 21
13. Ensure resources are owned by objects. Use explicit RAII and smart pointers. 24
15. Use const proactively. 30
16. Avoid macros. 32
17. Avoid magic numbers. 34
18. Declare variables as locally as possible. 35
19. Always initialize variables. 36
20. Avoid long functions. Avoid deep nesting. 38
21. Avoid initialization dependencies across compilation units. 39
22. Minimize definitional dependencies. Avoid cyclic dependencies. 40
23. Make header files self-sufficient. 42
24. Always write internal #include guards. Never write external #include guards. 43
26. Preserve natural semantics for overloaded operators. 47
27. Prefer the canonical forms of arithmetic and assignment operators. 48
28. Prefer the canonical form of ++ and --. Prefer calling the prefix forms. 50
29. Consider overloading to avoid implicit type conversions. 51
30. Avoid overloading &&, ||, or , (comma) . 52
31. Don’t write code that depends on the order of evaluation of function arguments. 54
33. Prefer minimal classes to monolithic classes. 57
34. Prefer composition to inheritance. 58
35. Avoid inheriting from classes that were not designed to be base classes. 60
36. Prefer providing abstract interfaces. 62
37. Public inheritance is substitutability. Inherit, not to reuse, but to be reused. 64
38. Practice safe overriding. 66
39. Consider making virtual functions nonpublic, and public functions nonvirtual. 68
40. Avoid providing implicit conversions. 70
41. Make data members private, except in behaviorless aggregates (C-style structs). 72
42. Don’t give away your internals. 74
43. Pimpl judiciously. 76
44. Prefer writing nonmember nonfriend functions. 79
45. Always provide new and delete together. 80
46. If you provide any class-specific new, provide all of the standard forms (plain, in-place, and nothrow). 82
48. Prefer initialization to assignment in constructors. 87
49. Avoid calling virtual functions in constructors and destructors. 88
50. Make base class destructors public and virtual, or protected and nonvirtual. 90
51. Destructors, deallocation, and swap never fail. 92
52. Copy and destroy consistently. 94
53. Explicitly enable or disable copying. 95
54. Avoid slicing. Consider Clone instead of copying in base classes. 96
55. Prefer the canonical form of assignment. 99
56. Whenever it makes sense, provide a no-fail swap (and provide it correctly). 100
58. Keep types and functions in separate namespaces unless they’re specifically intended to work together. 106
59. Don’t write namespace usings in a header file or before an #include. 108
60. Avoid allocating and deallocating memory in different modules. 111
61. Don’t define entities with linkage in a header file. 112
62. Don’t allow exceptions to propagate across module boundaries. 114
63. Use sufficiently portable types in a module’s interface. 116
65. Customize intentionally and explicitly. 122
66. Don’t specialize function templates. 126
67. Don’t write unintentionally nongeneric code. 128
69. Establish a rational error handling policy, and follow it strictly. 132
70. Distinguish between errors and non-errors. 134
71. Design and write error-safe code. 137
72. Prefer to use exceptions to report errors. 140
73. Throw by value, catch by reference. 144
74. Report, handle, and translate errors appropriately. 145
75. Avoid exception specifications. 146
77. Use vector and string instead of arrays. 152
78. Use vector (and string::c_str) to exchange data with non-C++ APIs. 153
79. Store only values and smart pointers in containers. 154
80. Prefer push_back to other ways of expanding a sequence. 155
81. Prefer range operations to single-element operations. 156
82. Use the accepted idioms to really shrink capacity and really erase elements. 157
84. Prefer algorithm calls to handwritten loops. 162
85. Use the right STL search algorithm. 165
86. Use the right STL sort algorithm. 166
87. Make predicates pure functions. 168
88. Prefer function objects over functions as algorithm and comparer arguments. 170
89. Write function objects correctly. 172
91. Rely on types, not on representations. 176
92. Avoid using reinterpret_cast. 177
93. Avoid using static_cast on pointers. 178
94. Avoid casting away const. 179
95. Don’t use C-style casts. 180
96. Don’t memcpy or memcmp non-PODs. 182
97. Don’t use unions to reinterpret representation. 183
98. Don’t use varargs (ellipsis). 184
99. Don’t use invalid objects. Don’t use unsafe functions. 185
100. Don’t treat arrays polymorphically. 186
http://www.gotw.ca/publications/c++cs.htm
Table of Contents
Preface
Organizational and Policy Issues
0. Don’t sweat the small stuff. (Or: Know what not to standardize.) 21. Compile cleanly at high warning levels. 4
2. Use an automated build system. 7
3. Use a version control system. 8
4. Invest in code reviews. 9
Design Style
5. Give one entity one cohesive responsibility. 126. Correctness, simplicity, and clarity come first. 13
7. Know when and how to code for scalability. 14
8. Don’t optimize prematurely. 16
9. Don’t pessimize prematurely. 18
10. Minimize global and shared data. 19
11. Hide information. 20
12. Know when and how to code for concurrency. 21
13. Ensure resources are owned by objects. Use explicit RAII and smart pointers. 24
Coding Style
14. Prefer compile- and link-time errors to run-time errors. 2815. Use const proactively. 30
16. Avoid macros. 32
17. Avoid magic numbers. 34
18. Declare variables as locally as possible. 35
19. Always initialize variables. 36
20. Avoid long functions. Avoid deep nesting. 38
21. Avoid initialization dependencies across compilation units. 39
22. Minimize definitional dependencies. Avoid cyclic dependencies. 40
23. Make header files self-sufficient. 42
24. Always write internal #include guards. Never write external #include guards. 43
Functions and Operators
25. Take parameters appropriately by value, (smart) pointer, or reference. 4626. Preserve natural semantics for overloaded operators. 47
27. Prefer the canonical forms of arithmetic and assignment operators. 48
28. Prefer the canonical form of ++ and --. Prefer calling the prefix forms. 50
29. Consider overloading to avoid implicit type conversions. 51
30. Avoid overloading &&, ||, or , (comma) . 52
31. Don’t write code that depends on the order of evaluation of function arguments. 54
Class Design and Inheritance
32. Be clear what kind of class you’re writing. 5633. Prefer minimal classes to monolithic classes. 57
34. Prefer composition to inheritance. 58
35. Avoid inheriting from classes that were not designed to be base classes. 60
36. Prefer providing abstract interfaces. 62
37. Public inheritance is substitutability. Inherit, not to reuse, but to be reused. 64
38. Practice safe overriding. 66
39. Consider making virtual functions nonpublic, and public functions nonvirtual. 68
40. Avoid providing implicit conversions. 70
41. Make data members private, except in behaviorless aggregates (C-style structs). 72
42. Don’t give away your internals. 74
43. Pimpl judiciously. 76
44. Prefer writing nonmember nonfriend functions. 79
45. Always provide new and delete together. 80
46. If you provide any class-specific new, provide all of the standard forms (plain, in-place, and nothrow). 82
Construction, Destruction, and Copying
47. Define and initialize member variables in the same order. 8648. Prefer initialization to assignment in constructors. 87
49. Avoid calling virtual functions in constructors and destructors. 88
50. Make base class destructors public and virtual, or protected and nonvirtual. 90
51. Destructors, deallocation, and swap never fail. 92
52. Copy and destroy consistently. 94
53. Explicitly enable or disable copying. 95
54. Avoid slicing. Consider Clone instead of copying in base classes. 96
55. Prefer the canonical form of assignment. 99
56. Whenever it makes sense, provide a no-fail swap (and provide it correctly). 100
Namespaces and Modules
57. Keep a type and its nonmember function interface in the same namespace. 10458. Keep types and functions in separate namespaces unless they’re specifically intended to work together. 106
59. Don’t write namespace usings in a header file or before an #include. 108
60. Avoid allocating and deallocating memory in different modules. 111
61. Don’t define entities with linkage in a header file. 112
62. Don’t allow exceptions to propagate across module boundaries. 114
63. Use sufficiently portable types in a module’s interface. 116
Templates and Genericity
64. Blend static and dynamic polymorphism judiciously. 12065. Customize intentionally and explicitly. 122
66. Don’t specialize function templates. 126
67. Don’t write unintentionally nongeneric code. 128
Error Handling and Exceptions
68. Assert liberally to document internal assumptions and invariants. 13069. Establish a rational error handling policy, and follow it strictly. 132
70. Distinguish between errors and non-errors. 134
71. Design and write error-safe code. 137
72. Prefer to use exceptions to report errors. 140
73. Throw by value, catch by reference. 144
74. Report, handle, and translate errors appropriately. 145
75. Avoid exception specifications. 146
STL: Containers
76. Use vector by default. Otherwise, choose an appropriate container. 15077. Use vector and string instead of arrays. 152
78. Use vector (and string::c_str) to exchange data with non-C++ APIs. 153
79. Store only values and smart pointers in containers. 154
80. Prefer push_back to other ways of expanding a sequence. 155
81. Prefer range operations to single-element operations. 156
82. Use the accepted idioms to really shrink capacity and really erase elements. 157
STL: Algorithms
83. Use a checked STL implementation. 16084. Prefer algorithm calls to handwritten loops. 162
85. Use the right STL search algorithm. 165
86. Use the right STL sort algorithm. 166
87. Make predicates pure functions. 168
88. Prefer function objects over functions as algorithm and comparer arguments. 170
89. Write function objects correctly. 172
Type Safety
90. Avoid type switching; prefer polymorphism. 17491. Rely on types, not on representations. 176
92. Avoid using reinterpret_cast. 177
93. Avoid using static_cast on pointers. 178
94. Avoid casting away const. 179
95. Don’t use C-style casts. 180
96. Don’t memcpy or memcmp non-PODs. 182
97. Don’t use unions to reinterpret representation. 183
98. Don’t use varargs (ellipsis). 184
99. Don’t use invalid objects. Don’t use unsafe functions. 185
100. Don’t treat arrays polymorphically. 186
Bibliography (7 pages)
Summary of Summaries (13 pages)
Index (12 pages)
相关文章推荐
- 两个C++编译器的批处理文件
- 介绍一个轻量级的C++开发工具——Relo
- (补课)borland c++ bulder的文件操作总结-4
- (补课)borland c++ bulder的文件操作总结-3
- (补课)borland c++ bulder的文件操作总结-2
- (补课)borland c++ bulder的文件操作总结-1
- 实现LZARI压缩算法的C++类
- VC++.NET学习笔记(第三章)
- c++实现的贪吃蛇
- 尝试构建CDT/ECLIPSE/VISUALC++的INTEGRATION
- C++ templet操作符的设计缺陷
- 如何在C++中使用libjpeg.lib函数库
- 《设计模式Design Pattern》读书笔记之三
- 《Primer C++ 3rd》读书笔记2
- 一个C语言实现不含递归的高效快速排序算法
- Regular Expression 正则表达式-4 (C++)
- Regular Expression 正则表达式-4 (C++)
- Regular Expression 正则表达式-3 (C++)
- Regular Expression 正则表达式-3 (C++)
- [原创]最近学习STL,在C++库中苦寻不到BigInteger类,于是自己写了一个