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
koutalou
March 16, 2017
4k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
マネーフォワードの設計へのアプローチ
CAMPFIRE iOS #1で発表した発表資料です。
Architectureの選定や、マネーフォワードでのClean Architectureの取り組みについてのお話です。
koutalou
March 16, 2017
More Decks by koutalou
See All by koutalou
実際Xamarinってどうなの?
koutalou
3
2.3k
iOS Clean Architecture のすすめ
koutalou
26
24k
let product = [designer, engineer].reduce(0) { $0 + $1.skill * $1.vision }
koutalou
0
440
tvOS tips
koutalou
1
1.9k
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
240
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
680
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
Statistics for Hackers
jakevdp
799
230k
Discover your Explorer Soul
emna__ayadi
2
1.3k
Docker and Python
trallard
47
4.2k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
430
The Mindset for Success: Future Career Progression
greggifford
PRO
0
490
WCS-LA-2024
lcolladotor
0
820
Transcript
ϚωʔϑΥϫʔυͷઃܭͷΞϓϩʔν CAMPFIRE iOS #1 2017/03/16 גࣜձࣾϚωʔϑΥϫʔυ ࣇۄଠ
ࣗಈՈܭɾࢿ࢈ཧαʔϏεʰϚωʔϑΥϫʔυʱ iOS, AndroidΞϓϦ։ൃΛ୲͍ͯ͠·͢ ࣇۄଠ!LPVUBMPV ΤϯδχΞ ࣗݾհ
༰ 1 "SDIJUFDUVSFʹ͍ͭͯ 2 "SDIJUFDUVSFͷબఆ 3 $MFBO"SDIJUFDUVSFͷऔΓΈ
1 2 "SDIJUFDUVSFͷબఆ 3 $MFBO"SDIJUFDUVSFͷऔΓΈ 2 3 "SDIJUFDUVSFʹ͍ͭͯ ༰
طଘͷ"SDIJUFDUVSF .7$"SDIJUFDUVSF .71 .77. "SDIJUFDUVSF
طଘͷ"SDIJUFDUVSF 7*1&3"SDIJUFDUVSF %%%"SDIJUFDUVSF
$MFBO"SDIJUFDUVSF 7JFX 1SFTFOUFS 6TF$BTF 5SBOTMBUPS .PEFM %BUB4UPSF &OUJUZ 3FQPTJUPSZ 1SFTFOUBUJPO-BZFS
%PNBJO-BZFS %BUB-BZFS w ΛࡉԽ͢Δ͜ͱͰɺ֤ϨΠϠ͕ԿΛ୲͢Δ͔໌֬ʹͳΔ w 6*ͱϏδωεϩδοΫΛͰ͖ɺϨΠϠؒͷґଘΛ࠷খݶʹͰ͖Δ w ϨΠϠؒૄ݁߹ͳͷͰϞδϡʔϧͷஔ͖͑ɺςετ͕༰қ
$MFBO"SDIJUFDUVSFͷ1SPT$POT ɹQSPT w ಛఆͷ-BZFSͷංେԽΛ͛Δ w ݴޠԽ͞Εͨఆ͕ٛ͋ΔͷͰڞ௨ͷઃܭҙ͕ࣝ࣋ͯΔ w ͕ࡉԽ͞Ε͍ͯΔͷͰϝϯς͍͢͠ DPOT w
ίʔυྔɺϑΝΠϧ͕ଟ͍ w ֶशίετ͕ߴ͍
औΓΈ "SDIJUFDUVSFʹ͍ͭͯ 2 "SDIJUFDUVSFͷબఆ $MFBO"SDIJUFDUVSFͷऔΓΈ 1 3
Α͋͘ΔΞʔΩςΫνϟͷ w ॏͳΔ༷มߋෳࡶͳ༷ʹରԠ͢ΔͨΊʹ7JFX$POUSPMMFS ಛఆͷ.PEFM͕ංେԽ͠ɺϏδωεϩδοΫͷຊ࣭Λݟࣦ͏ w ಛఆͷϨΠϠ͕ෳͷΛ࣋ͪґଘͷߴ͍ෳࡶͳίʔυ͕ੜ·ΕΔ ΤϯδχΞ ΤϯδχΞ ΤϯδχΞ ͍༷͢͝มߋͩɺɺ
·ͨViewController͕ΒΉ ϏδωεϩδοΫ͜Μͳ ॻ͖ํͪ͠Ό͏Μͩɾɾ Model͕͍ΖΜͳॲཧΛ ؚΊͯෳࡶ͗͢Δɾɾ → VIPERClean ArchitectureΛݕ౼ͯ͠ྑ͍
Λײ͍ͯ͡ͳ͍έʔε w গਓͰنͷখ͞ͳΞϓϦέʔγϣϯɺશ༰ΛѲ͍͢͠ w εϞʔϧελʔτͳͲͰ·ͣಈ͘ͷΛ࡞Γ͍ͨ w ϩδοΫ͕γϯϓϧͰಛʹෳࡶͳॲཧ͕ଘࡏ͠ͳ͍ ΤϯδχΞ ΤϯδχΞ ΤϯδχΞ
ҰਓͰ։ൃ͢Δ͠ɺ ͦΜͳʹنେ͖͘ͳ͍ ͱʹ͔͘εϐʔυײॏࢹ ·ͣϞϊΛ࡞Γ͍ͨ ΞϓϦέʔγϣϯͷ ϩδοΫ͕ෳࡶͰͳ͍ → VIPERClean Architecture͍͍ͯͳ͍
"1*ʹΑΔෳࡶੑʹ͍ͭͯ ͭͷը໘Ͱෳͷ"1*͔ΒσʔλΛऔಘ͢Δ߹ɺ 7JFXͰ͏.PEFMม͕ඞཁʹͳΓϩδοΫෳࡶʹͳΓ͕ͪ "1* "1* "1* "1* "1* → Clean
ArchitectureΛݕ౼ͯ͠ྑ͍
ը໘"1*ͷΑ͏ͳ߹ɺ3FTQPOTF͕7JFXͷ.PEFMͱͯ͠ ͑Δέʔε͕ଟ͍ͨΊϩδοΫγϯϓϧʹͳΔ "1* "1* "1*ʹΑΔෳࡶੑʹ͍ͭͯ → Clean Architectureෆ͖ɺVIPERݕ౼ͯ͠ྑ͍
"SDIJUFDUVSFͷબఆ w ظతͳ։ൃɺϝϯςφϯε͕ඞཁ͔ w ୯ಠ։ൃ͔։ൃϝϯόʔଟ͘ྲྀಈత͔ w αʔόଆͷϦιʔε͕ेͰ$MJFOUγϯϓϧʹͰ͖Δ͔ w $MJFOUଆͰෳࡶͳϩδοΫΛ࣋ͨ͟ΔΛಘͳ͍͔ ϓϩδΣΫτͷঢ়گϝϯόʔɺ
αʔόଆؚΊͨશମͷγεςϜΛߟྀͯ͠ "SDIJUFDUVSFΛબఆ͖͢
3 $MFBO"SDIJUFDUVSFͷऔΓΈ "SDIJUFDUVSFʹ͍ͭͯ 1 2 "SDIJUFDUVSFͷબఆ 2 ༰
νʔϜͰ"SDIJUFDUVSFΛڞ༗ 7JFX 1SFTFOUFS 6TF$BTF 5SBOTMBUPS .PEFM %BUB4UPSF &OUJUZ 3FQPTJUPSZ 1SFTFOUBUJPO-BZFS
%PNBJO-BZFS %BUB-BZFS "QQMJDBUJPO-BZFS #VJMEFS 8JSFGSBNF νʔϜͰݴޠԽ͞Εͨఆ͕ٛ͋Δ͜ͱ͕ॏཁ ఆ͕ٛͳ͍ͱɺ։ൃऀʹΑͬͯཧղҙݟ͕όϥόϥʹͳͬͯ͠·͏
࣮ํ 1SFTFOUBUJPO %PNBJO %BUB-BZFSશͯQSPUPDPMΛఆٛ "QQMJDBUJPO-BZFSͰ*NQMFNFOUBUJPOΛ%*͢Δ 7JFX 1SFTFOUFS 6TF$BTF 5SBOTMBUPS .PEFM
%BUB4UPSF &OUJUZ 3FQPTJUPSZ 1SFTFOUBUJPO-BZFS %PNBJO-BZFS %BUB-BZFS "QQMJDBUJPO-BZFS #VJMEFS 8JSFGSBNF
࣮ํ 1SFTFOUBUJPO %PNBJO %BUB-BZFSશͯQSPUPDPMΛఆٛ "QQMJDBUJPO-BZFSͰ*NQMFNFOUBUJPOΛ%*͢Δ 7JFX 6TF$BTF 5SBOTMBUPS .PEFM %BUB4UPSF
&OUJUZ 3FQPTJUPSZ 1SFTFOUFS
࣮ํ 1SFTFOUBUJPO %PNBJO %BUB-BZFSશͯQSPUPDPMΛఆٛ "QQMJDBUJPO-BZFSͰ*NQMFNFOUBUJPOΛ%*͢Δ
'SBNFXPSLԽ ֤ϨΠϠΛ'SBNFXPSLͰׂ -BZFSؒΛૄ݁߹ɺґଘؔΛ࠷খݶʹ͢ΔͨΊʹಋೖ 7JFX 6TF$BTF 5SBOTMBUPS .PEFM %BUB4UPSF &OUJUZ 3FQPTJUPSZ
1SFTFOUFS w 7JFX1SFTFOUFS w %PNBJO%PNBJO w %BUB%BUB w $PSF௨৴ͳͲͷج൫෦ w 4UZMF6*$PNQPOFOUͷڞ௨ఆٛ w 6UJMJUZศརػೳͷू߹
'SBNFXPSLԽ ֤ϨΠϠΛ'SBNFXPSLͰׂ -BZFSؒΛૄ݁߹ɺґଘؔΛ࠷খݶʹ͢ΔͨΊʹಋೖ 7JFX 6TF$BTF 5SBOTMBUPS .PEFM %BUB4UPSF &OUJUZ 3FQPTJUPSZ
1SFTFOUFS %PNBJO %BUB $PSF 6UJMJUZ 4UZMF 7JFX
4UZMF(VJEF"QQ 'SBNFXPSLʹ͢Δ͜ͱͰڞ௨ԽͰ͖ .POFZ'PSXBSEΞϓϦʹͦͷ··͑Δ Money Forward App Style Guide App Style
Framework
4UZMF(VJEF"QQ Money Forward App Style Guide App Style Framework 'SBNFXPSLʹ͢Δ͜ͱͰڞ௨ԽͰ͖
.POFZ'PSXBSEΞϓϦʹͦͷ··͑Δ
6*$PNQPOFOUͷڞ௨Խ 4UPSZCPBSEͰઃఆ͢Δ6*$PNQPOFOUʹઃఆΛೖΕͨ͘ͳ͍ ͚Ͳ4UPSZCPBSE্Ͱө͞Εͯ΄͍͠ /PSJ ίʔυͰ4UPSZCPBSEͷ 7JFXΛσβΠϯ͢Δ !ZVLJBTBJ IUUQTHJUIVCDPNZVLJBTBJ/PSJ
ςϯϓϨʔτͷࣗಈੜ $MFBO"SDIJUFDUVSFϑΝΠϧ͕ଟ͘ͳΔͷͰɺ ςϯϓϨʔτΛࣗಈੜ͢Δͱ͔ͳΓָ IUUQTHJUIVCDPNCBOO[BJ,VSJ ,VSJ 9DPEF1SPKFDUʹ $MFBO"SDIJUFDUVSFͷ ςϯϓϨʔτΛࣗಈੜͯ͘͠ΕΔ !CBOO[BJ
$MFBO"SDIJUFDUVSFͷஔ͖͑ Ұؾʹશͯ࡞Γ͠ͷΑ͏ͳϦϑΝΫλͤͣɺ ը໘୯ҐͰঃʑʹ$MFBO"SDIJUFDUVSFஔ͖͑
$MFBO"SDIJUFDUVSFͷஔ͖͑ 7JFX 1SFTFOU 6TF$BT 5SBOTMB .PEFM %BUB4U &OUJUZ 3FQPTJU Ұؾʹશͯ࡞Γ͠ͷΑ͏ͳϦϑΝΫλͤͣɺ
ը໘୯ҐͰঃʑʹ$MFBO"SDIJUFDUVSFஔ͖͑
$MFBO"SDIJUFDUVSFͷஔ͖͑ 7JFX 1SFTFOU 6TF$BT 5SBOTMB .PEFM %BUB4U &OUJUZ 3FQPTJU Ұؾʹશͯ࡞Γ͠ͷΑ͏ͳϦϑΝΫλͤͣɺ
ը໘୯ҐͰঃʑʹ$MFBO"SDIJUFDUVSFஔ͖͑ 7JFX 1SFTFOU 6TF$BT 5SBOTMB .PEFM %BUB4U &OUJUZ 3FQPTJU
$MFBO"SDIJUFDUVSFͷஔ͖͑ 7JFX 1SFTFOU 6TF$BT 5SBOTMB .PEFM %BUB4U &OUJUZ 3FQPTJU Ұؾʹશͯ࡞Γ͠ͷΑ͏ͳϦϑΝΫλͤͣɺ
ը໘୯ҐͰঃʑʹ$MFBO"SDIJUFDUVSFஔ͖͑ 7JFX 1SFTFOU 6TF$BT 5SBOTMB .PEFM %BUB4U &OUJUZ 3FQPTJU 7JFX 1SFTFOU 6TF$BT 5SBOTMB .PEFM %BUB4U &OUJUZ 3FQPTJU
ඇϑϨʔϜϫʔΫґଘ ɹ-BZFSؒΛ͑ΔΑ͏ͳϑϨʔϜϫʔΫʹґଘͤ͞ͳ͍ w ௨৴-BZFSͰ͚ͯ63-4FTTJPOΛ༻ w "MBNPpSF"1*,JUաͳػೳΛ࣋ͭͷͰΘͳ͍ w 6*ܥͷϥΠϒϥϦ-BZFSΛ͑ͳ͍ͷʹݶΔ w ྫ֎Ͱ3Y4XJGUΛಋೖ
3Y4XJGUͷ1SPT$POT ɹQSPT w 6TF$BTFͰͷ1SPNJTFॲཧͷهड़͕༰қ w 3FQPTJUPSZҎԼͷ*'ΛετϦʔϜͰهड़ w ը໘ؒ&WFOU௨ͷ.VMUJ$BTUΛετϦʔϜͰ࣮Մ DPOT w
ࠜװ෦Λ3Y4XJGUͷෆ۩߹ϝϯςφϯεঢ়گʹґଘ w 3Y4XJGUࣗମͷֶशίετ
1SPUPDPM0SJFOUFE1SPHSBNNJOH ɹ1SPUPDPM0SJFOUFE1SPHSBNNJOHΛҙࣝ͢Δ w QSPUPDPMΛͬͨ*'ʹΑΔ࠷খݶͷґଘؔ w QSPUPDPMʹ४ڌ࣮ͨ͠FYUFOTJPOͰهड़ w DMBTTۃྗΘͣTUSVDUͰ࣮͢Δ
1SPUPDPM0SJFOUFE1SPHSBNNJOH ɹ1SPUPDPM0SJFOUFE1SPHSBNNJOHΛҙࣝ͢Δ w QSPUPDPMΛͬͨ*'ʹΑΔ࠷খݶͷґଘؔ w QSPUPDPMʹ४ڌ࣮ͨ͠FYUFOTJPOͰهड़ w DMBTTۃྗΘͣTUSVDUͰ࣮͢Δ
1SPUPDPM0SJFOUFE1SPHSBNNJOH 1SFTFOUFS 6TF$BTF 5SBOTMBUPS .PEFM %BUB4UPSF &OUJUZ 3FQPTJUPSZ TUSVDU DMBTT
7JFX ɹ1SPUPDPM0SJFOUFE1SPHSBNNJOHΛҙࣝ͢Δ w QSPUPDPMΛͬͨ*'ʹΑΔ࠷খݶͷґଘؔ w QSPUPDPMʹ४ڌ࣮ͨ͠FYUFOTJPOͰهड़ w DMBTTۃྗΘͣTUSVDUͰ࣮͢Δ
Ϟδϡʔϧͷڞ༗ Ұ෦ͷϞδϡʔϧΛஔ͖͑Δ͚ͩͰ৭Μͳը໘ʹରԠՄೳ HomeTimelinePresenterImpl UserTimelinePresenterImpl 7JFX 1SFTFOUFS 6TF$BTF 5SBOTMBUPS .PEFM %BUB4UPSF
&OUJUZ 3FQPTJUPSZ 1SFTFOUFSͷΈϞδϡʔϧ͕ҟͳΔྫ
ςετͷ༰қੑ RepositoryMockImpl 7JFX 1SFTFOUFS 6TF$BTF 5SBOTMBUPS .PEFM %BUB4UPSF &OUJUZ 3FQPTJUPSZ
QSPUPDPMʹ४ڌͨ͠.PDLςετίʔυͰ ϨΠϠຖͷॊೈͳςετ͕Մೳ 3FQPTJUPSZΛ.PDLʹͯ͠ &OUJUZˠ.PEFMͷมΛςετ 6TF$BTFΛ.PDLʹͯ͠ɺ 7JFXͷ&WFOUʹର͢Δ1SFTFOUFSͷڍಈΛςετ UseCaseMockImpl
·ͱΊ
·ͱΊ %FTJHOFS OFFS "SDIJUFDUVSFʹۜͷؙͳ͍ Կ͕࠷ద͔ߟ͑ଓ͚Δ͜ͱ͕ॏཁ w "SDIJUFDUVSF༷ʑͳঢ়گɺશମͷߏ౿·ܾ͑ͯΊΔ w ϝϯόʔͱઃܭ։ൃํΛؚΊͨίϯςΩετΛڞ༗͢Δ Architecture
5IBOLZPV