CODE COMPLETE 第2版 上


CODE COMPLETE 第2版 上 完全なプログラミングを目指して


日経BP社


著者:Steve McConnell
訳者:(株)クイープ


『Code Complete』への賛辞
はじめに

第1部 基礎を固める
第1章 ソフトウェアコンストラクションへようこそ
1.1 ソフトウェアコンストラクションとは
1.2 なぜソフトウェアコンストラクションは重要か
1.3 本書の読み方
1.4 まとめ

第2章 ソフトウェア開発への理解を深めるメタファ
2.1 メタファの重要性
2.2 ソフトウェアメタファの使用法
2.3 一般的なソフトウェアメタファ
2.3.1 ソフトウェアの書法:コードを書く
2.3.2 ソフトウェアの農場:システムを育てる
2.3.3 ソフトウェアの真珠養殖:システムのアクリーション
2.3.4 ソフトウェアコンストラクション:ソフトウェアを構築する
2.3.5 ソフトウェアテクニックの適用:知的道具箱
2.3.6 メタファの組み合わせ
2.4 参考資料
2.5 まとめ

第3章 2回測って、1度で切る:上流工程の必要性
3.1 準備の重要性
3.1.1 上流工程は現代のソフトウェアプロジェクトに必要か
3.1.2 準備不足の原因
3.1.3 コンストラクションの準備に有無を言わせない根拠
3.2 ソフトウェアの種類の特定
3.2.1 反復型手法への準備
3.2.2 反復型か、逐次型か
3.3 準備:課題定義
3.4 準備:要求
3.4.1 公式な要求が必要な理由
3.4.2 要求は不変という神話
3.4.3 コンストラクション時の要求変更への対処
3.5 準備:アーキテクチャ
3.5.1 一般的なアーキテクチャの構成要素
3.6 上流工程にかける時間
3.7 参考資料
3.8 まとめ

第4章 コンストラクションの重要な決断
4.1 プログラミング言語の選択
4.1.1 プログラミング言語の紹介
4.2 プログラミング規約
4.3 テクノロジの波に乗って
4.3.1 言語の「中へ」のプログラミングの例
4.4 主なコンストラクションプラクティス
4.5 まとめ

第2部 高品質なコードの作成
第5章 コンストラクションにおける設計
5.1 設計の難題
5.1.1 設計はやっかいな問題である
5.1.2 設計はルーズなプロセス
5.1.3 設計は妥協と優先順位の産物である
5.1.4 設計には制限がつきものである
5.1.5 設計は非決定論的である
5.1.6 設計はヒューリスティックなプロセスである
5.1.7 設計は創発的である
5.2 重要な設計概念
5.2.1 ソフトウェアの鉄則:複雑さへの対応
5.2.2 設計の望ましい特性
5.2.3 設計のレベル
5.3 構成要素の設計:ヒューリスティクス
5.3.1 現実世界のオブジェクト
5.3.2 一貫した抽象化
5.3.3 実装の詳細のカプセル化
5.3.4 設計が単純になる場合の継承
5.3.5 秘密の隠ぺい(情報隠ぺい)
5.3.6 変更の可能性が高い領域の特定
5.3.7 疎結合の維持
5.3.8 一般的なデザインパターンの検索
5.3.9 その他のヒューリスティクス
5.3.10 設計に関するヒューリスティクスのまとめ
5.3.11 ヒューリスティクスを利用するためのガイドライン
5.4 設計のプラクティス
5.4.1 反復
5.4.2 分割攻略
5.4.3 トップダウン方式とボトムアップ方式
5.4.4 実験的プロトタイプ
5.4.5 コラボレーティブな設計
5.4.6 どれだけ設計すれば十分か
5.4.7 設計作業の文書化
5.5 一般的な手法へのコメント
5.6 参考資料
5.7 まとめ

第6章 クラスの作成
6.1 クラスの基礎:抽象データ型(ADT)
6.1.1 ADTの必要性を示す例
6.1.2 ADTを使用する利点
6.1.3 ADTのその他の例
6.1.4 オブジェクト指向以外の環境における、ADTによる複数のインスタンスの処理
6.2 良いクラスインターフェイス
6.2.1 良い抽象化
6.2.2 良いカプセル化
6.3 設計と実装の問題
6.3.1 包合(「has a」の関係)
6.3.2 継承(「is a」の関係)
6.3.3 メンバルーチンとメンバデータ
6.3.4 コンストラクタ
6.4 クラスを作成する理由
6.4.1 望ましくないクラス
6.4.2 クラスを作成する理由のまとめ
6.5 言語固有の問題
6.6 クラスを超えて:パッケージ
6.7 参考資料
6.8 まとめ

