【CleanArchitecture】読書メモ
CleanArchitecture 達人に学ぶ達人に学ぶソフトウェアの構造と設計の読書メモです
第1章 設計とアーキテクチャ
目的は?
- 設計とアーキテクチャの定義
- 両者に違いはない
- ソフトウェアアーキテクチャの目的は求められるシステムシステムを構築・保守するために必要な人材を最小限に抑えること
第2章 2つの価値のお話
ソフトウェアシステムにはステークホルダーに2つのことなる価値を提供する。
ソフトウェア開発者にはこの2つの価値を維持する責任がある。また、大きな価値があるのはどちらか?
振る舞い
マシンがステークホルダーのためにお金を生み出したり節約したりできるようにマシンに振る舞いを与えなければならない
構造/アーキテクチャ
- ソフトウェアは変更容易でなければならない
- 変更の難易度は形状でなくスコープに比例しなければならない
- ステークホルダーの視点からするとほとんど同じようなスコープスコープの変更を伝えているだけなのに、ソフトウェア開発者は「四角い」ペグを「丸い」穴に打ち込まなければならないような気持ちになることがよくある
- この問題はシステムアーキテクチャの問題で、アーキテクチャが特定の「形状」を選択していると、新しい機能がその構造に適さない可能性が高くなっていく。
大きな価値
- 完璧に動作するけど変更不可能なプログラム
- 動作はしないが変更が容易なプログラム
両者のうち後者の方が価値がある。変更ができるので動かし続けることができるから。前者は仕様変更が効かず、役に立たなくなる。前者のようなプログラムは存在しないかもしれないが、コストがかかりすぎて事実上変更が不可能になっているシステムは多く存在する。
第3章 パラダイムの概要
3つのパラダイム(=方法)を紹介する。
「構造化プログラミング」「オブジェクト指向プログラミング」「関数型プログラミング」
構造化プログラミング
Dijkstraは制限のないジャンプ(goto文の使用)がプログラムの構造に対して有害であることを示し、if/then/else/やdo/while/untilに置き換えた
構造化プログラミングは直接的な制御の移行に規律を課すもの
オブジェクト指向プログラミング
Ole Johan HahlとKristen Nygaardは関数はコンストラクタ、インスタンス変数、メソッドを発見したり、規律のある関数ポインタの使用によってポリモーフィズムを発見するなどした。
オブジェクト指向プログラミングは間接的な制御の移行に規律を課すもの
関数型プログラミング
関数型言語には代入文がない。実際には変数の値を変更する手段が用意た関数型言語も多いが、非常に厳しく制限されている
関数型プログラミングは、代入に規律を課すもの
考えるべきこと
上記のパラダイムの紹介の仕方は何をすべきでないかを伝えている。
それぞれのパラダイムは我々から「何かを奪っている」。
つまり3つのパラダイムは「goto文」「関数ポインタ」「代入」を奪っている。
まとめ
アーキテクチャとの関係性
アーキテクチャの境界を越えるための仕組みとして、ポリモーフィズムを使う。データの配置やアクセスに規律を課すために、関数型プログラミングを使う。モジュールのアルゴリズムの基盤として、構造化プログラミングを使う。
この3つが、アーキテクチャの「コンポーネントの分離」「データ管理」「機能」という3つもの大きな関心ご事に対応している。
Discussion