SlideShare ist ein Scribd-Unternehmen logo
1 von 54
抽象的な教えを
試行錯誤しながら解釈した
DDD の実践レポート
ほげさん @大阪!
2012 04 新卒入社 ど素人
1年くらい多重度をフランス語だと思ってた(→タジュード)
社会人歴の半分くらいは php でフロントエンド、
後半の半分くらいは Java / DDD をやっている
ここ1年ちょっとはテックリードみたいなことも
ScalaMatsuri 毎年行ってます、 Haskell Day も行ってみた
よ
最近認定スクラムマスターになりました
最近はテスト系の勉強会とかに乱入したりもしています
自己紹介
設計ぽいやつ
1. DDDをHaskellで考える 業務ロジックとシステムロジック
2. 副作用ってなんだ? 〜楽に小さく単体テストをしよう〜
チーム開発ぽいやつ
3. アジャイル / スクラム / チーム開発の[不吉な匂い]まとめ
4. GitHubを中心とした開発プロセス
予想に反していいねもらえたやつ
5. Pythonのimportについてまとめる
よく Qiita に投稿してます
1. https://qiita.com/suzuki-hoge/items/82229b903655ca4b5c9b
2. https://qiita.com/suzuki-hoge/items/bad43630ad1ad723ca4a
3. https://qiita.com/suzuki-hoge/items/16af349035a497e30063
4. https://qiita.com/suzuki-hoge/items/a6e3bdc2cc1cf4e98ea1
5. https://qiita.com/suzuki-hoge/items/f951d56290617df4279e
宣伝しますw
§1 導入
〜何を言ってるのかさっぱりわからん〜
ある日「レガシーシステムの大規模リニュー
アルのために DDD チームを立ち上げるんだ
けど、そこに入ってね」と言われる
お前は性格的に大丈夫だろとか言われて教育
は1日、訓練は数日しかなかった
DDD どころか Java もやったことないよ!?
何やらレビュー時に抽象的なフレーズが飛び交ってい
る
「業務をドメインで表すんだ」
「それの振る舞いはなに?」
「ドメインではメモリ上の更新だけ」
「ドメインを育てろ」
ほげさん「ヤベェとこ来ちゃったな」
domain-driven design quickly やエヴァンス本の内容が
口伝を重ね、現場ではこう言う様になったんだろう
渋々異動してみたら…
しかし!
初学者がこんな指示でものづくり出来るはず
がない
DDD ってのが何を言いたいのか、みんなが僕
に何をさせたいのか、全くわからない
フレーズが先行してた感じが強くて、抵抗が
すごかった …フレーズ駆動開発とでも言う?
それでもコードを書いてみたんだけど、「君の
Domain 層からは業務を感じない」とかわけわ
かんないこと言われた
辛いので「何を満たせば DDD だって認めてく
れるか、さっさと具体的に教えてくれ」って思
ってた
なので、今日は似たような「DDD よくわから
ん」って人に、失敗しながらたどりついた僕
なりの具体的な解釈をお話ししたいと思いま
す
§2 単語の抽出 - 名詞を探せ?
〜ドメインに何もない〜
何から始めれば良いか全くわからん
やってみないことには進まないので、とりあ
えずみんながやってる名詞の抽出ってのをや
ってみよう
例題を用意して試してみます
アプローチ
メアドと年齢と住所とプランとス
マホ(任意)を選択して申し込む
プランは 3GB(pv001) から
20GB(pv004) までを取り扱う
(pv001 は弊社の基盤システムが要求する連携コー
ドで、企画書にもコード値が頻出する)
未成年は申し込めない
本州以外は配送に+2日必要になる
名詞を探す
メアドと年齢と住所とプランとス
マホ(任意)を選択して申し込む
プランは 3GB(pv001) から
20GB(pv004) までを取り扱う
(pv001 は弊社の基盤システムが要求する連携コー
ドで、企画書にもコード値が頻出する)
未成年は申し込めない
本州以外は配送に+2日必要になる
ピックアップ
絵にする
メアドと年齢と住所とプランとス
マホ(任意)を選択して申し込む
プランは 3GB(pv001) から
20GB(pv004) までを取り扱う
(pv001 は弊社の基盤システムが要求する連携コー
ドで、企画書にもコード値が頻出する)
未成年は申し込めない
本州以外は配送に+2日必要になる
描く
ただのデータの箱になった
箱同士に線が引けない
何をすると何が起こるのか、この絵ではさっぱりわから
ない
+2日って話はどこ行っちゃったの?
コードの大半は Application 層と Infrastructure 層に書く
ことになった(後述)
結果
「業務をドメインで表す」
→ ただのデータの箱になりましたけど…
「振る舞いを考える」
→ getter ならたくさんありますけど…
「ドメインではメモリ上の更新だけ」
→???
「ドメインを育てる」
→ ???
ここまでの理解と解釈
全然良さそうなやり方に見えない
とりあえず Domain 層がスカスカなのが悪い
んだろう
大事なものが何か考えて、ドメインに移して
みよう
次のアプローチ
§3 ドメインに集める?
〜集めすぎた〜
処理順とか条件分岐による DB 更新とか外部
システム連携が大事なもの(=ドメイン)だ
と思った
だって結合テストとかで細かく確認するのっ
てこの辺だもの
仮説
Application 層にあった条件分岐や DB 更新を移動
先ほどのドメインの周辺に存在した大量のコードを、
全部 申込ドメイン#申込()に移動した
変更
絵から読み取れない情報が多い…
実は…
線は数本あるけどあんまり情報が増えてない
リポジトリの引数が多くて雑多
テストコードのコンパイルを通すのがまず辛い
Domain 層のテストコード書くのがものすごく大変
DB のテストデータとかメーラのモックサーバとか外部システ
ムのスタブとか全部揃えないといけない
結果
「業務をドメインで表す」
→ 処理順とか永続化処理が全部集まったけど、辛い…
「振る舞いを考える」
→ 巨大な void 申込() が1つだけならありますけど…
「ドメインではメモリ上の更新だけ」
→ ???
「ドメインを育てる」
→ ???
ここまでの理解と解釈
次のアプローチ
どうやら大事なもの(= ドメイン)は処理順や更新処理じ
ゃあないみたいだ
void 申込() は変更処理をしているけど、変更結果を return
でもらえてないからテストがしづらいのではないか
そういう処理を直そう、目印は void だ、void をなくそう
return するものや処理名から見直した方が良さそうだ、処
理名なら名詞じゃあなくて動詞を探した方が良さそう
§4 単語の抽出 - 動詞を探せ!
〜void の排除も〜
メアドと年齢と住所とプランとス
マホ(任意)を選択して申し込む
プランは 3GB(pv001) から
20GB(pv004) までを取り扱う
(pv001 は弊社の基盤システムが要求する連携コー
ドで、企画書にもコード値が頻出する)
未成年は申し込めない
本州以外は配送に+2日必要になる
動詞を探す
メアドと年齢と住所とプランとス
マホ(任意)を選択して申し込む
プランは 3GB(pv001) から
20GB(pv004) までを取り扱う
(pv001 は弊社の基盤システムが要求する連携コー
ドで、企画書にもコード値が頻出する)
未成年は申し込めない
本州以外は配送に+2日必要になる
ピックアップ
void を排除したいのでインパラ→「メソッド名」→アウトパラの形にする
メアドと年齢と住所とプランとス
マホ(任意)を選択して申し込む
プランは 3GB(pv001) から
20GB(pv004) までを取り扱う
(pv001 は弊社の基盤システムが要求する連携コー
ドで、企画書にもコード値が頻出する)
未成年は申し込めない
本州以外は配送に+2日必要になる
メアドと年齢と住所とプ
ランとスマホ→「申し込
む」→???
未成年→「申し込めない
」→ ???
本州以外→「必要になる
」→ ???
まだ日本語で整理
まとめたり考えたり聞き出したりして、意地でも埋め
る
メアドと年齢と住所とプ
ランとスマホ→「申し込
む」→???
未成年→「申し込めない
」→ ???
本州以外→「必要になる
」→ ???
申込内容(メアドと年齢と住所とプラン
とスマホ)→「申し込む」→受付
内容
未成年→「申し込めない」→ 何
らかのエラー
本州以外→「必要になる」→ 配
送予定日
受付内容→「送信する」→メー
ル
情報集め
やっと絵を考える
申込内容(メアドと年齢と住所とプラン
とスマホ)→「申し込む」→受付
内容
未成年→「申し込めない」→ 何
らかのエラー
本州以外→「必要になる」→ 配
送予定日
受付内容→「送信する」→メー
ル
線があり、return している
最初と比べて随分と違う絵になった(詳細は割愛)
void を辞めるには return するクラスが必要だ、その
クラスは最初の文書にある単語とは限らないっぽい
メソッドの整理はインパラ、アウトパラの整理も必要
とするのでドメインクラス同士が関係し出す
すごいテストコード書きやすい!
しかもテスト実行早い!
結果
「業務をドメインで表す」
→ ドメインクラスが何に依存して何を算出するか、その整理のこと
、っぽい
「振る舞いを考える」
→ ドメインクラスを算出するメソッド名のこと、っぽい
「ドメインではメモリ上の更新だけ」
→ Domain 層から処理順やデータアクセスを排除して上記2つの算
出に集中しようってこと、っぽい
「ドメインを育てる」
→ 最初の文書には明記されていない単語がある、っぽい
ここまでの理解と解釈
とは言え、void じゃあないもの全てがドメイン
なわけでもないだろう
ドメインか否かの境界線があるはずだ
それに、膨大な企画書や広大な Domain 層を見
ても隠れている単語を見つけるなんて無理だろ
う
ドメインの中にも境界線があるはずだ
次のアプローチ
§5 境界を決める
〜独立して育てる〜
1. Domain 層から Application 層や
Infrastructure 層への依存を断つ
2. ドメインが知る他のドメインを減らす
3. ドメイン間に線を引く時は、変更頻度が低
い方に向けて線を引く
やったこと
1. Domain 層が知っている外の都合があったので排除し
た
仕様は変わっていないのに
頻繁に修正するクラスがあるので気がついた
クラスを分ける
ドメインからエラーメッセージを
辿れなくなった
2. 知りすぎているドメインを切断した
テストコードで用意する変数が
異様に多いので気が付いた
引数を変えて import 文を減らす
メールからプランを辿れなくなったし、
プランが増えてもメールには関係ない
3. 変わりやすい方に依存している線を逆にした
配送業者の変更が多くて頻繁に supply を
修正していたので気がついた
依存性逆転の原則の適用
( dependency inversion principle )
supply → supplier の線が
supply ← supplier の線になった
1. Domain 層から Application 層や Infrastructure 層への依存を断つ
→ ドメインが、ドメインではない都合に振り回されない
(ドメインか否かの境界線)
2. ドメインが知る他のドメインを減らす
→ ドメインがコンパクトになる
(ドメインの中の境界線)
3. ドメイン間に線を引く時は、変更頻度が低い方に向けて線を引く
→ 修正箇所のコントロールができる
(ドメインの中の境界線の越え方)
結果
やることが明確でコンパクトなドメインにな
り、考察がやりやすい
依存が少ないので、安心して変更出来る
結論
「業務をドメインで表す」
→ ドメインクラスが何に依存して何を算出するか、その整理のこと、っぽい
「振る舞いを考える」
→ ドメインクラスを算出するメソッド名のこと、っぽい
「ドメインではメモリ上の更新だけ」
→ Domain 層から処理順やデータアクセスを排除して上記2つの算出に
集中しようってこと、っぽい
「ドメインを育てる」
→ 最初の文書には明記されていない単語がある、っぽいので範囲を絞っ
ておくと考えやすいし変更しやすいってことだ
ここまでの理解と解釈
モデリングすると ER 図ができるになるってよくあると思
うんだけど、これも Domain 層 → Infrastructure 層の依存
と本質は同じだと思う
ドメインとテーブルは同じペースで育たないって考えると
理解するヒントになるかな、と思っている
例えばエディタでクラス分割のリファクタリングをしたあ
と、データ移行でテーブルの分割もセットでしない
変更する頻度や理由が違うものは、分けておくと良さそう
理解(余談:モデルと ER 図)
§6 まとめ
再掲
「業務をドメインで表す」
→ ドメインクラスが何に依存して何を算出するか、その整理のこと
「振る舞いを考える」
→ ドメインクラスを算出するメソッド名のこと
「ドメインではメモリ上の更新だけ」
→ Domain 層から処理順やデータアクセスを排除して上記2つの算
出に集中しようってこと
「ドメインを育てる」
→ 最初の文書には明記されていない単語がある、なので範囲を絞っ
ておくと考えやすいし変更しやすいってことだ
今日は全く触れられなかったけど、ユビキタ
ス言語とか、他にも大事なことは沢山ある
そういう教えをちゃんと1つずつ噛み砕いて
実践できていることが、変化に対応できると
か高速に変更出来るって事に繋がるはず
くらいで捉えちゃって良いと思ってる
〜おまけ〜
§7 東京のあと考えたこ
と
東京開催の時のパネルディスカッションで「
テストコード要らないんじゃね(概訳)」って
話があった
(超乱暴にまとめると)手続き実装や型なし言
語だとテストたくさん必要だけど、型があれば
テストは減らせる / 要らない
そう言う面もあるのは賛成
けどいろんな人が参加してる中で前提を揃え
ないで言うのは勘違いを誘発すると思う
悶々と考えてたけど、やっぱり僕は 「
書くべき派」なので、今更だけど正面からア
ンチテーゼをぶつけたい
ちょっと待って
コンパイルしたって抜けないバグは山ほどある / ドメ
インクラスがあれば無条件で型の恩恵が得られるわけ
ではない
本気で実行時例外をなくす様に考えて作ってる?
テストコードが最初のそのドメインの利用者なので、
違和感や使い辛さとかに気付くチャンス
引数多くて辛いなぁとかモックサーバがないと動かないとか、そうい
う味見を放棄している まさに学ぶ瞬間なのにもったいないよ!
リファクタリングの促進のためにも、あってほしい
理由
別にカバレッジ 100% しか認めないって言ってるわ
けではない
戦略的に減らそう、材料はたくさんあるはず
もう少し詳しく書いてみた -> 型がある言語で DDD
してたらテストはいらないの?
https://qiita.com/suzuki-
hoge/items/127836df5ba57a13c94e
§7 今後やりたいこと
〜おまけ2〜
設計時点でレイヤー毎に起きるエラーを限
定する
だって起きる理由もその後の対処も違うか
ら
特にシステムのエラーとビジネスのエラー
は絶対に分けたい
できるだけ型情報にして図示する、極力例
外を使わない、コンパイルの恩恵を大きく
する
本気で実行時例外をなくす
フィードバックサイクルを早くするために
、当然テストも書く
エラー設計をこんな感じでできないかと妄想中
今回は割愛しましたが、他にも色々迷ってる
、疑問も尽きない
けど、冒頭で疑問だった「何を満たせば DDD
か教えろ」はいつのまにかどうでも良くなっ
てた
目的は「脱レガシー」なのだから

