ドメイン駆動設計と サーバサイドと私
TRANSCRIPT
ドメイン駆動設計とサーバサイドと私
株式会社 CyberZ 門田矩明新卒向け勉強会 (2016/04/20)
自己紹介
・門田 矩明 ( かどた のりあき )・株式会社 CyberZ F.O.X プロダクトマネージャ・ Java エンジニア。個人的にフレームワークは Spring Boot 推し
・前職では、 EC サイト開発や FX 取引システム開発など
・ 2012 年 サイバーエージェント 中途入社 [Ameba] 出会い系アプリ → Teen 女子 SNS アプリ → Teen 女子ブログサービス (CANDY by Ameba) [CyberZ] F.O.X 広告効果計測システム開発リーダー → F.O.X プロダクトマネージャ now
私がサーバサイドで一貫して使用しているもの
ドメイン駆動設計Domain Driven Design
[ 今日のゴール ]ドメイン駆動設計に興味をもってもらう
Q. ドメイン駆動設計ってなに?
Q. ドメイン駆動設計ってなに?A. ドメインモデルを中心においた
ソフトウェアの設計 / 実装手法
Q. ドメインモデルってなに?
Q. ドメインモデルってなに?A. ドメイン ( 特定のビジネス領域 )
における知識をモデル化したもの
Q. ドメインモデルってなに?別解A. オブジェクト指向に則って切り出
した、属性と振る舞いを持つオブジェクト
Q. どれがドメインモデル?
Q. どれがドメインモデル?A. RPG だと、プレイヤー、モンスター、アイテム、装備 ( 状態 ) 、呪
文、フィールド
Q. どれがドメインモデル?別解A. 出会い系だと、ユーザ、仮想通貨、メッセージ、残高、入出金、ブ
ロック、身分証明
少し戻って
Q. ドメインモデルってなに?A. ドメイン ( 特定のビジネス領域 )
における知識をモデル化したもの
ドメインモデルは、技術的な内容に特化していないため
非エンジニアを含む全関係者で共通言語として使用出来る
共通言語が無いとコミュニケーションミス
知識の分散化設計と実装の乖離
共通言語は大事
ここまでは設計の話
ここからは実装の話
ドメイン駆動設計においての実装
アーキテクチャ
DDD におけるレイヤーアーキテクチャ
ドメインモデルを UI や永続化といったロジックから分離し、ドメインロジックのみを純粋に表現できる状態に保つことが目的
ユーザインターフェース層 ユーザに対して情報を表示し、ユーザの命令を解釈
アプリケーション層 ドメインモデルを組み合わせ協調させるための処理を行う薄いレイヤ。ビジネスロジックを含まない。
ドメイン層 ドメインモデルなど、ドメインについての情報を含むレイヤ。
インフラストラクチャ層 ドメインモデルの永続化を担当。 DB とかKVS とかを抽象的に表現。
ただ、レイヤードはもう古い
最新DDDアーキテクチャとAkkaでの実装ヒントについて
by じゅんいち☆かとう
DDD + Clean Architecture + UCDOM Full版by Yoshitaka Okuda
モデルの種類+ α
DDD におけるモデル+ αエンティティ 永続化するもの。 ID などでユニークに管理。
バリューオブジェクト (VO) 永続化しないもの。一過性である場合が多く、 ID などで管理されない。
サービス エンティティでもバリューオブジェクトでも表現できないロジックの集約先
リポジトリ 永続化へのインターフェースを提供する。エンティティに対する永続化インターフェースのため、永続方法は問わない。
アグリゲート、ファクトリ、モジュール、他にも色々
ドメインモデル貧血症
ドメインモデル貧血症とは全てのドメインロジックが、
本来あるべきドメインモデルから外に漏れでてしまっている状態
ドメインモデル貧血症とは ( 別解エンティティには属性しかなく、肝心のドメインロジックは全て
サービスなどに手続き的に記述されている状態
ドメインモデル貧血症が起こす弊害[ ゴッドクラス ]
大量のメソッドを保有する万能クラス。 IDE が死ぬ
[ ゴッドメソッド ]大量の引数を持ち、指定されるデータのパターンによって振る舞いがかわる万能メソッド。改修時に死ぬ
ドメインモデル貧血症はソフトウェア開発でよく見る光景変更があった際に影響が出やすい
ドメイン駆動設計ではドメインモデル貧血症を防ぎ
ドメインモデルを設計と同じ状態でコード上でも表現することを目的と
している
共通言語で統一知識をモデルに集約
設計と実装を同じ状態で表現
共通言語で統一知識をモデルに集約
設計と実装を同じ状態で表現ビジネスに変更があった場合に強い
最初に戻って
Q. ドメイン駆動設計ってなに?A. ドメインモデルを中心においた
ソフトウェアの設計 / 実装手法
Q. ドメイン駆動設計を採用する理由
Q. ドメイン駆動設計を採用する理由
A. ビジネスの変化にも耐えられるソフトウェア構造を表現できるから
[ 今日のゴール ]ドメイン駆動設計に興味をもってもらう
興味出た人は、DDD で検索すると良いです