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
値オブジェクトでアプリケーションコードを改変しよう
Search
tkitsunai
May 21, 2020
Technology
170
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
3.9k
Other Decks in Technology
See All in Technology
2026TECHFRESH畢業分享會 - Lightning Talk - 資料也要 CI/CD? 用 Airbyte 自動化資料同步
line_developers_tw
PRO
0
1.3k
10年間のブログ発信を振り返って見えたWebアプリケーションエンジニアとしての軌跡
stefafafan
0
170
ACE-Step-1.5で見る 音楽生成AIのしくみと“破綻だけ直す”Retake機能の開発【zennfes spring 2026 登壇資料】
personabb
1
540
入門!AWS Blocks
ysuzuki
1
160
PostgreSQL 19 新機能概要 OSC Hokkaido 2026
nori_shinoda
0
160
AIのReact習熟度を測る
uhyo
2
650
AIはどのように 組織のアジリティを変えるのか?
junki
4
1k
Flow 不死:AI 時代 DevOps 的不變本質
cheng_wei_chen
2
340
Bucharest Tech Week 2026 - Guardians of the Cloud-Native Galaxy
edeandrea
PRO
0
120
手塩にかけりゃいいってもんじゃない
ming_ayami
0
610
徹底討論!ECS vs EKS!
daitak
2
710
AIチャット検索改善の3週間
kworkdev
PRO
2
140
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
BBQ
matthewcrist
89
10k
Color Theory Basics | Prateek | Gurzu
gurzu
0
370
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Optimizing for Happiness
mojombo
378
71k
Context Engineering - Making Every Token Count
addyosmani
9
970
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.4k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.6k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
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」章のコラムをぜひご参照ください
まとめ ・値オブジェクトを知る - 「特徴・特性」を満たしてはじめて値オブジェクトと言える ・値オブジェクトが生み出す価値 - 表現力(説明力を含む)をあげる - 矛盾なきコードをつくる -
許容値のコントロールをする ・値オブジェクト警察 - プリミティブな値を使わない - 適切な名前か(値オブジェクトの条件「説明」ができるか) - これは値オブジェクトか否かを見極める
おわり