IDDD本から理解するドメイン駆動設計

DDDへの誘い

こばちき

話し手

こばちき / @prac1967

プログラマ

趣味

歴史、ドライブ

生業

Kubernetesも身近に

DDD = ドメイン駆動設計

「実践ドメイン駆動設計」から学ぶDDDの実装入門

IDDD = 実践ドメイン駆動設計

DDDとは

顧客と開発者が業務を戦略的に理解し、

共通の言葉を使いながら

システムを発展させる手法

課題とDDDでの解決方法

一つの大きなシステムのため機能が肥大化する

ドメインとコンテキストを適切に分割することで業務ごとに機能を分離する

課題とDDDでの解決方法

一つの大きなシステムのため永続化層が肥大化する

ドメインとコンテキストを適切に分割することで永続化ストレージを適切に分離する(RDB/NoSQL/Queue等)

課題とDDDでの解決方法

顧客の話し言葉と開発者の話す言葉が違い実装内容にズレが発生する

顧客と開発者で共通の言葉「ユビキタス言語」で会話したとおりに実装する

課題とDDDでの解決方法

処理主体のトランザクションスクリプトでは変更箇所が見極められず、変化に弱い

業務を抽象化したドメインモデルを用いた開発で変化に強い

DDD注目の一因

クラウド環境の普及により、マイクロサービスや非同期処理を簡単に構築できるようになった

アジャイルが普及した

高品質のソフトウェアを設計する手法

バグのない

ビジネス的に成功していること

役割における不満と要望

若手開発者

全体が理解できず単調な詰め替えコードを

書く仕事がつまらない

クリエイティブで面白い開発をしたい

中堅開発者

暫定対応ばかりで疲弊している

適切なソフトウェア開発をしたい

ベテラン開発者

ビジネス的な価値を発揮できていない

開発者とビジネス側との距離を縮めたい。

事業価値を出したい。

ドメインエキスパート

開発者と会話が噛み合わない。

ソフトウェアが思ったとおり動かない。

開発者とスムーズな会話をして

良いソフトウェアを作りたい。

マネージャ

開発者は熱心に技術を学んでいるが

結果が出ていない

開発者が業務知識を得て

ドメインエキスパートと協力して

結果を出してほしい。

DDDを導入するメリット

顧客が開発するようにソフトウェアを構築できる

チームで理想像を検討できる

実装時の課題に設計時に気づくことができる

One Teamで設計と実装を一つの

ソフトウェアとして構築できる

顧客

従来

開発者

翻訳

共通言語

DDD

開発者視点

顧客視点

ビジネス的な価値

事業価値

開発費用

無駄なコスト

事業投資

DDD導入理由

技術的な解決方法が提示されている

対象領域の「複雑さ」

「ドメインモデル」を用いて対処

DDD

ドメインモデル

業務をオブジェクトの振る舞いとして表現

UIのリクエストに依存した設計ではなくなる

ビジネスロジックが一元管理される

トランザクションスクリプト

ドメインモデル

年次処理

有給付与処理 {

  if (従業員区分 == 正社員) {

    // 正社員の処理

  } else {

    // アルバイトの処理

  }

}

月次処理

給与計算処理 {

  if (従業員区分 == 正社員) {

    // 正社員の処理

  } else {

    // アルバイトの処理

  }

}

従業員クラス

有給を付与する()

給与計算をする()

正社員クラス

有給を付与する()

給与計算をする()

アルバイトクラス

有給を付与する()

給与計算をする()

契約社員クラス

有給を付与する()

給与計算をする()

ユビキタス言語

チーム全体で作り上げる特別な共有言語

一種のDSL(ドメイン固有言語)

ユビキタス言語の見つけ方

プロジェクト開始時

用語に名称とアクションを記載

「用語集」を作成

既存文書から重要な用語やフレーズを取り出す

その後のステップ

ユビキタス言語をそのままソースコードに反映

図や用語集はそのうち使用しなくなる

顧客

+ 姓

+ 名

顧客

- 姓

- 名

+ 姓名を変える(姓、名)

導入に向けた周りの説得方法

ビジネス的価値

有益なモデル(コード)が作成できる

事業と業務を正しく理解し、定義できる

ドメインエキスパートがソフトウェアを設計できる

よりよいUXを提供できる

技術的価値

モデル間の境界を明確に定義

エンタープライズアーキテクチャを整理

アジャイルでイテレーティブな

モデリングを継続的に行える

新しいツールを使える

戦略: ユビキタス言語    戦術: エンティティ

導入に向けた周りの説得方法

阻害要因

増える作業時間

産みの苦しみと割り切る

阻害要因

多忙なドメインエキスパート

あの手この手で興味を引く

阻害要因

抵抗勢力

理解してもらう

コアドメイン

ドメインモデリングの導入体制

重要な「汎用ドメイン」

重要ではない「支援サブドメイン」

状況に応じて

ドメインで必要とされるモデルについて、チーム全体で検討

どのように使用するかについて、チーム全体で考える

開発者は、テストコードを書く

開発者は、ドメインモデルのコーディングを行う

開発者は、リファクタリングを行う

ドメインエキスパートは認識が正しいか確認する

DDD3原則

コアドメインに集中すること

創造的な共同作業を通じて

モデルを探求すること

明示的な境界付けられたコンテキストの

内部でユビキタス言語を語ること

まとめ

DDDとは顧客と開発者が業務を戦略的に理解し共通の言葉を使いながらシステムを発展させる手法

高品質のソフトウェアを設計する手法

One Teamでソフトウェアを構築できる

開発費用を事業投資として受け入れられる

対象領域が持つ複雑さを分割して解決していく

まとめ

導入に向けた説得方法や阻害要因への

対処法などもまとめられている。

キーマンと対話を行い、対策案を通して

DDD導入への理解をしてもらう。

優先順位が高いドメインに注力する。

モデルの使われ方をドメインエキスパート

とともに設計時点から検証できる

Fin

IDDD本から理解するドメイン駆動設計 DDDへの誘い

By masapon

IDDD本から理解するドメイン駆動設計 DDDへの誘い

  • 336