目標
・ふわっとした理解のDDDについてエヴァンス本を通して体系的に学習する
・各章の要約をアウトプットすることで知識を定着させる
前回の記事
第9章の内容は以下でまとめています。
【第10章】しなやかな設計
・しなやかな設計
過去に作成したレガシーによって押しつぶされないようにし、開発の進行に合わせて
プロジェクトを加速させ、楽しく仕事ができる変更を呼び込む設計
ソフトフェアをそのように設計する公式はないが、筆者の経験上うまく適合できるパターンをいかに示していく。
意図の明白なインターフェース
クラス操作には、その効果と目的を記述する名前(ユビキタス言語推奨)をつけ、実行手段には言及しない
そうすることで開発者は内部構造を理解しなくても意味を推測し使用することができる。
副作用のない関数
プログラムのロジックのうち、できる限り多くの部分を関数におき、非常に単純な操作にする。
・副作用
システムの状態に対するあらゆる変化のうちで将来の操作に影響するもの
例)操作が他の操作を呼び、さらに別の操作を読んでいるような深くネストして
結果が予想しにくいような複雑な処理等。
・関数
目に見える副作用なしに結果を戻す操作
表明
操作の事後条件と、クラス及び集約の不変条件を宣言すること。
・事後条件
操作の副作用でメソッドを呼び出すことで保証される結果を記述する。
・事前条件
事後条件が成り立つことを保証するために満たされなければならない条件。
・クラスの不変条件
操作が終わった後のオブジェクトの状態に関する表明。
集約全体に対して宣言することができ、整合性に関するルールを厳密に定義する。
概念の輪郭
設計要素を凝集した単位に分解する。その際、ドメインにおける重要な分割に対する自分の直感(※)を考慮する。
※ドメインの知識を優先し、技術的思考を抑える自問自答をする。
・概念の輪郭
ドメインに関する新しく理解された概念や要求にコードが適用されていくことで概念の輪郭が表される
独立したクラス
オブジェクト指向の基本である低結合はできる限り徹底し、オブジェクトイメージから他の概念を全て取り除く。
そうすることでモジュールを理解する際の負担を軽減させることができる。
閉じた操作
戻り値の型が引数と同じにできる場合、そのように定義する。
宣言的な設計
プログラミングの1形式で属性を厳格に記述することでソフトウェアを制御する。
別の開発者が宣言を文字通り解釈することができる。
ドメイン特化言語
特定のドメインの特定のモデルに特化したプログラミング言語。(DSL:Domain Specific Language)
※javaやC#などの汎用言語とは異なる
DSLで書かれたプログラムはユビキタス言語と結びつき表現豊かな実装をすることができる。
一方、言語使用を理解しなければならず改良が難しくなるといった欠点がある。
まとめ
本章を通してリファクタリング前提の強い設計を学ぶことができた。
p278「設計の宣言的スタイル」以降では、しなやかな設計に準拠した
宣言的スタイルのパターンについてコード例を示しながら解説している(本記事では割愛)ので
時間があればそれも記事にしていこうと思う。
次は「【第11章】アナリシスパターンを適用する」について学習する。
参考になったらいいねやコメントおまちしています!!