Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
値オブジェクトでアプリケーションコードを改変しよう
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
tkitsunai
May 21, 2020
Technology
180
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
値オブジェクトでアプリケーションコードを改変しよう
車内のミートアップの発表資料
tkitsunai
May 21, 2020
More Decks by tkitsunai
See All by tkitsunai
TDD実践を経て変わったこと
tkitsunai
6
4.2k
Go活
tkitsunai
0
170
hbstudy#82 SRE大全 ソフトウェアエンジニアリングによるToil削減
tkitsunai
0
2.8k
Software Development in UZABASE SRE
tkitsunai
0
4k
Other Decks in Technology
See All in Technology
OpenClawでAzure DevOpsのWiki更新を自動化する - クラウドAIだけでは届かない場所へ
yutakaosada
0
130
顧客の成果創出とプロダクトの成長を 両立するためのFDE
sansantech
PRO
0
520
個別開発で終わらせない。 現場の課題をプロダクトの強さに変える StockmarkのFDE
ktkrhr
0
430
雪かき部 #7 もう怖くない!SELECT文!
foursue
0
220
Incremental HTTP
kazuho
4
1.5k
Harness Engineering on Rails
joelq
0
760
セルフサービスのオブザーバビリティ基盤をOpenTelemetryで作る / Building a Self-Service Observability Platform with OpenTelemetry
ymotongpoo
3
490
AI coding 整合正規方法
philipz
0
580
データ品質を壊しながらSnowflakeのAIに分析させてみた
kawanago
0
320
MCPゲートウェイを作って運用してわかったこと — Agent時代の権限管理の現在地
mtpooh
6
1.5k
【ゲームメーカーズスクランブル2026】『Shadowverse: Worlds Beyond』UIとアニメーションで実現する最高のユーザー体験を叶えるプロトタイピング
cygames
PRO
1
700
Account Factory for Terraformによる 標準化されたアカウント発行の自動化
pensuke628
0
120
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
420
WENDY [Excerpt]
tessaabrams
14
40k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
530
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
Exploring anti-patterns in Rails
aemeredith
4
520
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Everyday Curiosity
cassininazir
0
330
We Have a Design System, Now What?
morganepeng
55
8.3k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Transcript
値オブジェクトで アプリケーションコードを改変しよう Takayuki Kitsunai
自己紹介 ・橘内 孝幸( Takayuki Kitsunai ) ・SaaS Product Division (
SPEEDAの色々を開発してます ) ・Gopher
発表の目的 ・なんとなく値オブジェクトを作っていないか、考えるきっかけを作りたい ・値オブジェクトになっていないコードを見たら、一緒にうずうずしたい
値オブジェクトについて ・Domain-Driven Designの構成要素の一つ 【特徴・特性】 ・一意性を持たない ・不変である ・計測/定量化/説明ができる
値オブジェクト、使ってますか?
値オブジェクト、「ちゃんと」使えてますか?
値オブジェクトたらしめる条件、その価値 1. 値が同じであれば同一であることを保証しているか(等価性) 2. 値の範囲を限定し、許容値をコントロールする 3. 不変化により、インスタンス化後のバグ混入を防ぐ(交換性) 4. それらを扱う名前が「計測/定量化/説明」をしているか これらの条件を満たすと、
表現力豊かに、コードがモノを矛盾なく説明できるようになる
値が同じであれば同一であることを保証する type PersonName struct { value string } func NewPersonName(value
string) PersonName { return PersonName{ value: value, } } name1 := NewPersonName("tkitsunai") name2 := NewPersonName("tkitsunai") if name1 == name2 { // true } ポイント:同一インスタンスかではなく値が同じであるか
値の範囲を限定し、許容値をコントロールする type SecurityCode struct { value int } func NewSecurityCode(value
int) (SecurityCode, error) { if value < 1300 || value > 9999 { return SecurityCode{}, errors.New("証券コードの値範囲外です ") } return SecurityCode{ value:value, }, nil } 例:東京証券取引所が扱う「証券コード」 ・1300番台〜9000番台から構成される
不変化により、インスタンス化後のバグ混入を防ぐ type SecurityCode struct { value int } func NewSecurityCode(value
int) (SecurityCode, error) { if value < 1300 || value > 9999 { return SecurityCode{}, errors.New("証券コードの値範囲外です ") } return SecurityCode{ value:value, }, nil } uzabase := NewSecurityCode("3396") // このようなことはできないようにする uzabase.value = 3397 ファクトリー関数やコンストラクタで不変化する
値オブジェクト警察をしてみよう type Company struct { name string address1 string address2
string listedFlag bool securityCode int phoneNumber string } こんなコードを見かけると、うずうずしてきませんか?
値オブジェクト警察への道 フェーズ1: プリミティブな値を探そう type Company struct { name string address1
string address2 string listedFlag bool securityCode int phoneNumber string } type Company struct { name Name address1 Address address2 Address listedFlag ListedStatus securityCode SecurityCode phoneNumber PhoneNumber }
値オブジェクト警察への道 フェーズ2: 名前が適切かを考えてみよう type Company struct { name Name address1
Address address2 Address listedFlag ListedStatus securityCode SecurityCode phoneNumber PhoneNumber } // 上場企業 type ListedCompany struct { } // 非上場企業 type UnlistedCompany struct { } // 企業の名前 type CompanyName struct { } // 人の名前 type PersonName struct { }
値オブジェクト警察への道 フェーズ3: それは値オブジェクトか?を考える 先の例では、「企業」を値オブジェクトとして作りました ・システムのコンテキスト範囲「企業」の扱い方によって、エンティティ (※1)になる ・値オブジェクトの特性から外れる場合に値オブジェクトのままで良いか? ※Eric Evans「ドメイン駆動設計」の「VALUE OBJECT」章のコラムをぜひご参照ください
まとめ ・値オブジェクトを知る - 「特徴・特性」を満たしてはじめて値オブジェクトと言える ・値オブジェクトが生み出す価値 - 表現力(説明力を含む)をあげる - 矛盾なきコードをつくる -
許容値のコントロールをする ・値オブジェクト警察 - プリミティブな値を使わない - 適切な名前か(値オブジェクトの条件「説明」ができるか) - これは値オブジェクトか否かを見極める
おわり