2020/05/30
2020/5/29に会社の勉強会で発表した内容をブログとしてまとめなおす。
最近ちゃんと勉強しようと思ってnrslibさんのドメイン駆動設計入門を読み始めた
2月に参加したObject Oriented ConferenceでDDDに興味を持ち始めた
2020年5月29日時点の知識でドメイン駆動について会社の勉強会で発表した内容をブログとしてまとめる
松岡さんのブログよりDomainlanguage.comの引用
ドメイン駆動設計の定義についてEric Evansはなんと言っているのか[DDD] - little hands' lab
よくわからんけど領域が近そう🤔
勤怠システムのドメイン(領域)にはこのような概念がある
テックタッチだと
ソフトウェアの目的は問題の解決
ドメイン駆動設計 = ドメインの知識に焦点を当てる設計手法
(なんでドメインって言うんだろうね…)
ドメイン駆動設計では、ドメインの概念・ドメインモデル・ドメインオブジェクトを行き来しながらドメインの理解・ドメインの実装を繰り返す
戦略:戦いに勝つために兵力を総合的・効果的に運用する方法で、大局的・長期的な視点で策定する計画手段
戦術:戦いに勝つための戦地での兵士の動かし方など、実行上の方策
戦略:ドメインを理解し、それをモデルに落とし込む
戦術:具体的な実装パターン
ステークホルダー間で認識の齟齬や翻訳にコストをかけないために共通言語を使う
ユビキタス=いつでもどこにでも存在する
IoTのことユビキタスコンピューティングって呼んでる時代あったよね
ドメインエキスパート「ユーザを登録する」
開発者「ユーザを新規保存する」
ドメインエキスパートの言葉をそのまま使うということではない。
システムにもドメインにも寄り添ってユビキタス言語を作っていく
一般的な昔ながらの方法
最近はRDRA2.0という手法が流行っているみたい
class FullName { constructor(fistName: string, lastName: string) { this.firstName = firstName this.lastName = lastName } equals(fullName: FullName) { return this.firstName === fullName.firstName && this.lastName === fullName.lastName } }
class User { id: string fullName: FullName constructor(fullName: FullName) { this.id = createId() this.fullName = fullName } changeName(fullName: FullName) { this.fullName = fullName // return new User(fullName) } equals(user: User) { return this.id === user.id } }
class UserRepository implements IUserRepository{ find(name: string) { // SELECT * FROM USERS WHERE name.... } save(user: User) {} delete(user: User) {} }
なぜドメイン駆動でリポジトリが出てくる?
ドメインオブジェクトを協調させてユースケースを実現する
サービスは状態を持たない
例
class UserService { repository: IUserRepository constructor(repository: IUserRepository) { this.repository = repository } register(name: string) { // ユーザ名の制約に引っかかると例外を投げる const user = new User(name) if (await this.repository.find(name)) { throw new Error('重複してます') } this.repository.save(user) } }