【プリンシプルオブプログラミング】アーキテクチャ根底技法
目次
はじめに
この記事は「プリンシプルオブプログラミング」を読んで自分なりにまとめた学習メモです。
プリンシプル オブ プログラミング3年目までに身につけたい一生役立つ101の原理原則
- 作者: 上田勲
- 出版社/メーカー: 秀和システム
- 発売日: 2016/03/23
- メディア: 単行本
- この商品を含むブログ (11件) を見る
思想 〜プログラミングのイデオロギー〜
アーキテクチャ根底技法
アーキテクチャ根底技法とは、よいソフトウェア・アーキテクチャ構築のための基礎原理のこと。
10の技法
抽象
抽象とは、概念的に明確な「線引き」を行うこと。
【2つの観点】
- 捨象:複雑な対象のいくつかの性質を捨て去り、特定の性質に目を向けること
- 一般化:具体的な対象から共通の性質を抽出し、より汎用的な概念に定式化すること
【使える場面】
- 複雑なものに取り組む時に使える
カプセル化
カプセル化とは、関連性の強いデータ群とロジック群を、モジュールという膜で包み込むこと。
【メリット】
- 関連のない要素が混じらないため、コードが見やすくなる
- 変更時の影響が、モジュール内に閉じることになる
- 影響度が明確になるので、コードの変更が容易になる
- それぞれが独立した部品になるので、再利用性が高まる
- 小さい単位に分割されるので、複雑な問題に対処できる
情報隠蔽
必要ないものはみせないという考えで、モジュールの実装を、そのモジュールを使用するクライアントから隠蔽する。
【メリット】
- インタフェースが小さくなり、やりとりがシンプルになり、コード全体の複雑性を下げることができる
- クライアントから見ても、余計な情報が見えないため、モジュールの使い方がシンプルになり、使い勝ってがよくなる
- 公開されている部分が少なければ、モジュールの内部に変更を留め置くことができる可能性が高くなり、コードの変更の波及を最小限に抑えることができる
パッケージ化
パッケージ化とは、モジュールを意味のある単位にまとめ、グループ化すること。
【メリット】
- ソフトウェア全体が、パッケージという小さい単位に分割されるので、複雑度が下がる
- パッケージ内は、関連のないモジュールが混じらないので、モジュールの管理がしやすくなる
- 修正に対して、影響度がパッケージ内に留まる可能性が高いので、コードが変更しやすくなる
- 依存関係が整理されることになり、パッケージを単位とした再利用をしやすくなる
【使える場面】
- モジュールがある程度できてから、ボトムアップで設計する
関心の分離
「関心」とは、ソフトウェアの機能や目的のこと。
関心の分離とは、それぞれの関心に関連するコードを集めて、独立したモジュールとし、他のコードから分離するということ。
【メリット】
- 関心ごとに独立して修正できるので、読む範囲が限られ、変更が容易になる
- 影響範囲が関心内に留まることになるので、変更時の品質が安定する
- コードを書く時は、関心を単位として開発するため、分業して並行して開発を進めることができる
【使える場面】
- 関心ごとにモジュールを作成し、互いに異なる責務や、無関係な責務は、分離する
- 例:「Model-View-Controller」パターンでは「ビジネスロジック」「ユーザへの表示」「入力処理」を分離している
充足性、完全性、プリミティブ性
カプセル化により、関連のある要素が、ある抽象概念を担うべく、モジュールに集まる。
- 充足性:モジュールが表現しようとしている抽象が、それを伝えるために十分であるか
- 例:「remove」が提供されていても、「add」が提供されてなければ、コレクションとして不十分
- 完全性:すべての特徴を備えているか
- 例:要素数を取得する「size」が提供されていなければ不完全
- プリミティブ性:すべて純粋であるかどうか
- 例:アイテムを1つ追加する「add」が提供されていれば、10個追加する「add10」は必要ない
ポリシーと実装の分離
ポリシーモジュール:そのソフトウェアの前提に依存する、ビジネスロジック部分
実装モジュール:そのソフトウェアの前提に依存しない、独立したロジック部分
【意識すべきこと】
- 「ポリシー」と「実装」を意識して実装する
- それぞれを別のモジュールに分けてコードを書く
参照の一点性
モジュールの要素は、宣言され定義されるのは一回限りにする。
【メリット】
- 副作用のないプログラミングが可能になる
【使える場面】
- 見通しのよいコードにするために、変数に対して値の再代入を行わない
分割統治
そのままでは解決することが難しい「大きな問題」は、いくつかの「小さな問題」に分割して、個別に解決する
【使える場面】
- 大きな問題にぶつかったときに、制御が容易になるような規模まで問題を分割して、それから取り組む方が効率的