自分の理解を深めるために投稿します。
第9章:擬似コードによるプログラミング
クラスとルーチンの作成手順
クラス
- クラス全体を設計
- クラスの各ルーチンを作成
- クラス全体をレビュー、テスt
ルーチン
- ルーチンを設計
- 設計を確認
- ルーチンのコーディング
- コードをレビュー、テスト
作成方法の1つに 擬似コードプログラミングプロセス(PPP) がある
- 他にはテストファースト、リファクタリングなど
擬似コードプログラミングプロセス(PPP)とは
擬似コード
- プログラムの仕組みを説明する略式の表記方法
- 通常の文章に似ている
効果的にするために
- 処理を正確に説明する文章を使用する
- プログラミング言語の構文を使用しない
- コーディングより少し上位レベルで設計をすること
- 目的レベルで擬似コードを書く
- どのように実現するかは考えない
- ほぼそのままコーディングできる詳細レベルで擬似コードを書く
- コードを簡単に書き起こせるレベルにしておく
// 良い擬似コード例
使用しているリソースの数を記録する
if 別のリソースが利用できる
ダイアログボックス構造体を割り当てる
if ダイアログボックス構造体の割り当てが可能である
使用するリソースが1つ増えることを記録する
リソースを初期化する
呼び出し元から提供された場所にリソースの数を格納する
Endif
Endif
新しいリソースが作成された場合はtrueを返し、そうでない場合はfalseを返す
// 悪い擬似コード例
リソース数を1つインクリメントする
malloc()を使ってdlg構造体を割り当てる
malloc()がNULLを返したら、1を返す
OSrsrc_initを呼び出し、オペレーティングシステムのリソースを初期化する
*hRsrcPtr = リソース数
0を返す
良い擬似コードの特徴
- 言語に依存していない
- 目的が理解しやすい
- そのままコメントに転用できる
擬似コードを使う利点
- 詳細設計のレビューがしやすくなる
- 反復しながら詳細化できる
- 擬似コードは変更が容易である
- エラーを早めに捕捉することが大事
- コメントの作成を最小限に抑える
- 設計書を管理しやすい
- コードのコメント内に存在するので、どちらかを変更するとすぐ反映できる
PPPを使ったルーチン作成方法
設計
- ルーチンの役割を確認
- ルーチンが解決する問題を定義する
- 隠蔽する情報
- 入出力
- 事前・事後条件
- ルーチンに名前をつける
- ルーチンのテスト方法決定
- 標準ライブラリが提供する機能を調べる
- 無駄な作業をなくすため
- エラー処理
- 効率
- アルゴリズムとデータ型を調査する
- 擬似コードを書く
- データについて考える
- 擬似コードを検査する
- 擬似コードでいくつかのアイデアを出し、最も良いものを採用する
コーディング
- ルーチンを宣言
- 擬似コードを概略レベルのコメントとして転用
- 各コメントの下にコードを書く
- コードが大量になったら、擬似コードを分解したり、ルーチンを分解することを考える
コードの検査
- 次の作業に進む前にコードレビューする
- まずは頭で確認
- なぜ動くかきちんと理解できているか?
- コンパイルする
- デバッガでコードを実行
- コードをテスト
- エラーを検出したら取り除く
残りの仕上げ作業
- インターフェイス検査
- 全ての引数が使われているか
- 設計の品質検査
- 他のルーチンとの結合度は十分弱いか
- 防御的に設計されているか
- 変数を検査
- 不正確な変数名になってないか
- 使用されていない変数はないか
- 初期化は正しくなされているか
- ステートメントとロジックの検査
- 無限ループ、不適切なネスト、リソースのリークはないか
- レイアウト
- ドキュメント
- コメント
必要に応じて繰り返す
- ルーチンの品質が悪ければ擬似コードに戻る