Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
The Cycle Frontier をネタにドメインモデルの話をする
Search
iida-hayato
July 11, 2022
Programming
0
93
The Cycle Frontier をネタにドメインモデルの話をする
iida-hayato
July 11, 2022
Tweet
Share
More Decks by iida-hayato
See All by iida-hayato
Domain Modeling The Cycle Frontier
iidahayato
0
110
iosと絵文字問題
iidahayato
0
960
Other Decks in Programming
See All in Programming
1から理解するWeb Push
dora1998
7
1.9k
知っているようで知らない"rails new"の世界 / The World of "rails new" You Think You Know but Don't
luccafort
PRO
1
110
AI時代のUIはどこへ行く?
yusukebe
18
8.8k
AI Coding Agentのセキュリティリスク:PRの自己承認とメルカリの対策
s3h
0
200
デザイナーが Androidエンジニアに 挑戦してみた
874wokiite
0
320
開発チーム・開発組織の設計改善スキルの向上
masuda220
PRO
20
11k
Amazon RDS 向けに提供されている MCP Server と仕組みを調べてみた/jawsug-okayama-2025-aurora-mcp
takahashiikki
1
110
テストコードはもう書かない:JetBrains AI Assistantに委ねる非同期処理のテスト自動設計・生成
makun
0
260
go test -json そして testing.T.Attr / Kyoto.go #63
utgwkk
3
290
Introducing ReActionView: A new ActionView-compatible ERB Engine @ Rails World 2025, Amsterdam
marcoroth
0
680
Compose Multiplatform × AI で作る、次世代アプリ開発支援ツールの設計と実装
thagikura
0
150
Zendeskのチケットを Amazon Bedrockで 解析した
ryokosuge
3
300
Featured
See All Featured
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
112
20k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.5k
Git: the NoSQL Database
bkeepers
PRO
431
66k
Building Applications with DynamoDB
mza
96
6.6k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Fireside Chat
paigeccino
39
3.6k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
13k
We Have a Design System, Now What?
morganepeng
53
7.8k
It's Worth the Effort
3n
187
28k
Testing 201, or: Great Expectations
jmmastey
45
7.7k
Practical Orchestrator
shlominoach
190
11k
Transcript
The Cycle Frontier をネタに ドメインモデルの話をする
The Cycle Frontier という超面白いゲームがリリースされまし た - 基本無料のFPS - タルコフをカジュアルにしたようなゲームといえば分かる人はわかる
The Cycle Frontierの説明 - 宇宙ステーションと惑星上を行き来しながらタスクをすすめるゲーム - 宇宙ステーションでやること - 武器や消耗品の売買 -
装備を整えて地表に降り立つ - 地表でやること - 探索してアイテムを漁ったり - 他のプレイヤーと戦ったり - 脱出船を呼んで無事宇宙ステーションに帰ることが目的
多数のバグを見てきたので紹介しつつどう改善すればいいか 考えよう - アルファテストから参加していろいろバグを見てきた - ドメインモデルの例としてちょうど良さそうなので紹介
倉庫溢れバグ - 持ち帰ったり購入したアイテムを入れておくための倉庫(Stash)と地表に持っていく ためのカバン(Bag)がある - 同種のアイテムはアイテムごとに決められた数までまとめて1スタックとして数える - 回復薬は5個 - 鉱石は10個
- 倉庫には上限のスタックがある - マイクラのインベントリと同じと思って OK
倉庫溢れバグ:ログインボーナス - ログイン時にアイテムを1個もらえることがある - 倉庫が満杯のときにも受け取りに成功する - 倉庫が上限を突破する
倉庫溢れバグ:サプライボックス - 24時間ごとに4~8個のアイテムを受け取れる機能 - 倉庫が満杯のときに受け取ろうとすると倉庫がいっぱいで受け取りに失敗する - 倉庫を4つ空きスタック作って受け取る - アイテムがいくつで合っても受け取りに成功する -
倉庫が上限を突破する
倉庫溢れバグ:買い物 - 買い物で手に入ったアイテムは倉庫へ入る - 仮に倉庫の空きが1スタックある状態で - 回復薬(最大5個までスタック)を5個購入する - 倉庫の上限で購入に失敗する -
回復薬を1個を5回にわけて購入する - 購入に成功する
倉庫溢れバグ:買い物 - 再現方法不明 - アイテムを上限を超えていくらでも買える状態になることがある - 一度上限突破するといくらでも買える???
バグらないパターン - カバンと倉庫の間のアイテム移動をするときは適切に動作しているように見える
なんでこんなことになってるか想像する - バグの挙動に全然一貫性がない - それぞれの処理が全く共通化されずに個別の実装になっていそう - 多分ユニットテストもない
どう改善するか - それぞれのロジック(買い物とかログインボーナスとか)のバグを個別の問題と捉え てしっかりテストを書いて直しましょう - という考えもありだが - もうちょっと一貫性があって保守しやすい形にしたい - 今後もログボのような処理
,や買い物のような処理など増える可能性がある
オブジェクト指向的な解決 - 倉庫クラスみたいなものを作って - 倉庫が満たすべき制約は倉庫にチェックさせる - 制約がダメだったなら失敗で返す - 買い物やログボの処理の中では倉庫にアイテムを追加するコードだけを書く -
`倉庫.アイテム追加(回復薬5個)` みたいな - それぞれの処理では倉庫が満たすべき条件は知らないようにする
オブジェクト指向的な解決 - とすることで - 倉庫の仕様についてのバグは倉庫クラスのバグと切り分けができる - 今後新たな買い物ロジックが増えたとしても倉庫の挙動は守られる - といったメリットが期待できる
オブジェクト指向的な解決 - この倉庫クラスのようなものを「ドメインモデル」 - 買い物やログボの処理を配置するやつらを「UseCase」や「アプリケーションサービ ス」 - ドメインを利用するというニュアンスで「ドメインモデルのクライアント」と書かれてることもある - と呼びます
オブジェクト指向的な解決 - 逆に当初のように,ドメインモデルを用意せず - 倉庫の制約管理を各買い物ロジック,ログボロジックにそれぞれつらつら書いている コードを - 「トランザクションスクリプト」と呼びます - この場合「倉庫」はおそらく単なる配列か
HashMap
Topic - コードの寿命 - 倉庫がどんな仕様であるか(ドメインモデル),とどういうときに倉庫にアイテムを追加 するか(UseCase)では前者のほうが仕様の寿命が長いことを期待できる
Topic - 問い合わせるな命令せよ - UseCaseからは倉庫がどういう状態であるかは関知しない - とりあえずアイテムを追加してみて成功するか失敗するかを見る - 逆にUseCaseが「倉庫にアイテムがいくつ入ってるかな?」みたいなことを気にしだ すと,倉庫クラスに入れたいロジックが漏れ出すことになる
Topic - ドメインモデル貧血症とは - 今までの話と逆に,倉庫の制約条件のロジックを全部UseCase側に持っていき,倉 庫クラスはただの配列やデータの入れ物として使う状態を考える - つまり当初の問題点を再現した状態 - ただ倉庫クラスのコードが増えただけ
- 悪いところどり状態 - ドメインモデルから重要なロジックが漏れ出た状態のためこれをドメイン貧血症と呼 ぶ
Topic - トランザクションスクリプトで十分なケース - 倉庫のドメインモデルは複数のUseCaseから利用される - 仮に倉庫を更新するケースが1つしか無いならわざわざドメインモデルを作る必要 性は少ないかもしれない - 例えばマスタ管理画面とか
境界づけられたコンテキスト - 宇宙ステーションで扱う「カバン」と惑星上で扱う「カバン」は同じものなのか問題 - 「カバンからアイテムを捨てる」という行為は惑星上でしかできない - 「カバンから倉庫へアイテムを移動する」「倉庫からカバンへアイテムを移動する」と いう行為は宇宙ステーションでしかできない - 概念が似てるものでコードの内容もほとんど一緒だけど実は偶然コードが一緒に
なってるだけなのでは - しかし両方「カバン」と呼ばれている - コードだけ見てもどこで分割するものか判断できない
境界づけられたコンテキスト - 仕様全体を分析してコンテキストで分割する - 例えば宇宙ステーション ,惑星上でわける - これを「境界づけられたコンテキスト」と呼ぶ - それぞれの境界づけられたコンテキストの中に方言のようにモノの名前をつける
- 宇宙ステーションのなかでのカバンと惑星上でのカバンという言い方ができる - それぞれの中では「カバン」と呼んで良い - この方言を「ユビキタス言語」という - もちろん仕様を分析した結果このようになったという前提 - 境界づけられたコンテキストに沿ってコードをいい感じに分割したうえでユビキタス 言語を使ってコードを書きましょう - とすることで前述の問題を解決できる - コードどころかサービスごと分割してしまおうというのがマイクロサービスの考え
境界づけられたコンテキスト - 境界づけられたコンテキストに沿ってコードをいい感じに分割したうえでユビキタス 言語を使ってコードを書きましょう - とすることで前述の問題を解決しつつ問題空間を小さくするのが DDDのやりたいことの一つ - コードどころかサービスごと分割してしまおうというのがマイクロサービスの考え方 -
Cycleも宇宙ステーションと惑星上でインスタンスが別っぽい - レイテンシなどのアーキテクチャ特性が全然違う - 実際に境界づけられたコンテキストの間でマイクロサービスとしてわけるかどうかはアーキテクチャ 特性やアーキテクチャ量子次第
終わりに - 他にもDDDの話題を見いだせそうな気がするのでもうちょっとこすって資料を増や したい - Webシステムの話なのかUnrealEngineの話なのかに影響するところは取り除いた - ここからドメインモデルをどう永続化するか,どうユーザーインターフェースに反映さ せるかはまた一大トピック -
The Cycle Frontier 面白いのでみんなもやろう