Code Craft

Code Craft ~エクセレントなコードを書くための実践的技法~

Code Craft ~エクセレントなコードを書くための実践的技法~

基本的なことが書いてあり、特に目新しいことはなかったように思いました。ただ、これらの基本を忘れないようにはしたいと思います。特に、「コメントには、「なぜ」このような処理になったかの理由を書く」ということが印象に残りました。

  • 防衛的プログラミングで堅牢なコードを書く
    • すべての警告をONにしてコンパイルする
    • 1つのセクションのコーディングにかかったら、そのセクションを完了するまで(メインフロー+エラーチェック+エラー処理)先に進まない。
  • 解析ツールを使用する
  • 制約を書く
    • assert()を有効に使う。
    • C++/Javaでは、invariant()というメンバー関数を追加することで各メンバー関数の戦闘と終端に普遍条件用テスト用の関数を呼び出すassertを記述できるようになる
  • 意味ある物事に意味ある名前をつける
    • 関数には、外部の視点から見たその関数の動作を表す名前を付ける。実装に関する情報は名前に含めない
      • ×:doxxxx, performxxx
      • ○:countApples(), ...
    • マクロはすべて大文字で、プロジェクト名などを付加して一意になるようにする
  • コードコメントの書き方
    • 他の方法ではコードの明瞭性を高めることが不可能な場合にのみコメントを書く
    • 文芸的プログラミング
    • コメントは、処理の具体的な方法ではなく、「なぜ」そのように書かれているかの理由を記述する
  • エラーを処理する
    • エラー処理の種類
      • 戻り値で返す
      • エラーステータス変数を使う
      • 例外を投げる
      • ハンドらをインストールしてシグナルで通知する
    • 通知される可能性のあるエラーは1つたりとも無視しない
  • プログラマの道具箱
    • デバッガ
    • プロファイラ
    • コードバリデータ
      • メモリの開放、範囲外の配列のアクセス等をチェック
    • メトリックツール
    • コメントに比率、コードの複雑度について統計値を出す
  • 最適化
    • 最適化よりもコードの可読性を優先する
  • ソフトウェア設計
    • 「単純」であることが最も大切
      • 「書状が長くて済まぬが、短く書く時間がなかった」by Blaise Pascal
    • 1つのエレガントな図に要約できること
    • 移植性を考慮する必要があるときは#ifdef NEW_PLATFORMの嵐にならないようにする
      • プラットフォームを表す抽象層をつくる方法をつくる等
  • テスト
    • コードを書きながら、できるだけ早期にテストをする
    • テスト駆動型開発
  • 攻撃的プログラミング★
    • テストを確実に行って、問題が発生する部分を積極的に取り除く
  • グランドデザイン
    • プログラミングを創造的なプロセスととらえ、芸術性を自分の作品に織り込む
    • 他のソフトウェアの設計をひたむきに学ぶ
    • コードの構造を熟考してから開発に着手する
    • 自分が扱うものはすべて満足すべき状態に保ちたいと思う
    • まず絡み合ったコードを整理してリファクタリングする
  • 良書を読む
    • Prgmatic Programmer (Hunt Davis 99)/「達人プログラマシステム開発の職人から名匠への道」
    • Code Complete(McConnel 04)
    • The Practice of Programming (Kernighan Pike 99)/「プログラミング作法」
    • Design Patterns: Elements of Reusable Object-Oriented Software (Gamma 94)/「オブジェクト指向における再利用のためのデザインパターン
    • Refactoring: Improving the Design of Existing Code (Fowler 99)/「リファクタリング−プロ9グラムの体質改善テクニック」
    • 中括弧スタイル
      • K$Rスタイル

foo()
{
int a = 0;
while (a != 10) {
a++;
}
}

      • Allmanスタイル

foo()
{
int a = 0;
while (a != 10)
{ //<=ココ!
a++;
}
}

    • コーディング規約