Weitere ähnliche Inhalte

Empfohlen

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

Empfohlen (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

抽象的な教えを試行錯誤しながら解釈した DDD の実践レポート 大阪

Hinweis der Redaktion

  1. 20000 ファイルくらいの java コンポーネント群を 30 人くらいで内製開発保守してます
  2. 折角なので url をはっつけておきます、slideshare から見に行ってみてください いいねよろしくw
  3. ここから本編です 試行錯誤が始まります
  4. 今思えばそれぞれ出典はこれだろうというフレーズが…にあるんですけど、
  5. それでも文句だけ言っててもおもしろくないので…(めくり
  6. (何をやったら DDD だってことにしてくれるんですか)
  7. お題や解答例自体は本題ではないので軽く流します pv001 というのは社内のシステムに連携するコードで、弊社はほぼ全てのシステムがこの社内システムの仕組みを前提にしています なので企画書に普通に書いてあったりして、頻出するんです
  8. これ以上やれることがないので、絵を描くしかありません ドメイン層にロジックを書けと言われましたが…多少 is未成年() とかはありますね あとは大体 getValue() があるのと、配送というよくわからない四角があります
  9. なので、現時点での理解はあまり進みません ここまでの解釈は…(これ冒頭の4フレーズですけど) じゃあ次はどうしよう…
  10. (条件分岐のお話、増田さんのお話の中にもあったと思うんですけど、やっぱりここすごい複雑です、きっとみなさんも思い当たることがあると思います)
  11. この例は極端に簡素化してますけど、同じようなことを実際に1年くらいかけてやったんですけど…
  12. あと、リポジトリには手元の変数を全部そのまま渡してるだけ 実際はもっと膨大
  13. [引数] メール送るにはこれとx4…配送するにはこれとx4…. 実際は引数は5とか10にすぐなるんです
  14. まだどうもしっくりこない… 頑張ってやってみたけど、すごい辛い… こんなものが巷ですごいと言われている手法なはずがない… じゃあ次どうするか
  15. どうやらがんばって持ってきてみたけど、大事なのはこいつらじゃあない
  16. 今度は同じお題で動詞をハイライトします
  17. 名詞の時は絵を描きましたが、まだ日本語で整理します void の排除ってのもやりたいので…(上部) 見つからないなぁ 見つからないけど、
  18. 考えてみた結果、受付内容、何らかのエラー、配送予定日というものを新たに考えました それから調べている過程で「どうやらメール送信もしないといけない」と言う要件に気づいたので、4つめの動詞を足しました それから申込内容というまとめた新しいまとまりを作っちゃってます
  19. 絵は細かくなってしまったので詳細は割愛しますが、申込内容が受付内容(もしくはエラー)を return する様になってます、エラーもモデルにありますね (ちょっとこの絵は簡略化してしまっていますが、メールの本文がスマホの有無によって変わるという条件もメールに収まっています その部分はこの後いかようにでも、執拗にテスト出来ます)
  20. DB のテストデータも、モックサーバもスタブもいらない! しかもというか当然ですね
  21. この時点で自分の中では全部が一気に繋がり始めた気がします。 じゃあ“さらに”次どうするか!
  22. ここからは今までと違って失敗ではなくてやったことをお話します
  23. 指3 3つ、やりました
  24. 先ほどの動詞の抽出をして作った絵の、一部を抜粋してます 未成年は申し込めないという仕様は変わっていないのに、メッセージの都合で頻繁に変更したり… 取り扱うプランは変えてないのに、基盤しシステムの都合で頻繁に更新したりするクラスがあった ドメイン ”に” 向かって線を引いているので、ドメイン “から” エラーメッセージはわからなくなった -> エラーメッセージがどう変わろうと、ドメインには関係ない これが「ドメインか否かの境界線」です
  25. 実際にはさっき言ったように引数は5つとか10つとかあって、それぞれが更に依存していたりするとちょー大変 提供するプランが増減しても、スマホのカラバリが増えても、メールは知らんぷりをできるようになった(申込内容がきっちり頑張る必要はあるけど) これが「ドメインの中の境界線を探す」です
  26. もしかしたら聞き馴染みない方もいらっしゃるかも知れませんが、依存性逆転の原則というのを使いました 配送申込と配送業者があるとリポジトリが動かせるんですけど、配送業者が頻繁に変わるんです 物を送る要件(supply のこと)は変わってないのに supplier が変わるので supply の再テストが大変だった 細かいことは割愛させていただくんですけど、supply 側に interface を置くと箱を超える線が逆になります この原則は、なんかうまいこと出来てるんです これは「ドメインの中の境界線の越え方」の話です
  27. この3つの結果がそれぞれこうなります
  28. ちなみに、例えば簡易的な指標としてパッケージのクラス数や import 文が材料になります あるドメインクラスが(手をグー)他のドメインクラス “を” import している数と、他のドメインクラス “から” import されている数で、依存度や被依存度は大まかには把握できます
  29. 赤地の部分が差分です
  30. 〜同じだと思う こういうドメインだから、こう言うテーブルにしよう、という考えをしているから でも、ドメインとテーブルって同じペースで〜
  31. …というのが、僕の今の理解です
  32. ここまでで試行錯誤の体験をお話しするのはおしまいです 最後にちょっとだけおまけを用意してきました
  33. あった(すいません、これ実はその場にはいなくて別室で twitter で見てただけなんですけど)
  34. ちょっと待て)その時に twitter でちょろっと反論したりしてたんですけど、この場を借りて改めてちょっと待ってって言いたい
  35. 仕様の取り違え 値段・条件や商材の組み合わせ等の定義ミス 条件分岐 配列処理 メモリ操作 === ドメインクラスを作ってても貧血症で実質手続きになってるとか 逆にドメインが大きくなりすぎて複雑度が上がってるとか そういうのを本気で潰しに行ってない限り、コンパイルをしたってバグは出ます チャンスとしてバカにならない 例えば僕がさっきお話しした
  36. (時間があれば) 例えばカバレッジなんてテストコードに try-catch 書いて全部握りつぶして最後に assert true って書いたら 100% になるんですよ 材料は恩恵・不備・費用対効果(書くコストと潰せるバグ)・見込まれる変更頻度・とか
  37. (時間次第) ビジネスエラー ユーザの操作によって起こる(未成年)、発生しても処理は継続する、冪等性がある、正常な動作 システムエラー ユーザの操作は関係ない(DB 死んでる)、発生したら中断する、冪等性がない、異常な動作 コンパイルチェックに頼るってのは、本気で実行例外を潰すって意味です 例外を使わずに型を return したいのも、コンパイルの恩恵を上げテストのしやすさも上げたいから わざわざコンパイルしたのに、デプロイして動かしてみたら実行中に落ちるってださくない? これは実は5月の東京でお話しした時と状況が変わっていなくて、まだこの妄想を実務で試せていない 今ちょうど真っ新なところに設計し始めた案件があるので、そこで試そうと考えている フィードバックサイクルを小さくするためにも、当然テストコードを書く 作ったものの味見をします
  38. なんでかって言うと、