【プリンシプルオブプログラミング】7つの設計原理

 

目次

はじめに

この記事は「プリンシプルオブプログラミング」を読んで自分なりにまとめた学習メモです。 

思想 〜プログラミングのイデオロギー

7つの設計原理

7つの設計原理とは、障害を作り込まないために考慮すべき、コード構造上の7つの核心観点のこと。

「どうしたら開発時に障害を作り込まないようにできたか」という観点から根本原因を分析して、その結果、導かれた原理。

  • 単純原理
  • 同型原理
  • 対称原理
  • 階層原理
  • 線形原理
  • 透明原理
  • 明証原理
  • 安全原理

 

単純原理

単純原理とは、「シンプルにこだわる」という原理。

極論、プログラミングの初心者でも読めるよう、一貫して単純なコードを書くようにする。

そのために、複雑で全体的な関連性を重視するのではなく、局所的な完全性を重視するようにする。

 

【意識すべきこと】

自然なコードを心がける。高級なテクニックを使わず、単純なやり方で通すようにする。むやみにコードを複雑化、肥大化せずに、単純で小さいままに保つ

 

同型原理

同型原理とは、「形にこだわる」という原理。

同じことは、同じように扱うことにこだわる。

例えば、あるモジュールにおいて、そこで扱う数値の単位が統一されていたり、公開関数の引数の数が統一されていたり、使用順序が統一されていたりすること。

 

【意識すべきこと】

コードに一貫性を持たせる

自分の実力をアピールするため、他の部分との一貫性など無視して、スマートで独創的なコードを書く人がいる。コードは堅牢でシンプルにしておかなければならないのに、ほとんど無意識に、複雑なものにしてしまう。自己満足には、高品質なコードほどの重要性はない。独創性を抑制し、一貫性を優先する。

 

対称原理

対称原理とは、「形の対称性にこだわる」という原理。

 上があれば下、左があれば右、アクティブがあればパッシブというような、対称性にこたわる。

 

【意識すべきこと】

  • 条件の対称性:制御条件に整合性を持たせるため、反条件の整合性も検討する。
  • 例外の対称性:例外的な状況を考慮しつつ、それを極力排除する。特殊なケースがあまりにも多い場合、要求を見直し、コードから例外的状況を出来るだけ排除する。
  • 命名の対称性:「set/get」「start/stop」「begin/end」「push/pop」

 

階層原理

階層原理とは、「構造が階層であることにこだわる」という原理。

物事の主従関係、前後関係、本末関係など、階層関係を常に意識し、整理された関係性を構築する。階層ごとに処理を取り決め、同じ種類の処理が異なる階層間に渡らないことが重要。リソースの獲得を行ったら、同じ階層でリソースの解放を行う。

 

【意識すべきこと】

コードの各々について、抽象レベルを意識して、階層構造を構築する。1つの階層は、同じ抽象レベルのものだけで構成する。

また、上位から見た時に、下位レベルは、「それを外部から見ている」ような視点で記述する。上位レベルの、下位レベルを呼び出すコードがわかりやすくなる。

 

線形原理、透明原理

線形原理とは、「処理の流れは直線であることにこだわる」という原理。

透明原理とは、「見通しがよいことにこだわる」という原理。

ある機能は、いくつかの機能の重ね合わせによって実現されている(線形結合的である)のが、シンプルでよい構造。

逆に、スイッチでコードを制御したり、状態の数をむやみに増やしたりすると、コードがわかりにくくなる。このようなことを避け、コードの見通しをよくする。

 

【意識すべきこと】

処理の分岐を少なくする。処理の流れを直線的に読めるようなコードにする。

そのためには、特殊な振る舞いを、主処理に混ぜて書かないようにすること。処理の一貫性やルートにこだわり、時にコードを俯瞰して、複雑となっていないことを確認する。

また、保守していくうちに複雑になりすぎたものに関しては、再構築することも視野に入れる。自分だけではなく、後に続く人のためにも、明確で堅牢な設計にしておくことを心がける。

 

明証原理

明証原理とは、「ロジックの明証性にこだわる」という原理。

明証性とは、はっきりと証明すること。つまり、一見して明らかに正しい、と言えるようなコードを書くこと。

 

【意識すべきこと】

ロジックは直感的でわかりやすいものにする。コードを読んでいる人が疑問に思うようなことは、排除するか、コメントしておく。

また、すぐにそれとわかる、誰でも同じことを想像できる用語を使うようにする。特に、意味のない変数名などを使わないように気を付ける。

 

安全原理

安全原理とは、「安全性にこだわる」という原理。

 必然性のないところや曖昧なところは、安全サイドで設計・プログラミングしておくこと。

これは、ありえないという条件をあえて考慮して、コードを書くということ。

 

【例】

  • あるif文に対して、ありえないと思いつつもelse文を考慮する
  • あるcase文に対して、ありえないと思いつつもdefault句を考慮する
  • ある変数に対して、ありえないと思いつつもNULLチェックを行ったりする

【意識すべきこと】

すべての動作を洗い出し、それぞれが安全になるよう考慮する。要件を理解し、機能を理解し、場合分けをコードに正しくブレイクダウンできると、ソフトウェアが安全に動作する確率が高くなる。

ただし、人によってブレが出てはいけないので、コードを書く前に、ある程度規約として定めておくようにする。