Contenu connexe
Similaire à ドメイン駆動で開発する ラフスケッチから実装まで (20)
ドメイン駆動で開発する ラフスケッチから実装まで
- 4. 拙い設計
• コードが重複しまくっている
• 条件分岐の密林があちこちにある
• どこに何が書いてあるかわからない
• 変更した時にどこで何が起きるか推測できない
• やっていることは解読できるが、なぜ、そこでそ
の処理が必要か意味がわからない
• パッケージ名/クラス名/メソッド名/変数名/コメン
トが嘘だらけ
• でも動いてる
動いていなければ、ろくでもない設計であることは誰でもわかるのに…
4
- 36. 9つのルール
1. 一つのメソッドでインデントは一段階
2. else 句は使わない
3. すべてのプリミティブ型と文字列をラップする
4. 一行につきドットは1つまで
5. 名前を省略しない
6. すべてのエンティティを小さくする
7. 一つのクラスのインスタンス変数は2つまで
8. ファーストクラスコレクションを使う
9. getter, setter, プロパティを使わない
36
- 37. 名前をつける
1. 一つのメソッドでインデントは一段階
2. else 句は使わない
3. すべてのプリミティブ型と文字列をラップする
4. 一行につきドットは1つまで
5. 名前を省略しない
6. すべてのエンティティを小さくする
7. 一つのクラスのインスタンス変数は2つまで
8. ファーストクラスコレクションを使う
9. getter, setter, プロパティを使わない
37
パッケージ
クラス
メソッド
小さい単位で
名前をつける
- 38. データとロジックを凝集させる
1. 一つのメソッドでインデントは一段階
2. else 句は使わない
3. すべてのプリミティブ型と文字列をラップする
4. 一行につきドットは1つまで
5. 名前を省略しない
6. すべてのエンティティを小さくする
7. 一つのクラスのインスタンス変数は2つまで
8. ファーストクラスコレクションを使う
9. getter, setter, プロパティを使わない
38
値オブジェクト
ファーストクラス
コレクション
データとロジックを別の場所におかない
- 39. 複数の関心事を持たない
1. 一つのメソッドでインデントは一段階
2. else 句は使わない
3. すべてのプリミティブ型と文字列をラップする
4. 一行につきドットは1つまで
5. 名前を省略しない
6. すべてのエンティティを小さくする
7. 一つのクラスのインスタンス変数は2つまで
8. ファーストクラスコレクションを使う
9. getter, setter, プロパティを使わない
39
ルールに違反している時は、複数の関心事が混在している
- 47. プログラミング言語
• 静的な型付き言語
• 独自の型の定義
– 標準ライブラリの型(クラス)は汎用的すぎる
– 目的特化の型をどんどん作る
• 型名を明記して意図を表現する
– メソッドの返す型、メソッドの引数の型
– インスタンス変数の型
– ローカル変数の型
• 型の設計変更に強い
– リファクタリングを楽に安全に
47
- 50. 基本方針
• ドメインオブジェクトをそのまま使う
• 画面
– ドメインオブジェクトをHTMLにマッピング
– HTTPリクエストをドメインオブジェクトにマッピング
– Spring MVC/Thymeleaf
• API
– JSON<-> ドメインオブジェクトの自動マッピング
– Spring MVC RestController / Jackson
50
- 51. 簡単にマッピングできない時
• ビュークラスを間にはさむ
• 出力
– ビュークラスのコンストラクタにドメインオブジェクトを渡す
• 入力
– 入力データからビュークラスを生成する
– そのビュークラスにドメインオブジェクトのファクトリメソッド
を用意する
• ビュークラスは判断/加工/計算のロジックを持つ
– DTOではない
• 安易にビュークラスを導入しない
– ドメインの関心事の表現(ドメインオブジェクト)とインタ
フェースが不一致なのはおかしい
51
- 54. 基本方針
• 軽量の O-R マッピングを使う
ドメイン層をO-Rマッピングの仕組みで汚染しない
– myBatis
– Spring JDBCTemplate
• JPAなど重量級のツールを使う場合
– データの入れ物クラス(@Entity)は、データソース層のクラ
スとして宣言する
– データソース層で、ドメインオブジェクトと@Entityクラスを
変換する
– ドメインオブジェクトには、O-R マッピングのアノテーション
を持ち込まない
54
- 60. 値オブジェクト
• ドメイン固有のString
– PersonName, MailAddress, Telephone, …
• ドメイン固有のint/long/BigDecimal
– Money, Quantity, Rate, …
• ドメイン固有のLocalDate
– DueDate, ExpireDate, DateRange, …
データの用途を明確にする(ドメインの言葉に一致させる
扱うデータの範囲を業務に合わせて限定する
データの扱い方(メソッド)を業務に合わせて限定する
60
- 70. 区分オブジェクトの効果
• 複雑な if文記述の解消
– 区分ごとの分岐記述( if文,switch文 )は一箇所に
なる
– 場合によっては、まったく書かなくてよい
• どこに何が書いてあるかわかりやすくなる
– 区分ごとのロジックをクラス単位で表現
• 区分の追加や削除をした時の、変更の副作
用が少ない(範囲を限定しやすい)
70