書籍「プリンシプル オブ プログラミング 3年目までに身につけたい 一生役立つ101の原理原則」を読んだメモ
7つの設計原則とは、障害を作り込まないために考慮すべき、コード構造上の7つの核心観点であり、レビューやコードを書くときの観点になるもの
1. 単純原理
- シンプルにこだわる
- 高級なテクニックを使わず、単純なやり方で通す
- むやみにコードを複雑化、肥大化せずに、単純で小さいままに保つ
2. 同型原理
- 形にこだわる
- 例
- あるモジュールにおいて、扱う数値の単位を統一する
- 高階関数の引数の数を統一する
- 関数の使用順序を統一する
- コードに一貫性を持たせる
3. 対称原理
- 形の対称性にこだわる
- 上があれば下、左があれば右、アクティブがあればパッシブがあるというような対称性にこだわる
- コードに対称性があれば、コードの予想がつきやすく、条件漏れに気づけたり、違和感を覚えやすい
- 対称性のあるコード例
- 条件があれば反条件も書く
- 命名の対称性 set/get、start/stop、begin/end、push/pop
- 例外を排除する。例外的状況は特殊なケースであるが故に対称性を崩す。構成を見直してできるだけ排除する
4. 階層原理
- 構造が階層であることにこだわる
- 物事の主従関係、前後関係、本末関係など、階層関係を意識し、整理された関係性を構築する
- コードの各々について、抽象レベルを意識して、1つの階層は同じ抽象レベルのものだけで構成する
- 上位から中位、中位から下位、下位で実際のロジック、というふうに分割する
5. 線形原理
- 処理の流れは直線であることにこだわる
- スイッチでコードを制御したり、状態の数をむやすみに増やすとコードはわかりにくくなる
- 処理の分岐を少なくし、処理の流れを直線的に読めるようなコードにする
- 特殊な振る舞いを、主処理に混ぜて書かないようにする
- 処理の一貫性やルートにこだわり、時折コードを俯瞰して 複雑となっていないことを確認する
- 保守するうちに複雑になりすぎたものに関しては、再構築することも視野に入れる
6. 明証原理
- ロジックの明証性にこだわる
- ロジックが明瞭なコードを書くようにする
- ロジックは直感的でわかりやすいものにし、コードを読んでいる人が疑問に思うようなことは排除するかコメントする
- 誰でも同じことを想像できる用語を関数名や変数に使用する。意味のない変数名は使用しない
7. 安全原理
- 安全性にこだわる
- 例
- あるif文に対してありえないと思いつつもelse文を考慮
- あるcase文に対してありえないとおもいつつdefault句を考慮
- ある変数に対して、ありえないと思いつつもNULLチェックを行う
- 必然性のないところや、曖昧なところは安全サイドに設計する
- すべての動作を洗い出し、それぞれが安全になるよう考慮する
- 要件・機能を理解し、場合分けをコードに正しくブレイクダウン出来ると、ソフトェアが安全に動作する確率が高くなる
- ありえないという条件でもあえて考察の対象として、設計・プログラミングする
参考1. コード再利用のリスク
- コードを再利用するときには、コードを本当に理解してから流用する
- ハードウェアの場合、よい設計から学び、悪い設計を避ける知恵の伝達が物理的な現物によって行われるため、その現物がさらされる環境条件に気を配れば比較的容易に流用可能
- ソフトウェアの場合、流用元のコードが、たくさんのその他のコードと相互作用を行う文脈であり、使用実績はまったく当てにできない。
参考2. コード障害修正のリスク
- 既存のコードを修正する場合には、再利用以上にそのコードを深く理解する必要がある
- 完全に理解しないと、考慮漏れやデグレードの危険性が高い
- 障害のケースのみを確認するのではなく、コードを完全に理解し、障害パターンを完全に理解し、仮設を立て、修正し、パターンを網羅したテストを行うことで品質を担保する