Slide 1

Slide 1 text

©2021 Wantedly, Inc. டং͋ΔKotlinͷ֦ு potatotips #74 2021/06/23 ٱอग़խढ़

Slide 2

Slide 2 text

©2021 Wantedly, Inc. XXXXBOUFEMZDPNJELVCPEF

Slide 3

Slide 3 text

©2021 Wantedly, Inc. w JOUFSGBDFͱPCKFDU಺֦ுؔ਺Ͱɺ֦ுʹடং Λ΋ͨͤΔ࿩ 5-%3

Slide 4

Slide 4 text

©2021 Wantedly, Inc. ܦҢ

Slide 5

Slide 5 text

©2021 Wantedly, Inc. w ,..ʹ(SBQI2-Λಋೖ ܦҢ

Slide 6

Slide 6 text

©2021 Wantedly, Inc. w 3FQPTJUPSZͰϑΣονͨ͠σʔλΛอଘ͍ͨ͠ ΍Γ͍ͨ͜ͱ อଘͨ͠Β GetUseCaseʹ ௨஌͞ΕΔ

Slide 7

Slide 7 text

©2021 Wantedly, Inc. w ෳ਺ͷGSBHNFOUΛ͏·͘อଘ͍ͨ͠ fragmentͱ͸ • σʔλϞσϧΛஅยԽͨ͠΋ͷ • ಉ͡ϞσϧΛࢦ͕͢৘ใྔ͕ҧ͏ • ҰཡͰ͸࠷খݶ • ৄࡉͰ͸࠷େݶ Ϟσϧ͸ಉ͡ͳͷͰɺ ಉ͡ςʔϒϧʹอଘ͍ͨ͠ ΍Γ͍ͨ͜ͱ fragment ProfileMini on Profile { userId name avatarUrl } fragment ProfileDetail on Profile { userId name avatarUrl coverImageUrl introduction tagline statement # ... all fields }

Slide 8

Slide 8 text

©2021 Wantedly, Inc. w ECNFSHF GSBHNFOU Έ͍ͨʹॻ͖͍ͨ w 42-%FMJHIUʹ͸ࠩΛٵऩͯ͠ɺ͍͍ײ͡ʹอଘ ͢Δػೳ͸ͳ͍ ΍Γ͍ͨ͜ͱ

Slide 9

Slide 9 text

©2021 Wantedly, Inc. w ୯७ʹ֦ுΛॻ͍ͨ Ͳ͏͔ͨ͠ʁ fun Db.merge(fragment: ProfileMiniFragment) { profilePageQueries.upsertMiniFragment( userId = UserId(fragment.userId), // ... ) }

Slide 10

Slide 10 text

©2021 Wantedly, Inc. ໰୊఺ fun Db.merge(fragment: ProfileMiniFragment) { profilePageQueries.upsertMiniFragment( userId = UserId(fragment.userId), // ... ) } ໊લʹറΓ͕ͳ͍ɺ໎͏ mergeDetail, saveͱ͔ϒϨ΍͍͢ Ҿ਺ʹറΓ͕ͳ͍ interfaceͰ੍໿Λ͍࣋ͨͤͨʂ

Slide 11

Slide 11 text

ϖʔδλΠτϧ ϖʔδαϒλΠτϧ ©2021 Wantedly, Inc. JOUFSGBDFPCKFDU಺֦ுؔ਺

Slide 12

Slide 12 text

©2021 Wantedly, Inc. PCKFDU಺֦ுؔ਺ object Foo { fun String.hello() { println("Hello, $this") } } object಺ʹ֦ுؔ਺Λ࡞Δ ී௨ͷ֦ுؔ਺ͷΑ͏ʹར༻Ͱ͖Δ import Foo.hello fun main() { "World".hello() }

Slide 13

Slide 13 text

©2021 Wantedly, Inc. ղܾख๏ internal interface Merger { fun Db.merge(fragment: FragmentT) } internal object ProfileMiniFragmentMerger : Merger { override fun Db.merge(fragment: ProfileMiniFragment) { profilePageQueries.upsertFragment( userId = UserId(fragment.userId), // ... ) } } // Repository fun fetchMiniList() { val miniList = api.query(GetProfileMiniListQuery()) db.transaction { miniList.forEach { db.merge(it) } } } internal object ProfileDetailFragmentMerger : Merger { override fun Db.merge(fragment: ProfileDetailFragment) { profilePageQueries.upsertFragment( userId = UserId(fragment.userId), // ... ) } } // Repository fun fetchDetail() { val detail = api.query(GetProfileDetailQuery()) db.merge(detail) } ֦ுؔ਺Λ࣋ͭ object΁࣮૷ object಺֦ுؔ਺ΛݺΜͰ͍Δ

Slide 14

Slide 14 text

©2021 Wantedly, Inc. w JOUFSGBDFͱPCKFDU಺֦ுؔ਺Ͱɺ֦ுʹடংΛ ΋ͨͤΔ͜ͱ͕Ͱ͖Δ w ࠜຊతʹ͸ίʔυੜ੒ͱ͔ͰϘΠϥʔϓϨʔτΛ ݮΒ͢΂͖ʜ ·ͱΊ

Slide 15

Slide 15 text

ϖʔδλΠτϧ ϖʔδαϒλΠτϧ ©2021 Wantedly, Inc. 🙇