[ C++で開発 ]

書籍「C++ Coding Standards: 101 Rules, Guidelines, And Best Practices」
のサマリのサマリの日本語訳

Herb Sutter、Andrei Alexandrescu両氏によるコーディング標準本のルール名を列挙します。

ルール名

組織およびポリシー関連

0. ささいなことを気にかけるな(標準化すべきではないものを知れ)
1. コンパイラの警告を最大レベルにして、すべての警告を取り除け
2. ビルドを自動化せよ
3. バージョン管理システムを使え
4. コードレビューに投資せよ

設計様式

5. ひとつの要素にはひとつの責務
6. 正確性、簡潔性、明りょう性がまず最初
7. いつどのようにコードにスケーラビリティを持たせるかを知れ
8. 時期尚早に最適化しない
9. 最初から悲観的にならない
10. 大域データ、共有データは極力少なく
11. 情報を隠蔽せよ
12. いつどのようにコードに並行性を持たせるかを知れ
13. リソースがオブジェクトによって保管されることを保障せよ。明示的にRAIIとスマートポインタを使え

コーディング様式

14. 実行時エラーよりもコンパイル時・リンク時エラーを好め
15. constをがんがん使え
16. マクロは使うな
17. マジックナンバーの使用は避けよ
18. 可能な限り局所的に変数を定義せよ
19. 常に変数を初期化せよ
20. 長い関数を避けよ。深いネストを避けよ。
21. コンパイル単位をまたがった初期化の依存を避けよ
22. 定義の依存を最小限にする。循環参照を避けよ。
23. ヘッダーファイルは自立させよ
24. 常に内部#includeガードを使用し、外部#includeガイドは遅れるな
25. パラメータは、値・(スマート)ポインタ、参照を適切に設計せよ
26. 演算子オーバーロードは自然な意味に反しない
27. 数式の標準形と代入演算を好め
28. ++と--の標準形を好め。プレフィックスの使用を好め
29. 暗黙の型変換を避けるためオーバーロードを考慮せよ
30. &&、||、コンマなどのオーバーライディング
31. 関数の引数の評価順序に依存するコードは書くな

クラス設計と継承

32. 書いているクラスがどの種類かを明らかにせよ
33. 巨大な一枚岩のクラスよりも、最小限のクラスを好め
34. 継承よりもコンポジションを好め
35. 基底クラスとして設計されていないクラスからの継承を避けよ
36. 抽象インタフェースの提供を好め
37. public継承は置換可能性の提供である。再利用するためではなく、再利用されるために継承せよ。
38. オーバーライドを安全に行う実践方法
39. 仮想関数は非publicに、public関数は非virtualにすることを考慮せよ
40. 暗黙的な型変換を避けよ
41. 振る舞いのないデータの集合(C++のconst)を除き、データメンバーはprivateにせよ
42. 内部を漏らすな
43. Pimplイディオムは適切に使用せよ
44. 非メンバーかつ非フレンドの関数を書くことを好め
45. newとdelete双方を常に提供せよ
46. クラス固有のnewを提供するときには、標準形式(plain, in-place and nothrow)を提供せよ

コンストラクション、デストラクション、コピー

47. メンバ変数の定義と初期化は同じ順番とせよ
48. コンストラクタでは代入より初期化を好め
49. コンストラクタ、デストラクタの中から仮想関数を呼ばない
50. 基底クラスのデストラクタは、(1)public かつ virtual、(2)protected かつ virtual
51. デストラクタ、解放、スワップは決して失敗しないこと
52. コピーと破棄を一貫して行え
53. コピーの可否は明示的に
54. スライシングを避けよ。基底クラスではコピーの代わりにCloneを考慮せよ
55. 代入の標準形を好め
56. 常に意味があるように、失敗することのないswapを提供せよ

名前空間とモジュール

57. 型とその非メンバー関数インタフェースは同じ名前空間に置け
58. 特に一緒に使うことがなければ型と関数は別の名前空間に置いてもよい
59. ヘッダーファイル中や、#includeよりも前に名前空間のusingを書いてはいけない
60. メモリの割り当てと解放を異なるモジュールで実行しない
61. ヘッダーファイルに外部リンケージを持つ要素を定義しない
62. 例外をモジュールの境界を越えて伝播させない
63. モジュールのインタフェースには十分ポータビリティのある型を使う

テンプレートと総称性

64. 静的なポリモーフィズムと動的なポリモーフィズムを混ぜて使うときは慎重に
65. 意図的に明示的にカスタマイズせよ
66. 関数テンプレートを特殊化しない
67. 意図しない非生成的なコードを書かない

エラー処理と例外

68. 内部条件と不変条件をドキュメントしてたっぷりと表明せよ
69. 合理的なエラー処理方針を確立し、厳格に従え
70. エラーと非エラーを区別せよ
71. エラー安全なコードを設計して書け
72. エラーの報告には例外を使うのを好め
73. 値をスローし、参照でキャッチせよ
74. エラーを適切に報告し、処理し、翻訳せよ
75. 例外の仕様化を避けよ

STL:コンテナ

76. デフォルトではvectorを使え、さもなければ適切なコンテナを選べ
77. 配列ではなくvectorとstringを使え
78. 非C++のAPIとデータを受け渡すときは、vector(そしてstring::c_str)を使え
79. コンテナには値かスマートポインタだけを格納せよ
80. 順序を拡張する別なやり方としてpush_backを好め
81. 単一の要素の操作よりもレンジ操作を好め
82. 容量を減らしたり要素を削除するときは、よく知られたイディオムを使え

STL:アルゴリズム

83. 検査付きのSTL実装を使え(checked STL implementation)
84. 手書きのループ(handwritten loops)を呼ぶアルゴリズムを好め
85. STLサーチアルゴリズムを正しく使え
86. STLソートアルゴリズムを正しく使え
87. Make predicates pure function
88. アルゴリズムと比較引数には関数より関数オブジェクトを好め
89. 関数オブジェクトを正しく書け

型安全性

90. タイプスイッチを避けよ、ポリモーフィズムを好め
91. 表現ではなく型を当てにせよ
92. reinterpret_castの使用を避けよ
93. ポインタに対してstatic_castの使用を避けよ
94. const外しのキャストを避けよ
95. Cの様式のキャストを使うな
96. 非PODにmemcpyやmemcmpを使うな
97. ある表現を解釈し直す際にunionを使うな
98. varargs(省略)を使うな
99. 不正なオブジェクトを使うな。安全でない関数を使うな
100. 配列をポリモーフィズムとして扱わない