新しいナリッジをお届けしたい

marosf
Kindleで読書をしている人にオススメのアプリ!

「本書を読んだことがないプログラマーはプログラマーとは呼べない」とまで言われている名著。前々から有名すぎて気になっていたのですが、上下巻で約1,300ページあり、お値段は13,000円弱ということもあり尻込みしていました。が、たまたまブックオフで上巻が半額で売っていたので挑戦してみました。(6月のkindle月替りセールでコードコンプリート上下巻が44%offになっています。)


上巻の構成は最初に上流工程の説明があり、後はクラス、変数、ルーチン、ステートメントの作り方及び書き方などのコーディングに関する内容となっています。
「どうすれば他人が読みやすくなるコードを書くことができるか。」という説明に重点を置かれている印象でした。

本書に書かれていることのうちの一つでも実践すればコードの品質が上がることは間違いないです。ただ、一気に全てを実践することは無理なので(というか覚えきれない)、何度も見返しながら一つずつ着実に実践しようと思います。一度全体に目を通しておけば、「あそこにこんなことが書いてあったな」と分かるので、まずは600ページを頑張って目で追ってみただけというのが現状です。

以下に、「まずこれだけは実践したい!」ということを自分の備忘録も兼ねて紹介したいと思います。

■上流工程

・アーキテクチャは他に検討されていたクラスの設計を説明し、最終的な構成が選択された理由を説明できるものにする。アーキテクチャにシステム内のクラスをすべて明記する必要はない。「80:20の法則」を目指すこと。つまり、システムの振る舞いの80%を実現する20%のクラスが明記されていればよい。

・優れたアーキテクチャ仕様には、システム内のクラス、各クラスに隠ぺいされた情報、そして設計上のすべての候補について、それらを採用した理由、採用しなかった理由が明記されていること。

・要求の策定をプロジェクトの一つとして十分な時間を見積もっておくこと。要求が確定してからプロジェクトの残りの時間を見積もること。家の建築工事を請け負った業者も同じだ。施主が「費用はどれくらいかかるか」と尋ねたら、当然あなたは「どのような家にしますか」とたずねるだろう。施主が「それは分からないけれど、いくらぐらいかかりそうか」と答えたら、あなたは「お邪魔しました」と言って、その場を去るだろう。

・設計時のプログラムはどこまで分解すればよいのだろうか。次のレベルを分解するよりもコーディングする方が簡単に思えるまで続けよう。設計があまりにも明白かつ単純で、これ以上は耐えられないと思えるまで続ける。その時点で作業は完了である。

コード設計

・どのプログラミング言語にも長所と短所がある。使用している言語の長所と短所を把握しておくこと。

・「何を隠ぺいする必要があるか」という問いかけは、すべてのレベルで良い設計を後押しする。

・システムが変更される可能性を考慮して、変更の影響または範囲が、その変更が発生する可能性に見合うようにシステムを設計しよう。変更の可能性が高い場合は、それに容易に対応できるようなシステムにする。きわめて可能性の低い変更以外は、システムの複数のクラスに多大な影響が及ぶことがあってはならない。

・他のモジュールにほとんど依存しないモジュールを作成するよう心がけよう。恋人どうしのようにくっついているのではなく、職場の同僚のように冷めた関係にしよう。

コーディング

・ルーチンの名前はそのルーチンが何をするものなのか分かるようにしなければならない。

・擬似コードを書いてそれを基にコードを作成する。擬似コードはプログラミング言語のコメントとして添える。こうするとコメントを作成する手間がほとんど省けるし、コメントは完璧に意味の通るものとなる。

・ステートメントの数を少なくし変数の寿命をできるだけ短くすることを目標にする。ステートメントの数を少なくすると脆弱性の窓が小さくなる。また、コードが読みやすくなる。

・マジックナンバーは使わないこと。名前付き定数をサポートしている言語でプログラミングする場合は、マジックナンバーではなく名前付き定数を使用すること。

・関連するコードは一箇所にまとめること。うまくまとまっているかどうかを評価する簡単な方法は、ルーチンのコードを印刷して、関連するステートメントを四角で囲んでみること。ステートメントが正しい順序に並んでいれば、四角形どうしが交差しないはずだ。

・2次元以上の配列をループに使用する場合は、インデックスに意味のある名前を付けるべきである。そうすることで、ループの目的と配列のどの要素にアクセスするのかが明確になる。



コメント