始めに
アーキテクチャ根本技法について記載する。
尚、解説時には、以下の3つの形式に分けて解説する。
- what??
- why??
- how??
アーキテクチャ根本技法
what??
良いソフトウェア・アーキテクチャ構築のモジュール設計方針である。
以下の10個がある。
①抽象
②情報隠蔽
③パッケージ化
④関心の分離
⑤充足性・完全性・プリミティブ性
⑥ポリシーと実装の分離
⑦インターフェースの実装の分離
⑧参照の一点性
⑨分割統治
why??
プログラマが蓄積された過去から導き出した優れた解決だから
how??
根底技法をコードに適用する
①抽象
what??
モジュールを区別する概念的な線引きを行うこと
抽象は以下の2つに分けることができる
- 捨象:枝葉を取り除き、対象物の本質を把握すること。
- 一般化:複数のものを共通点でグルーピングし、汎用的な概念にすること。
why??
- 捨象:複雑さを下げ、集中すべき問題に集中できるため。
- 一般化:他の場面でも応用するため。
how??
捨象:今着目している側面からの本質を捉える
一般化:複数の事柄をパターン化して応用する。
②カプセル化
what??
モジュールの構成要素は、関連性のあるデータとロジックのみにすること。
why??
- コードの可読性アップ。
- コードが変更しやすい。
- 再利用性が高まる。
- 複雑な問題に対処しやすい。
how??
モジュールに入れるのは、関連のある要素のみにする。
③情報隠蔽
what??
モジュールの内容をクライアントから隠蔽すること。
クライアントからは必要最小限に公開された関数でしか操作できないようにする。
why??
- コードの複雑性を下げるため
- クライアントの使い勝手を上げるため
- コードの変更の波及を最低限に
how??
公開範囲は必要最小限にしてカプセル化し、情報を隠蔽する。
④パッケージ化
what??
モジュールをさらに意味のある単位でグルーピングすること。
why??
- コードの複雑性が下がる
- モジュールの管理度がアップ
- コードが変更しやすい
- 再利用しやすい
how??
最初にグルーピングせず、モジュールが増えてきたらボトムアップ的にパッケージの設計を始めるようにする。
⑤関心の分離
what??
モジュールを、ソフトウェアの機能や目的ごとに集めて、分離すること。
why??
- 変更が容易
- 変更時の品質が安定
- 分業で並行して作業可能
how??
モジュール作成時は、関心ごとに作成する。
モジュールが異なる前提ごとに異なる役割を果たしている場合は、役割ごとに分割する。
⑥充足性・完全性・プリミティブ性
what??
モジュールは以下の3つの要件を満たすべき。
- 充足:モジュールが表現しようとしている抽象が、それを伝えるために十分か
- 完全性:モジュールが表現しようとしている抽象画、全ての特徴を備えているか
- プリミティブ性:モジュールが表現しようとしている抽象が、全て純粋であるかどうか。
why??
- 使用者に意図を伝えるため
- 使用者が本質を把握するため
- 使用者が安心して活用するため
- 使用者が使用用途を明確に理解するため
how??
モジュール作成時に、どのような抽象を表現しているか明確にしながら作成し、余分なものは入れないようにする。
⑦ポリシーと実装の分離
what??
1つのモジュールで以下の2つについて扱わない。
- ポリシーモジュール:ソフトウェアの前提に依存し、ビジネスロジックや、その他のモジュールに対する引数の選択を行う部分
- 実装モジュール:ソフトウェアの前提に依存しない、独立したロジック部分
why??
他のソフトウェアで再利用可能な実装モジュールが、ポリシーモジュールと混ぜると再利用できなくなるため
how??
モジュール作成時、「ポリシー」と「実装」を意識して設計、別モジュールにて実装を行う。
分離不可能な場合、モジュール内で、どちらがどちらか明確にしておく。
⑧インターフェースと実装の分離
what??
モジュールは以下の2つの分離したパートで構成する。
- インターフェース:モジュールが持つ機能を定義し、モジュールの使用方法を定める部分であり、クライアントからアクセス可能
- 実装:モジュールが持つ機能を実現し値得るコード部分であり、クライアントからアクセスは不可能
why??
- 使用者がモジュールを容易に使用できるようにするため。
- クライアントへの影響を考えることなく、実装の修正を行うため。
how??
コードを設計する際は、インターフェースを用いる。
モジュール同士の呼び出しにはインターフェースが使用されるようにする。
⑨参照の一点性
what??
モジュールの要素について宣言され定義されるのは一回限りにする。
why??
- 副作用のないプログラミングを可能にするため。
- コードの可読性を上げるため
how??
変数に対して、値の再代入を行わない「単一代入」を行う
⑩分割統治
what??
そのままでは解決することの難しい問題は小さく分割する。
why??
問題を単純化し、効率性を上げるため。
how??
問題を分割してから解決する。
- ソフトウェア全体を設計するときは、独立して設計できる部分に分割してから取り組む
- モジュールを設計するときは、「責任」・「債務」の観点からモジュールを分割
- アルゴリズムを設計するときは、ボトムアップで分割してから問題解決できないか検討
- 大量なデータを処理するときは、計算を小さい単位の分割して、分散環境で並行して実行できないか検討。