バグを生まないコードの書き方についての経験的備忘録

  • 変数を初期化する
  • エラー処理を入れる
  • テストのための機能(コード)を入れる
    • 組み込み系のシステムでは、最初から機械の中にテストのためのチップを埋めこむらしい。これは、設計段階でテストのことを考慮に入れることで品質向上につなげるという意味があるのだと思う。
  • 変数の宣言は、使用部分になるべく近いところで行う。
  • 変数の使用用途が複数あってはいけない
    • たとえば、なんとかidという変数があったとして、そこに数値を入れるようにしているのに、フラグの用途をもたせるために文字列を設定したりするようなことはNG。ひとつの変数にはひとつの使用用途を持たせるようにする。
  • 変数名は適切なネーミングで!
    • 変数名だけで何の変数なのかがわかるような名前の付け方を心がける。
  • if命令の判定について

ある変数hogeがあるとして、変数hogeは値1,2,3のいずれかを取り得るものとする。
この場合、
if (hoge == 1) {
// hoge=1の場合の処理
} else if (hoge == 2) {
// hoge=2の場合の処理
} else {
// hoge=3の場合の処理
}
こういうのはNG。

以下のようにする。
if (hoge == 1) {
// hoge=1の場合の処理
} else if (hoge == 2) {
// hoge=2の場合の処理
} else if (hoge == 3) {
// hoge=3の場合の処理
} else {
// エラー処理
error_log("program error: hoge=$hoge", 0);
}
想定してない変数の値は、エラーログに必ず出力させる。デバッグを効率的に行うことができる。

  • モジュール同士で、相互参照をしない

たとえば、
hoge.c
foo.c
というc言語のソースファイルがあったとする。
hoge.cppからfoo.cppの関数をコールしている且つ
foo.cppからhoge.cppの関数をコールするのはよくない。
こういうのは、それぞれのモジュールの役割を明確にできていない可能性があると思われる。
モジュールとモジュールの関係は、利用するモジュール、利用されるモジュールという関係であったほうが、ソースの解析しやすさが向上すると思われる。

  • コメントを入れる。

難しい箇所に関しては重点的にコメント入れる。