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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
yachiy
July 30, 2019
Programming
3k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
値オブジェクトの悩みポイントとどう付き合っていくか
yachiy
July 30, 2019
More Decks by yachiy
See All by yachiy
同人プロダクトのリプレース案件における技術的負債解消への取り組み / Addressing Technical Debt in the Revamp of Doujin Products
yachiy
0
24
AWS事始め / Introduction AWS
yachiy
1
76
Springで始めるWebApplication / Start Spring Web Application
yachiy
0
140
RDRAとDDDを実践していく上でのCleanArchitectureの同異点 / RDRA and Clean Architecture differences
yachiy
0
140
Springで始める3層アーキテクチャ / start three layer architecture with spring
yachiy
0
110
議事録のとり方 / how to write proceeding
yachiy
0
170
Other Decks in Programming
See All in Programming
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
340
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
210
Built Our Own Background Agent at LayerX
layerx
PRO
9
5k
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
140
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.6k
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.8k
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
150
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
190
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
220
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
730
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
180
Featured
See All Featured
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
230
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Automating Front-end Workflow
addyosmani
1370
210k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
460
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
We Are The Robots
honzajavorek
0
290
Balancing Empowerment & Direction
lara
6
1.2k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
Embracing the Ebb and Flow
colly
88
5.1k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
430
[SF Ruby Conf 2025] Rails X
palkan
2
1.3k
30 Presentation Tips
portentint
PRO
1
360
Transcript
ΦϒδΣΫτͷΈϙΠϯτͱ Ͳ͏͖߹͍͔ͬͯ͘ !ZBDIJZ@
!ZBDIJZ@ IUUQTZBDIJZIBUFOBCMPHDPN ࠓճͷࢿྉࡌ͖ͤΕͳ͔ͬͨ ΈϙΠϯτͪ͜ΒͰڞ༗͠·͢ʂ
͢͜ͱ
None
wϞσϧͱ࣮ΛΑΓਂ݁͘ͼ͚ͭΔ wෳࡶͳίʔυΛ໌നͰ༧ଌͰ͖Δͷʹ͢Δ ΦϒδΣΫτΛ࣮͍ͯ͘͠ʹ͋ͨͬͯͷΈϙΠϯτ
Ͳ͜·Ͱܕͱͯ͠༻ҙ͢Δ͔ /VMMBCMFͳΛऔΓѻ͏߹ όϦσʔγϣϯͲ͜ʹॻ͔͘ (FUUFS4FUUFSΛॻ͖ͨ͘ͳ͍͕ར༻ଆͰ෦ͷΛࢀর͍ͨ͠ͱ͖Ͳ͏͢Δ͔ Ͳ͜·ͰίϨΫγϣϯΦϒδΣΫτΛ༻ҙ͢Δ͔ TUBUJDϑΝΫτϦϝιουΛ༻͍Δ͖͔ ύοέʔδߏͲ͏͢Δ͔ JOOFS$MBTTΛ͏͖͔൱͔ Έ͕ͪ ࡉ͔͍
Ͳ͜·Ͱܕͱͯ͠༻ҙ͢Δ͔
public class PersonName { private String firstName; private String lastName;
public String fullName() { return String.format("%s %s", firstName, lastName); } } ͜ͷ͘Β͍ͳΒಛʹ·ͳ͍ ྫͷࢀরݩɿ
public class PersonName { private String firstName; private String lastName;
public String fullName() { return String.format("%s %s", firstName, lastName); } } ݸผͷৼΔ͍ͳͦ͞͏ͳͷͰಛʹ·ͳ͍
public class PersonName { private String firstName; private String lastName;
private String middleName; public String fullName() { return String.format("%s %s %s", firstName, middleName, lastName); } }
public class PersonName { private String firstName; private String lastName;
private String middleName; public String fullName() { return String.format("%s %s %s", firstName, middleName, lastName); } } ໊ࣈɺ໊લͱໟ৭͕ҧ͏ ˠݸผͷৼΔ͍͕͋Γͦ͏ ˠཁૉͷΦϒδΣΫτԽΛݕ౼
public class MiddleName { private static final int MIN_LENGTH =
1; private static final int MAX_LENGTH = 100; // null͕ೖΒͳ͍͜ͱݕূ͞Ε͍ͯΔఆ → ࢦఆ͕ͳ͍͜ͱۭจࣈͰදݱ private String value; // ίϯετϥΫλੜϝιουͰݕূ͢Δ͔ར༻ଆͰݕূ͔ͯ͠Β͔͢·ͨผͷΈϙΠϯτ… ... // ඞཁʹԠͯ͡༻ҙ public boolean isSpecified() { // value͕ۭจࣈͰͷੜڐͯ͠nullͰͷੜڐ͞ͳ͍ඞཁ͋Γ return !value.isEmpty(); } @Override public String toString() { return value; } ... }
public class MiddleName { private static final int MIN_LENGTH =
1; private static final int MAX_LENGTH = 100; // null͕ೖΒͳ͍͜ͱݕূ͞Ε͍ͯΔఆ → ࢦఆ͕ͳ͍͜ͱۭจࣈͰදݱ private String value; // ίϯετϥΫλੜϝιουͰݕূ͢Δ͔ར༻ଆͰݕূ͔ͯ͠Β͔͢·ͨผͷΈϙΠϯτ… ... // ඞཁʹԠͯ͡༻ҙ public boolean isSpecified() { // value͕ۭจࣈͰͷੜڐͯ͠nullͰͷੜڐ͞ͳ͍ඞཁ͋Γ return !value.isEmpty(); } @Override public String toString() { return value; } ... } ໊લ໊ࣈʹಉ༷ͷੑ࣭͋Γͦ͏ ˠ4USJOH͔ΒΦϒδΣΫτԽΛݕ౼ͯ͠ྑͦ͞͏ ͷൣғΛ੍ݶͯ͠ ϓϩάϥϜΛΘ͔Γ ҆͘͢શʹ
public class MiddleName { private static final int MIN_LENGTH =
1; private static final int MAX_LENGTH = 100; // null͕ೖΒͳ͍͜ͱݕূ͞Ε͍ͯΔఆ → ࢦఆ͕ͳ͍͜ͱۭจࣈͰදݱ private String value; // ίϯετϥΫλੜϝιουͰݕূ͢Δ͔ར༻ଆͰݕূ͔ͯ͠Β͔͢·ͨผͷΈϙΠϯτ… ... // ඞཁʹԠͯ͡༻ҙ public boolean isSpecified() { // value͕ۭจࣈͰͷੜڐͯ͠nullͰͷੜڐ͞ͳ͍ඞཁ͋Γ return !value.isEmpty(); } @Override public String toString() { return value; } ... } όϦσʔγϣϯΛͲ͜ʹஔ͔͘·ͨผͷΈϙΠϯτ
public class MiddleName { private static final int MIN_LENGTH =
1; private static final int MAX_LENGTH = 100; // null͕ೖΒͳ͍͜ͱݕূ͞Ε͍ͯΔఆ → ࢦఆ͕ͳ͍͜ͱۭจࣈͰදݱ private String value; // ίϯετϥΫλੜϝιουͰݕূ͢Δ͔ར༻ଆͰݕূ͔ͯ͠Β͔͢·ͨผͷΈϙΠϯτ… ... // ඞཁʹԠͯ͡༻ҙ public boolean isSpecified() { // value͕ۭจࣈͰͷੜڐͯ͠nullͰͷੜڐ͞ͳ͍ඞཁ͋Γ return !value.isEmpty(); } @Override public String toString() { return value; } ... } Ͳ͏ͯ͠ར༻ଆͰͷ͋Δͳ͠Λؾʹ͢ΔͳΒ࣮
public class PersonName { private FirstName firstName; private LastName lastName;
private MiddleName middleName; ... public String fullName() { return String.format("%s %s %s", firstName, middleName, lastName); } }
public class PersonName { private FirstName firstName; private LastName lastName;
private MiddleName middleName; ... public String fullName() { return String.format("%s %s %s", firstName, middleName, lastName); } } ͜͜·Ͱຖճࡉ͔͘ΦϒδΣΫτԽ͢Δͷ͔
public class PersonName { private String firstName; private String lastName;
private String middleName; public String fullName() { return String.format("%s %s %s", firstName, middleName, lastName); } } public class PersonName { private FirstName firstName; private LastName lastName; private MiddleName middleName; public String fullName() { return String.format("%s %s %s", firstName, middleName, lastName); } }
public class PersonName { private String firstName; private String lastName;
private String middleName; public String fullName() { return String.format("%s %s %s", firstName, middleName, lastName); } } public class PersonName { private FirstName firstName; private LastName lastName; private MiddleName middleName; public String fullName() { return String.format("%s %s %s", firstName, middleName, lastName); } } public class PersonName { private static final int MIN_FIRST_NAME_LANGTH = 1; private static final int MAX_FIRST_NAME_LENGTH = 100; private static final int MIN_MIDDLE_NAME_LENGTH = 1; private static final int MAX_MIDDLE_MAME_LENGTH = 100; private static final int MIN_LAST_NAME_LENGTH = 1; private static final int MAX_LAST_NAME_LENGTH = 100; private String firstName; private String lastName; private String middleName; public String fullName() { return String.format("%s %s %s", firstName, middleName, lastName); } } ্Ґ֓೦͕ߏཁૉͷ ͷൣғΛ୲อ
public class PersonName { private static final int MIN_FIRST_NAME_LANGTH =
1; private static final int MAX_FIRST_NAME_LENGTH = 100; private static final int MIN_MIDDLE_NAME_LENGTH = 1; private static final int MAX_MIDDLE_MAME_LENGTH = 100; private static final int MIN_LAST_NAME_LENGTH = 1; private static final int MAX_LAST_NAME_LENGTH = 100; private String firstName; private String lastName; private String middleName; public String fullName() { return String.format("%s %s %s", firstName, middleName, lastName); } } public class PersonName { private String firstName; private String lastName; private String middleName; public String fullName() { return String.format("%s %s %s", firstName, middleName, lastName); } } public class PersonName { private FirstName firstName; private LastName lastName; private MiddleName middleName; public String fullName() { return String.format("%s %s %s", firstName, middleName, lastName); } } public class PersonName { private FirstName firstName; private LastName lastName; private MiddleName middleName; public String fullName() { return String.format("%s %s %s", firstName, middleName, lastName); } } ্Ґ֓೦͕ߏཁૉͷ ͷൣғΛ୲อ ಛʹมΘΓͳ͠
ΦϒδΣΫτͷΛ͑ΒΕΔ ্Ґ֓೦͕ߏཁૉͷੑ࣭ৼΔ͍୲อ ͢Δඞཁ͕͋Γݟ௨͕͠˚ ্Ґ֓೦ͷݟ௨͕͠˕ ΦϒδΣΫτͷ͕૿͑Δ ʢதʹ΄΅ಉ͡Α͏ͳͷʣ ༻ҙ͞Ε͍ͯΔܕͷΈ ΦϒδΣΫτͷΈ
ΦϒδΣΫτͷΛ͑ΒΕΔ ্Ґ֓೦͕ߏཁૉͷੑ࣭ৼΔ͍୲อ ͢Δඞཁ͕͋Γݟ௨͕͠˚ ্Ґ֓೦ͷݟ௨͕͠˕ ΦϒδΣΫτͷ͕૿͑Δ ʢதʹ΄΅ಉ͡Α͏ͳͷʣ ༻ҙ͞Ε͍ͯΔܕͷΈ ΦϒδΣΫτͷΈ ͡Ό͋ϋΠϒϦουʁ
public class PersonName { private static final int MIN_FIRST_NAME_LANGTH =
1; private static final int MAX_FIRST_NAME_LENGTH = 100; private static final int MIN_LAST_NAME_LANGTH = 1; private static final int MAX_LAST_NAME_LENGTH = 100; private String firstName; private String lastName; private MiddleName middleName; public String fullName() { return String.format("%s %s %s", firstName, middleName, lastName); } } ϛυϧωʔϜ͚͕ͩಛघͱ͍͏ҙਤΘΓͦ͏ ཧղͷෛՙߴͦ͏
ཧ͢Δߏཁૉ͕ଟ͘ͳ͍͔ ɹɹˠ͕ͭʹͳ͍ͬͯΔ͔ ݸʑͷৼΔ͍ੑ࣭͕গͳ͍͔ ɹɹˠΦϒδΣΫτʹҠৡͨ͠΄͏͕γϯϓϧʹͳΒͳ͍͔ Λݕ౼ গͳ͘ͱͭͷ֓೦ͷதͰͲͪΒ͔ʹશʹ͢ ؾʹ͢Δ͜ͱ͕গͳ͍͏ͪ ·ͱΊͯऔΓѻ͏͜ͱʜ ؾʹ͢Δ͜ͱ͕ଟ͘ͳ͖ͬͯͨΒؔ৺ࣄ
͝ͱʹऔΓѻ͍͍ͨ
Ͳ͜·Ͱܕͱͯ͠༻ҙ͢Δ͔ /VMMBCMFͳΛऔΓѻ͏߹ όϦσʔγϣϯͲ͜ʹॻ͔͘ (FUUFS4FUUFSΛॻ͖ͨ͘ͳ͍͕ར༻ଆͰ෦ͷΛࢀর͍ͨ͠ͱ͖Ͳ͏͢Δ͔ Ͳ͜·ͰίϨΫγϣϯΦϒδΣΫτΛ༻ҙ͢Δ͔ TUBUJDϑΝΫτϦϝιουΛ༻͍Δ͖͔ ύοέʔδߏͲ͏͢Δ͔ JOOFS$MBTTΛ͏͖͔൱͔ Έ͕ͪ ࡉ͔͍
օ༷͕ͲͷΑ͏ʹߟ͑ͯɺͲ͏ͯͦ͠ͷ࣮ʹͨ͠ͷ͔ ͥͻͥͻɺ͓ฉ͔͍ͤͩ͘͞