【プリンシプルオブプログラミング】アーキテクチャ根底技法

 

目次

はじめに

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

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

アーキテクチャ根底技法

アーキテクチャ根底技法とは、よいソフトウェア・アーキテクチャ構築のための基礎原理のこと。

 

10の技法

  • 抽象
  • カプセル化
  • 情報隠蔽
  • パッケージ化
  • 関心の分離
  • 充足性、完全性、プリミティブ性
  • ポリシーと実装の分離
  • 参照の一点性
  • 分割統治

 

抽象

抽象とは、概念的に明確な「線引き」を行うこと。

 

【2つの観点】

  • 捨象:複雑な対象のいくつかの性質を捨て去り、特定の性質に目を向けること
  • 一般化:具体的な対象から共通の性質を抽出し、より汎用的な概念に定式化すること

【使える場面】

  • 複雑なものに取り組む時に使える

 

カプセル化

カプセル化とは、関連性の強いデータ群とロジック群を、モジュールという膜で包み込むこと。

 

【メリット】

  • 関連のない要素が混じらないため、コードが見やすくなる
  • 変更時の影響が、モジュール内に閉じることになる
  • 影響度が明確になるので、コードの変更が容易になる
  • それぞれが独立した部品になるので、再利用性が高まる
  • 小さい単位に分割されるので、複雑な問題に対処できる

 

情報隠蔽

必要ないものはみせないという考えで、モジュールの実装を、そのモジュールを使用するクライアントから隠蔽する。

 

【メリット】

  • インタフェースが小さくなり、やりとりがシンプルになり、コード全体の複雑性を下げることができる
  • クライアントから見ても、余計な情報が見えないため、モジュールの使い方がシンプルになり、使い勝ってがよくなる
  • 公開されている部分が少なければ、モジュールの内部に変更を留め置くことができる可能性が高くなり、コードの変更の波及を最小限に抑えることができる

 

パッケージ化

パッケージ化とは、モジュールを意味のある単位にまとめ、グループ化すること。

 

【メリット】

  • ソフトウェア全体が、パッケージという小さい単位に分割されるので、複雑度が下がる
  • パッケージ内は、関連のないモジュールが混じらないので、モジュールの管理がしやすくなる
  • 修正に対して、影響度がパッケージ内に留まる可能性が高いので、コードが変更しやすくなる
  • 依存関係が整理されることになり、パッケージを単位とした再利用をしやすくなる

【使える場面】

 

関心の分離

関心」とは、ソフトウェアの機能や目的のこと。

関心の分離とは、それぞれの関心に関連するコードを集めて、独立したモジュールとし、他のコードから分離するということ。

 

【メリット】

  • 関心ごとに独立して修正できるので、読む範囲が限られ、変更が容易になる
  • 影響範囲が関心内に留まることになるので、変更時の品質が安定する
  • コードを書く時は、関心を単位として開発するため、分業して並行して開発を進めることができる

【使える場面】

  • 関心ごとにモジュールを作成し、互いに異なる責務や、無関係な責務は、分離する
  • 例:「Model-View-Controller」パターンでは「ビジネスロジック」「ユーザへの表示」「入力処理」を分離している

 

充足性、完全性、プリミティブ性

カプセル化により、関連のある要素が、ある抽象概念を担うべく、モジュールに集まる。

  • 充足性:モジュールが表現しようとしている抽象が、それを伝えるために十分であるか
    • 例:「remove」が提供されていても、「add」が提供されてなければ、コレクションとして不十分
  • 完全性:すべての特徴を備えているか
    • 例:要素数を取得する「size」が提供されていなければ不完全
  • プリミティブ性:すべて純粋であるかどうか
    • 例:アイテムを1つ追加する「add」が提供されていれば、10個追加する「add10」は必要ない

 

ポリシーと実装の分離

ポリシーモジュール:そのソフトウェアの前提に依存する、ビジネスロジック部分

実装モジュール:そのソフトウェアの前提に依存しない、独立したロジック部分

 

【意識すべきこと】

  • ポリシー」と「実装」を意識して実装する
  • それぞれを別のモジュールに分けてコードを書く

 

参照の一点性 

モジュールの要素は、宣言され定義されるのは一回限りにする。

 

【メリット】

  • 副作用のないプログラミングが可能になる

 

【使える場面】

  • 見通しのよいコードにするために、変数に対して値の再代入を行わない

 

分割統治

 そのままでは解決することが難しい「大きな問題」は、いくつかの「小さな問題」に分割して、個別に解決する

 

【使える場面】

  • 大きな問題にぶつかったときに、制御が容易になるような規模まで問題を分割して、それから取り組む方が効率的