ドメイン駆動設計と サーバサイドと私

44
ドドドドドドドドド ドドドドドドドド ドドドド CyberZ ドドドド ドドドドドドド (2016/04/20)

Upload: noriaki-kadota

Post on 20-Mar-2017

1.172 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: ドメイン駆動設計と サーバサイドと私

ドメイン駆動設計とサーバサイドと私

株式会社 CyberZ 門田矩明新卒向け勉強会 (2016/04/20)

Page 2: ドメイン駆動設計と サーバサイドと私

自己紹介

・門田 矩明 ( かどた のりあき )・株式会社 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

Page 3: ドメイン駆動設計と サーバサイドと私

私がサーバサイドで一貫して使用しているもの

Page 4: ドメイン駆動設計と サーバサイドと私

ドメイン駆動設計Domain Driven Design

Page 5: ドメイン駆動設計と サーバサイドと私

[ 今日のゴール ]ドメイン駆動設計に興味をもってもらう

Page 6: ドメイン駆動設計と サーバサイドと私

Q. ドメイン駆動設計ってなに?

Page 7: ドメイン駆動設計と サーバサイドと私

Q. ドメイン駆動設計ってなに?A. ドメインモデルを中心においた

ソフトウェアの設計 / 実装手法

Page 8: ドメイン駆動設計と サーバサイドと私

Q. ドメインモデルってなに?

Page 9: ドメイン駆動設計と サーバサイドと私

Q. ドメインモデルってなに?A. ドメイン ( 特定のビジネス領域 )

における知識をモデル化したもの

Page 10: ドメイン駆動設計と サーバサイドと私

Q. ドメインモデルってなに?別解A. オブジェクト指向に則って切り出

した、属性と振る舞いを持つオブジェクト

Page 11: ドメイン駆動設計と サーバサイドと私

Q. どれがドメインモデル?

Page 12: ドメイン駆動設計と サーバサイドと私

Q. どれがドメインモデル?A. RPG だと、プレイヤー、モンスター、アイテム、装備 ( 状態 ) 、呪

文、フィールド

Page 13: ドメイン駆動設計と サーバサイドと私

Q. どれがドメインモデル?別解A. 出会い系だと、ユーザ、仮想通貨、メッセージ、残高、入出金、ブ

ロック、身分証明

Page 14: ドメイン駆動設計と サーバサイドと私

少し戻って

Page 15: ドメイン駆動設計と サーバサイドと私

Q. ドメインモデルってなに?A. ドメイン ( 特定のビジネス領域 )

における知識をモデル化したもの

Page 16: ドメイン駆動設計と サーバサイドと私

ドメインモデルは、技術的な内容に特化していないため

非エンジニアを含む全関係者で共通言語として使用出来る

Page 17: ドメイン駆動設計と サーバサイドと私

共通言語が無いとコミュニケーションミス

知識の分散化設計と実装の乖離

Page 18: ドメイン駆動設計と サーバサイドと私

共通言語は大事

Page 19: ドメイン駆動設計と サーバサイドと私

ここまでは設計の話

Page 20: ドメイン駆動設計と サーバサイドと私

ここからは実装の話

Page 21: ドメイン駆動設計と サーバサイドと私

ドメイン駆動設計においての実装

Page 22: ドメイン駆動設計と サーバサイドと私

アーキテクチャ

Page 23: ドメイン駆動設計と サーバサイドと私

DDD におけるレイヤーアーキテクチャ

ドメインモデルを UI や永続化といったロジックから分離し、ドメインロジックのみを純粋に表現できる状態に保つことが目的

ユーザインターフェース層 ユーザに対して情報を表示し、ユーザの命令を解釈

アプリケーション層 ドメインモデルを組み合わせ協調させるための処理を行う薄いレイヤ。ビジネスロジックを含まない。

ドメイン層 ドメインモデルなど、ドメインについての情報を含むレイヤ。

インフラストラクチャ層 ドメインモデルの永続化を担当。 DB とかKVS とかを抽象的に表現。

Page 24: ドメイン駆動設計と サーバサイドと私

ただ、レイヤードはもう古い

Page 25: ドメイン駆動設計と サーバサイドと私

最新DDDアーキテクチャとAkkaでの実装ヒントについて

by じゅんいち☆かとう

Page 27: ドメイン駆動設計と サーバサイドと私

モデルの種類+ α

Page 28: ドメイン駆動設計と サーバサイドと私

DDD におけるモデル+ αエンティティ 永続化するもの。 ID などでユニークに管理。

バリューオブジェクト (VO) 永続化しないもの。一過性である場合が多く、 ID などで管理されない。

サービス エンティティでもバリューオブジェクトでも表現できないロジックの集約先

リポジトリ 永続化へのインターフェースを提供する。エンティティに対する永続化インターフェースのため、永続方法は問わない。

Page 29: ドメイン駆動設計と サーバサイドと私

アグリゲート、ファクトリ、モジュール、他にも色々

Page 30: ドメイン駆動設計と サーバサイドと私

ドメインモデル貧血症

Page 31: ドメイン駆動設計と サーバサイドと私

ドメインモデル貧血症とは全てのドメインロジックが、

本来あるべきドメインモデルから外に漏れでてしまっている状態

Page 32: ドメイン駆動設計と サーバサイドと私

ドメインモデル貧血症とは ( 別解エンティティには属性しかなく、肝心のドメインロジックは全て

サービスなどに手続き的に記述されている状態

Page 33: ドメイン駆動設計と サーバサイドと私

ドメインモデル貧血症が起こす弊害[ ゴッドクラス ]

大量のメソッドを保有する万能クラス。 IDE が死ぬ

[ ゴッドメソッド ]大量の引数を持ち、指定されるデータのパターンによって振る舞いがかわる万能メソッド。改修時に死ぬ

Page 34: ドメイン駆動設計と サーバサイドと私

ドメインモデル貧血症はソフトウェア開発でよく見る光景変更があった際に影響が出やすい

Page 35: ドメイン駆動設計と サーバサイドと私

ドメイン駆動設計ではドメインモデル貧血症を防ぎ

ドメインモデルを設計と同じ状態でコード上でも表現することを目的と

している

Page 36: ドメイン駆動設計と サーバサイドと私

共通言語で統一知識をモデルに集約

設計と実装を同じ状態で表現

Page 37: ドメイン駆動設計と サーバサイドと私

共通言語で統一知識をモデルに集約

設計と実装を同じ状態で表現ビジネスに変更があった場合に強い

Page 38: ドメイン駆動設計と サーバサイドと私

最初に戻って

Page 39: ドメイン駆動設計と サーバサイドと私

Q. ドメイン駆動設計ってなに?A. ドメインモデルを中心においた

ソフトウェアの設計 / 実装手法

Page 40: ドメイン駆動設計と サーバサイドと私

Q. ドメイン駆動設計を採用する理由

Page 41: ドメイン駆動設計と サーバサイドと私

Q. ドメイン駆動設計を採用する理由

A. ビジネスの変化にも耐えられるソフトウェア構造を表現できるから

Page 42: ドメイン駆動設計と サーバサイドと私

[ 今日のゴール ]ドメイン駆動設計に興味をもってもらう

Page 43: ドメイン駆動設計と サーバサイドと私

興味出た人は、DDD で検索すると良いです

Page 44: ドメイン駆動設計と サーバサイドと私