前回のふりかえり
第9章(仕様)の主旨
- 仕様とは、エンティティや値オブジェクトの責務に合致しないビジネスルールを表すためのオブジェクト
- 以下の3つの目的の1つでも当てはまれば、仕様を利用する必要がある
- オブジェクトを検証して、何らかの要求を満たしているか、何らかの目的のための用意ができているかを調べる(検証)
- コレクションからオブジェクトを選択する(選択)
- 要求に適合するオブジェクト生成を定義する(要求に応じた構築)
→ 仕様パターンを適用することで、実装が異なっていても、一貫性のあるモデルを使用できる
第10 章 しなやかな設計
しなやかな設計とは?
- しなやかな設計とは、深いモデリングを補完するもの
→ この繰り返しでしなやかな設計を作って行く
なぜそれが必要?
- そもそも、ソフトウェアの最終的な目的はユーザーの役に立つことだが、それ以前に開発者の役に立たなければならない
- ソフトウェア設計に問題があると、リファクタリングは困難になる
→ しなやかな設計 は開発者が気軽にソフトウェアに変更を加えることが出来、開発の進行に合わせてプロジェクトを加速させられる設計
この章では、しなやかに設計するためのパターンを紹介する
意図の明白なインターフェース
オブジェクトのインターフェースを見てもクライアント開発者がその目的・効果を理解できず、実装を見なければならないのであればカプセル化の価値は失われている。
→ 意図が分かりにくければ、誤った使い方を誘発することにもなる。そうならないために、意図の明白なインターフェースを形成する必要がある。
意図の明白なインターフェースは...
- クラスと操作には効果と目的を記述する名前を付け、その手段には言及しない。
- その名前は、ユビキタス言語に従って付ける。
- ふるまいを作成する前にテストを書いて、自分がクライアント開発者の視点で考えられるようにする。
副作用のない関数
- 副作用 とは、システムの状態に対するあらゆる変化のうちで、将来の操作に影響するものを指す
全ての操作はコマンドとクエリに分けることができる
- クエリ:システムから情報を取得し、それを元に演算したりデータにアクセスしたりする操作
- コマンド:システムに何らかの変更を与える操作( ※ 副作用に当たる)
副作用のある処理を組み合わせると、開発者はその操作の結果を予想しきれない。
→ 開発者は組み合わせを制限しなければならず、ふるまいの豊かさを低く抑えることになってしまう
(コマンドによる)副作用を起こさないようにするには...
- プログラムロジックのうち、できる限り多くの処理を関数にしてしまう
- コマンドとクエリを別々の操作にして、厳密に分離する
- コマンドは分離して、ドメインの情報を戻さないようにする
- クエリは副作用を起こさないメソッドで実行する
- 既存のオブジェクトを一切変更しないようなモデルや設計を追い求める
- オブジェクトを変更する代わりに、新しい値オブジェクトを生成するよう変更する(ロジックを値オブジェクトに移す)
- オブジェクトを変更する代わりに、新しい値オブジェクトを生成するよう変更する(ロジックを値オブジェクトに移す)
- 関数:副作用を起こさずに結果を戻す操作を指す
- 関数は何度も呼び出すことがでい、毎回同じ値を返す
- ある関数から他の関数を呼び出すこともできる
- 副作用のある操作よりも、関数の方がテストが簡単
思ったこと・気になったこと
- 一つ一つが言いたいことはなんとなく理解できるが、10章で紹介されるパターン全部を組み合わせるとどんな姿になるんだろう?