Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
値オブジェクトでアプリケーションコードを改変しよう
tkitsunai
May 21, 2020
Technology
0
71
値オブジェクトでアプリケーションコードを改変しよう
車内のミートアップの発表資料
tkitsunai
May 21, 2020
Tweet
Share
More Decks by tkitsunai
See All by tkitsunai
TDD実践を経て変わったこと
tkitsunai
6
3.2k
Go活
tkitsunai
0
81
hbstudy#82 SRE大全 ソフトウェアエンジニアリングによるToil削減
tkitsunai
0
2.1k
Software Development in UZABASE SRE
tkitsunai
0
2.6k
Other Decks in Technology
See All in Technology
SwiftUI Layout
auramagi
1
120
Strategyパターン
hankehly
0
170
Power Virtual Agentsのハジメ
miyakemito
1
150
開発組織の生産性を可視化する State of DevOpsとFour Keysとは / deep dive into State of DevOps
yfcgpsebp
0
310
220628 「Google AppSheet」タスク管理アプリをライブ作成 吉積情報伊藤さん
comucal
PRO
0
260
要約 "Add Live Text interaction to your app"
ushisantoasobu
0
150
QiitaConference2022
fuwasegu
0
220
スタートアップと技術選定と AWS
track3jyo
PRO
2
360
アーキテクチャを明文化して開発に臨んだ話
akkie76
0
360
What's new in Vision
satotakeshi
0
220
【Pythonデータ分析勉強会#33】「DearPyGuiに入門しました」の続き~Image-Processing-Node-Editor~
kazuhitotakahashi
0
190
サーバレスECにおける Step Functions の使い方 〜ステートマシン全部見せます!〜
miu_crescent
0
200
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
113
7.4k
Building Your Own Lightsaber
phodgson
94
4.6k
Typedesign – Prime Four
hannesfritz
34
1.4k
Infographics Made Easy
chrislema
233
17k
Side Projects
sachag
450
37k
GitHub's CSS Performance
jonrohan
1020
420k
Unsuck your backbone
ammeep
659
55k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
11
4.7k
A designer walks into a library…
pauljervisheath
196
16k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
7
1.1k
A Tale of Four Properties
chriscoyier
149
21k
Teambox: Starting and Learning
jrom
123
7.7k
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」章のコラムをぜひご参照ください
まとめ ・値オブジェクトを知る - 「特徴・特性」を満たしてはじめて値オブジェクトと言える ・値オブジェクトが生み出す価値 - 表現力(説明力を含む)をあげる - 矛盾なきコードをつくる -
許容値のコントロールをする ・値オブジェクト警察 - プリミティブな値を使わない - 適切な名前か(値オブジェクトの条件「説明」ができるか) - これは値オブジェクトか否かを見極める
おわり