第7章 高品質なルーチン
7.1 ルーチンを作成する理由
7.1.1 ルーチンにするには単純すぎる?
7.1.2 ルーチンを作成する理由のまとめ
7.2 ルーチンレベルでの設計
7.3 良いルーチン名
7.4 ルーチンの長さ
7.5 ルーチンの引数の使用
7.6 関数の使用に関する注意点
7.6.1 関数とプロシージャの使い分け
7.6.2 関数の戻り値の設定
7.7 マクロルーチンとインラインルーチン
7.7.1 マクロルーチンの使用の制限
7.7.2 インラインルーチン
7.8 まとめ

第8章 防御的プログラミング
8.1 無効な入力への防御
8.2 アサーション
8.2.1 独自のアサーションの構築
8.2.2 アサーションを使用するためのガイドライン
8.3 エラー処理テクニック
8.3.1 堅牢性と正当性
8.3.2 上位レベルのエラー処理
8.4 例外
8.5 バリケードによるエラーの被害の囲い込み
8.5.1 バリケードとアサーションの関係
8.6 デバッグエイド
8.6.1 製品の制約を開発に当てはめない
8.6.2 デバッグエイドの早期導入
8.6.3 攻撃的プログラミングの使用
8.6.4 デバッグエイドの削除計画
8.7 製品コードに防御的プログラミングをどれくらい残すか
8.8 防御的プログラミングに対する防御
8.9 参考資料
8.10 まとめ

第9章 擬似コードによるプログラミング
9.1 クラスとルーチンの作成手順の概要
9.1.1 クラスの作成手順
9.1.2 ルーチンの作成手順
9.2 擬似コードプログラミングプロセス(PPP)
9.3 PPPを使ったルーチンの作成
9.3.1 ルーチンの設計
9.3.2 ルーチンのコーディング
9.3.3 コードの検査
9.3.4 残りの仕上げ作業
9.3.5 必要に応じて繰り返す
9.4 PPP以外の方法
9.5 まとめ

第3部 変数
第10章 変数の使用
10.1 データリテラシー
10.1.1 データリテラシーテスト
10.1.2 データ型に関する参考文献
10.2 変数宣言のガイドライン
10.2.1 暗黙の宣言
10.3 変数の初期化のガイドライン
10.4 スコープ
10.4.1 変数の参照はまとめて
10.4.2 変数の「寿命」はできるだけ短く
10.4.3 変数の寿命の測定
10.4.4 スコープを最小限に抑えるためのガイドライン
10.4.5 スコープを最小限に抑えることについて
10.5 永続性
10.6 バインディングタイム
10.7 データ型と制御構造の関係
10.8 1つの目的に1つの変数
10.9 まとめ

第11章 変数名の力
11.1 良い名前を選択するために
11.1.1 名前を付けるときに一番大切なことは
11.1.2 問題指向の名前
11.1.3 名前の最適な長さ
11.1.4 変数名へのスコープの影響
11.1.5 計算値による変数名の修飾
11.1.6 変数名の一般的な反意語
11.2 特殊なデータの命名
11.2.1 ループ変数の命名
11.2.2 状態変数の命名
11.2.3 一時変数の命名
11.2.4 ブール変数の命名
11.2.5 列挙型の命名
11.2.6 名前付き定数の命名
11.3 命名規則の力
11.3.1 命名規則を作成する理由
11.3.2 命名規則が必要な状況
11.3.3 どれくらい正式なものにするか
11.4 略式の命名規則
11.4.1 言語に依存しない命名規則のガイドライン
11.4.2 言語固有の命名規則のガイドライン
11.4.3 混合言語環境でのプログラミングの注意点
11.4.4 命名規則の例
11.5 標準のプレフィックス
11.5.1 UDTの省略形
11.5.2 意味を表すプレフィックス
11.5.3 標準化されたプレフィックスの利点
11.6 短くて読みやすい名前の作成
11.6.1 省略形全般のガイドライン
11.6.2 音に基づく省略形
11.6.3 省略形の注意事項
11.7 避けるべき名前
11.8 まとめ

