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
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
180
hbstudy#82 SRE大全 ソフトウェアエンジニアリングによるToil削減
tkitsunai
0
2.8k
Software Development in UZABASE SRE
tkitsunai
0
4k
Other Decks in Technology
See All in Technology
演劇と私とスクラム
chinmo
0
160
AIで選択肢が広がった組織設計の理想と現実
konifar
14
5.9k
VLA-JEPA: Enhancing Vision-Language-Action Models with Latent World Models
takmin
0
330
アカウント統制の健康診断
kenichinakamura
1
200
撮るだけでは終わらない。ソニーが挑むB2Bカメラソリューション開発
sony
0
110
(swiftc) NonCopyableとライフタイム修飾子
teamhimeh
0
130
AI時代、つくる力を自分たちの手に。 ──電通×KAG、アジャイルとAI駆動開発で挑む開発の変革
yuukiyo
3
390
バフェットコード開発チームの心得(v1.1)
shoe116
0
110
正解のない研修に放り出されて / Being thrown into a training program with no right answers
ohnoeight
1
150
AI時代のGraphQL
joere
3
410
書き手が人でもAIでも正しくなる道、SREを埋め込んだDeveloper Platform / tech drivers day8
chmikata
4
770
Filter What the LLM Reads: RAG Governance with AgentCore Gateway
yakumo
0
110
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
610
Color Theory Basics | Prateek | Gurzu
gurzu
1
500
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
740
Joys of Absence: A Defence of Solitary Play
codingconduct
1
550
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
Building Adaptive Systems
keathley
44
3.3k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
950
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
300
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」章のコラムをぜひご参照ください
まとめ ・値オブジェクトを知る - 「特徴・特性」を満たしてはじめて値オブジェクトと言える ・値オブジェクトが生み出す価値 - 表現力(説明力を含む)をあげる - 矛盾なきコードをつくる -
許容値のコントロールをする ・値オブジェクト警察 - プリミティブな値を使わない - 適切な名前か(値オブジェクトの条件「説明」ができるか) - これは値オブジェクトか否かを見極める
おわり