More Related Content Similar to 3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部) (20) 3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)7. LocalDate
クラス
日付を汎用的に扱う手段
Java APIのレイヤ
int year
short month
short day
LocalDateの内部
Java言語仕様のレイヤ
if( day > 31 ) …
DateOfBirth
クラス
「誕生日」に用途を限定した独自定義クラス
「ドメイン層」の一級市民(ドメインオブジェクト)
人間の発想
コンピュータの
仕組み
抽象データ型/段階的な抽象化
人間の発想に近づける
Boolean 今月が誕生月()
Days 誕生日まであと何日()
plusDays()
plusMonths()
30. 第7章 より実戦に近い練習
• 「モデル」と「実装」が育っていく過程とリズム
• 「モデル駆動」で設計するということ
– 最初に「アプリケーション層」を導入する
• 「ドメイン層」の議論を「機能」視点から隔離する
• 機能(処理)の詳細化からの設計ではない
– 入出力項目(画面帳票)の定義は登場しない
• プレゼンテーション層無しのドメイン層の設計と実装
– データモデル/テーブル設計は登場しない
• データモデルから独立したドメイン層の設計と実装
39. 「分割」ではなく「抽出」
• 長いメソッド
– 長いメソッドの「分割」ではなく
– 意味のあるコードのかたまりをメソッドに「抽出」
• 巨大なクラス
– 巨大なクラスの「分割」ではなく
– 関連性が強いインスタンス変数とロジックを発見してクラスとして「抽
出」
• クラスの多いパッケージ
– パッケージの「分割」ではなく
– 意味のあるクラスのグループを発見して「抽出」
• 「抽出」
– 意味のあるかたまりを見つける
– 名前をつける
– 独立させる
44. 「8章 ブレークスルー」を読む
• ブレークスルーの自分の経験を思い出す
– なんだ、こういうことか
– お、そうか
– 目からうろこ
• 変化のリズム
– 緩-緩-急、緩ー緩ー急、…
• 「緩」 は基本を地道に繰り返し、小さな変化を積み重ねる期間
• 「急」 は大きな変化に冷静に対処する期間
• 大きな変化の時
– 「発見の喜び」と「実験」と「実装」を冷静に制御する
– チームで納得して行動する
46. 兆候と結末
• 兆候(198ページ)
– ルールの追加や変更に対応できる程度には、良いコードになっ
ていた
– さまざまな取引ルールが明らかになるにつれ、コードの複雑さが
増し、しだいにルールの追加変更にかかる時間が増えていった
– 丸めによっておこる微妙な不整合
– これほど「苦労」するのは、基本的に設計に問題がある兆候では
ないか?
• 結末(204ページ)
– 自分たちを当惑させる予期せぬ要求変更が飛び出さなくなった
– 丸めのロジックは、(複雑だが)安定し、わかりやすくなった
– 「シェアパイ」が次期バージョンの基本コンセプトになり、製品の
営業トークにも使われるようになった
47. 第8章 まとめ
• リファクタリング(設計改善)で、コードをきれいに保つ
– それなりに、良いコードになっている手ごたえが前提
• それでも、じわじわと増大する複雑さや、変更依頼と
コードとのギャップへの気づき
– ブレークスルーの兆候
• 突然のブレークスルー
– 突破口の発見/実験/適用
• 製品コンセプトや営業活動への波及
• 新しい洞察の連鎖
– このブレークスルーでコードがきれいになったことで、隠され
ていた別のコードの複雑さが明らかになり、新たなブレーク
スルーにつながった
48. 第9章 暗黙的な概念を明示的にする
• 概念を掘り出す
– 言葉に耳を傾ける
– ぎこちなさを精査する
– 矛盾について熟考する
– 文献を読む
– 何度でも挑戦する
• それほど明確でない概念をモデル化する方法
– 明示的な制約
– ドメインオブジェクトとしてのプロセス
• 仕様(Specification)
52. ぎこちなさを精査する
• 「欠けている概念」の兆候
– 複雑な処理(長いメソッド)
– いろいろな用途に使われるクラス(巨大なクラス)
– 新しい要求がでてくるたびに、コードが複雑になる箇所
• if/else の追加
• for 内への if 文の追加
• この兆候を見つけたら
– その「複雑さ」への懸念を、「ドメインの言葉」で語ってみる
– 相手は、開発者仲間でも良いし、ドメインエキスパートへの
画面の説明でも良い
– 「ドメイン言葉」を使って、声に出すことが重要
64. その他のテクニック
• 表明
– 「制約」による意図の明確化
– ソフトウェアの安定性
– 静的な型チェック、テスト、assert 文
– @NotEmpty などの検証アノテーション
• 宣言的スタイル
– 体で覚える
– SQL, HTML, CSS, XML , …
– 関数型言語
– Java/C#など、手続き型が基本の言語では、宣言的ス
タイルを、いつも意識すること
75. 第3部 まとめ
• 深いモデル
– ドメインについての深い理解を表現したモデル
– 利用者の「主要な関心事」の「明快な表現」
– 表面的な側面を捨て去る
– 利用する人たちの要望に機敏に対応する
– 機敏に対応できないときは改善のチャンス
• 何をすべきか
– 「深いモデル」を目指した「リファクタリング」
– 「言葉」を使って「チーム」で発見/実験/改良
– 実験と成長のための「しなやかな設計」の工夫