第12章 基本的なデータ型
12.1 数値全般
12.2 整数
12.3 浮動小数点数
12.4 文字と文字列
12.4.1 Cの文字列
12.5 ブール変数
12.6 列挙型
12.6.1 プログラミング言語に列挙型がない場合
12.7 名前付き定数
12.8 配列
12.9 ユーザー定義型の作成(型のエイリアス)
12.9.1 ユーザー定義型の作成例にPascalとAdaを使用したわけ
12.9.2 ユーザー定義型を作成するためのガイドライン
12.10 まとめ

第13章 特殊なデータ型
13.1 構造体
13.2 ポインタ
13.2.1 ポインタを理解するためのパラダイム
13.2.2 ポインタに関する一般的な注意点
13.2.3 C++のポインタ
13.2.4 Cのポインタ
13.3 グローバルデータ
13.3.1 グローバル変数の一般的な問題
13.3.2 グローバルデータを使用する理由
13.3.3 グローバルデータはあくまでも最後の手段として
13.3.4 アクセスルーチンの使用
13.3.5 グローバルデータの使用に伴うリスクを減らすには
13.4 参考資料
13.5 まとめ

第4部 ステートメント
第14章 ストレートなコードの構成
14.1 順序が重要なステートメント
14.2 順序が重要でないステートメント
14.2.1 上から下へ読めるコード
14.2.2 関連するステートメントのグループ化
14.3 まとめ

第15章 条件文の使用
15.1 if文
15.1.1 単純なif-then文
15.1.2 if-then-elseの連鎖
15.2 case文
15.2.1 最も効果的なcase文の順番
15.2.2 case文の使用に関するヒント
15.3 まとめ

第16章 ループの制御
16.1 ループの種類の選択
16.1.1 whileループを使用する状況
16.1.2 ループの途中に出口があるループを使用する状況
16.1.3 forループを使用する状況
16.1.4 foreachループを使用する状況
16.2 ループの制御
16.2.1 ループの開始
16.2.2 ループ本体の処理
16.2.3 ループの終了
16.2.4 エンドポイントの確認
16.2.5 ループ変数の使用
16.2.6 ループの適切な長さ
16.3 ループの作成─ 内から外へ
16.4 ループと配列の対応付け
16.5 まとめ

第17章 特殊な制御構造
17.1 ルーチンからの複数のreturn文
17.2 再帰
17.2.1 再帰の例
17.2.2 再帰の使用に関するヒント
17.3 goto文
17.3.1 goto文反対論
17.3.2 goto文賛成論
17.3.3 偽りのgoto文論争
17.3.4 エラー処理とgoto文
17.3.5 goto文とelse句の共有コード
17.3.6 goto文の使用に関するガイドラインのまとめ
17.4 特殊な制御構造の展望
17.5 参考資料
17.6 まとめ

第18章 テーブル駆動方式
18.1 テーブル駆動方式の概論
18.1.1 テーブル駆動方式の2つの注意点
18.2 直接アクセステーブル
18.2.1 月の日数の例
18.2.2 保険料率の例
18.2.3 柔軟なメッセージフォーマットの例
18.2.4 参照キーの補正
18.3 インデックスアクセステーブル
18.4 段階型アクセステーブル
18.5 テーブル参照のその他の例
18.6 まとめ

第19章 制御構造の問題
19.1 論理式
19.1.1 論理評価はtrueとfalseを使う
19.1.2 複雑な式は単純化する
19.1.3 肯定的な論理式にする
19.1.4 かっこを使って論理式を明確化する
19.1.5 論理式が評価される方法を知る
19.1.6 数値を含んでいる式は数直線の順番に並べる
19.1.7 0との比較ガイドライン
19.1.8 倫理式に共通する問題
19.2 複合文(ブロック)
19.3 null文
19.4 危険なほど深いネストの回避
19.4.1 深いネストを減らすテクニックのまとめ
19.5 プログラミングの基礎:構造化プログラミング
19.5.1 構造化プログラミングの3つの要素
19.6 制御構造と複雑さ
19.6.1 複雑さはどれくらい重要か
19.6.2 複雑さを軽減するための一般的なガイドライン
19.6.3 その他の複雑さ
19.7 まとめ

参考文献
索引
著者紹介

書籍目次

Posted by shi-n