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
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
77
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
120
議事録のとり方 / how to write proceeding
yachiy
0
170
Other Decks in Programming
See All in Programming
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
140
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
120
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
120
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
550
Intent as Code
shoppingjaws
6
1k
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
120
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
330
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
200
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
280
How I Stole PSI from Android Studio - DroidKaigi2026
worker8
0
130
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
360
Featured
See All Featured
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
240
4 Signs Your Business is Dying
shpigford
187
23k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Building the Perfect Custom Keyboard
takai
2
870
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Documentation Writing (for coders)
carmenintech
77
5.5k
ラッコキーワード サービス紹介資料
rakko
1
4.9M
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
360
Thoughts on Productivity
jonyablonski
76
5.4k
Amusing Abliteration
ianozsvald
1
300
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
660
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Λ͏͖͔൱͔ Έ͕ͪ ࡉ͔͍
օ༷͕ͲͷΑ͏ʹߟ͑ͯɺͲ͏ͯͦ͠ͷ࣮ʹͨ͠ͷ͔ ͥͻͥͻɺ͓ฉ͔͍ͤͩ͘͞