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
CASwift_11.pdf
Search
Shunsaku Miki
January 30, 2020
Programming
1
1.3k
CASwift_11.pdf
Shunsaku Miki
January 30, 2020
Tweet
Share
More Decks by Shunsaku Miki
See All by Shunsaku Miki
iOS12 New Notification
shunsakumiki
0
70
Other Decks in Programming
See All in Programming
タスクの特性や不確実性に応じた最適な作業スタイルの選択(ペアプロ・モブプロ・ソロプロ)と実践 / Optimal Work Style Selection: Pair, Mob, or Solo Programming.
honyanya
3
180
Domain-centric? Why Hexagonal, Onion, and Clean Architecture Are Answers to the Wrong Question
olivergierke
3
930
AI Coding Meetup #3 - 導入セッション / ai-coding-meetup-3
izumin5210
0
3.4k
pnpm に provenance のダウングレード を検出する PR を出してみた
ryo_manba
1
110
CSC305 Lecture 08
javiergs
PRO
0
270
『毎日の移動』を支えるGoバックエンド内製開発
yutautsugi
2
270
kiroとCodexで最高のSpec駆動開発を!!数時間で web3ネイティブなミニゲームを作ってみたよ!
mashharuki
0
810
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
520
overlayPreferenceValue で実現する ピュア SwiftUI な AdMob ネイティブ広告
uhucream
0
200
なぜあの開発者はDevRelに伴走し続けるのか / Why Does That Developer Keep Running Alongside DevRel?
nrslib
3
410
他言語経験者が Golangci-lint を最初のコーディングメンターにした話 / How Golangci-lint Became My First Coding Mentor: A Story from a Polyglot Programmer
uma31
0
320
CSC305 Lecture 09
javiergs
PRO
0
300
Featured
See All Featured
Fireside Chat
paigeccino
40
3.7k
A designer walks into a library…
pauljervisheath
209
24k
Faster Mobile Websites
deanohume
310
31k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
253
22k
The Power of CSS Pseudo Elements
geoffreycrofte
79
6k
The Cost Of JavaScript in 2023
addyosmani
55
9.1k
The Illustrated Children's Guide to Kubernetes
chrisshort
49
51k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
A better future with KSS
kneath
239
18k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.7k
Product Roadmaps are Hard
iamctodd
PRO
55
11k
Transcript
Amebaͷઃܭͱ͜Ε͔Β ~ΧΦε͔Βͷ٫ͱ࠶ͼΧΦεΛੜΈग़͞ͳ͍ྗʙ 2020/1/30
1.ࣗݾհ&ϓϩμΫτհ 2.ΧΦε͗ͨ͢ઃܭ 3.ϦΞʔΩςΫνϟ:yatteiki: 4.݁Ռͱະདྷ
ࣗݾհ&ϓϩμΫτհ
ࣗݾհˍϓϩμΫτհ • ࡾ ढ़࡞ • 2017த్ೖࣾ Ameba iOS։ൃϦʔμʔ • 2010ϦϦʔε
• Twitter/shun_sakuuu • Github/shun-mk
ΧΦε͗ͨ͢ઃܭ
ΧΦε͗ͨ͢ઃܭ • 2010ʹϦϦʔε͞Ε10Ҏ্ӡ༻Λ͍ͯ͠ΔΞϓϦ • ࣌ͷྲྀΕͷதͰͨ͘͞Μͷసظ • WebViewΞϓϦ͔ΒϑϧωΠςΟϒʹ • Objective-C͔ΒSwiftʹ •
વνʔϜͷϝϯόʔͷೖΕସΘΓܹ͍͠ • ࣌ͷྲྀΕͷதͰ࣌σϑΝΫτͩͱݴΘΕ͖ͯͨઃܭͨ͘͞Μ͋Δ • ΧΦε͔Β٫͠Α͏ͱͯ͠ૡ͍ͨࠟɻɻɻ
MVC • ଏʹݴ͏FatViewController • ΊͬͪΌViewControllerͰAPI௨৴ͯ͠Δ • ViewControllerͰAPI௨৴ͱ͔ॻ͍ͪΌͩΊͩΑʁ͍ͬͯ͏࣌ͷἤΓΛड͚ ͨͷ͔HogeHogeManagerͱ͔HogeHogeHelperͱ໋໊͔͔ΒԿ͢Δͷ͔Α͘ Θ͔Βͳ͍Ϋϥε͕API௨৴Λ࣋ͬͯͨΓ͢Δ •
વςετͳ͍
VIPER • Ұ෦VIPERͷߏͰ࡞ΒΕͯΔը໘͕͋Δ • ͓ͦΒ͘͜ΕAmebaΛΧΦε͔Β٫͢ΔͨΊʹઓͨ͠Ұͭͳͷ͔ͳʁ • ઃܭࢿྉ͕ͳ͘Ͳ͏͍͏ࢥͰͲ͏͍͏ߏʹͳ͍ͬͯΔͷ͔͕ඇৗʹ ͔ΓͮΒ͍ • વςετͳ͍
ΧΦε͗ͨ͢ઃܭ • ৽نը໘Λ࣮͢Δ࣌Ͳ͏͍͏ઃܭʹ͢Ε͍͍͔ຖճ0͔Βߟ͑Δͷ݁ߏେ ม • ͔͠ਓͦΕͧΕ͜Ε͕͍͍͍ͬͯ͏ͷ͕ҧ͏ͷͰϨϏϡʔίετΓΓ • ͦͷઃܭʹͨ͠ΤϯδχΞ͕͍ͳ͘ͳΔͱෛ࠴ײ͕ੌ͍ • ઃܭ͕΅ΜΓ&ີ݁߹&ςετಛʹͳ͘Կ͕ਖ਼ͷಈ͖ͳͷ͔Θ͔Βͳ͍ͷ
ࡾॏۤͰ༷มߋػೳՃʹ༨ʹ͕ൃੜ͢Δঢ়ଶʹ
ϦΞʔΩςΫνϟ:yatteiki:
ͬ͘͟Γͱͨ͠ํ • ࠓճͷϦΞʔΩςΫνϟͰࢦͨ͠࠷ऴܕMVVM ʴ Flux • ಋೖ͕ਐΜͰ͍ͳ͔ͬͨRxSwiftϦΞʔΩςΫνϟʹ߹ΘͤͯਐΊΔ • ͔ͤͬ͘ઃܭ͢͠ͳΒςετͷ࣮·Ͱߟ͑ΒΕͯΔઃܭʹ͍ͨ͠ •
ςετॻ͘ͳΒCIͷڥݟͯ͠ςετΛॻ͘͜ͱʹҙຯ͕͋Δঢ়ଶΛ࡞ Γ͍ͨ • ઃܭҊʹؔͯ͠ৗʹνʔϜͰ͢Γ߹ΘͤΛߦ͏(୭͔ҰਓͷઃܭΛօ͕ਅࣅ ͯ͠ॻ͚ͩ͘ͷঢ়ଶආ͚͍ͨ)
MVVM • Ұൠతʹࢥ͍ු͔ͿMVVMͱ΄΅มΘΒͳ͍ߏ • 1ը໘ͷϩδοΫ͕ෳࡶͳը໘͕ͦͦ͋͜͜Δͷͱෳͷը໘͕ಉظ͠ͳͯ͘ ͍͚ͳ͍Α͏ͳ༷͕ଟ͍Θ͚Ͱͳ͔ͬͨͷͰγϯϓϧͳMVVMΛ࠾༻ ͨ͠ • ViewͱViewModelͷbindingΛ͢ΔͨΊͷFrameworkRxSwiftΛ࠾༻(ࣾʹ ͓͚Δ࠾༻࣮ΛؑΈܾͯఆ)
MVVM • ॳظViewModelͷߏinitͰPublishSubjectΛੜ͠Observerͱ ObservableͷϓϩύςΟʹηοτͯ͠ߪಡ͢Δܗʹ͍ͯͨ͠ • ؆୯ͳը໘ͳΒˢͷ࣮ͰࠔΔ͜ͱಛʹͳ͍ • ViewModelͷIn-OutͷI/F͕࣮ऀʹҕͶΒΕ͓ͯΓϨϏϡʔίετ͕ංେԽ • ෳࡶͳॲཧ͕ೖͬͯ͘Δͱinit͕ஶ͘͠ංେԽ͠ϝϯςίετ͕ര૿ͨ͠
MVVM • ViewModelͷinitͰߦ͍ͬͯͨObservableͷՃAPI௨৴ɺViewදࣔ༻ͷ ModelͷTranslatorݺͼग़͠ΛUsecaseͱͯ͠Γग़͠ • ViewModelͷInputͱOutputΛProtocolʹΓग़͠In-OutͷI/FΛڞ௨Խ • ViewModelͷinitͰߦΘΕ͍ͯͨॲཧΛͦΕͧΕͷຖʹΓग़͠ංେԽ Λ͙ͱͱʹখ͍͞୯ҐͰςετ͕ॻ͚ΔΑ͏ʹ
Flux • MVVMͷΈͩͱ࣮ݱ͢ΔͷʹࡶԽ͢ΔΑ͏ͳ༷͕ग़͖ͯͨ • ϩάΠϯ/ϩάΞτʹΑͬͯΞϓϦશମͷঢ়ଶΛΓସ͑ͨΓɺλϒͷΑ͏ ͳը໘Ͱߋ৽௨ΛϒϩʔυΩϟετͨ͠Γ • ࠷ॳObserverͱObservableΛI/Fʹ࣋ͭSingletonͷΦϒδΣΫτΛར༻ͯ͠ ղܾ͍ͯ͠ΔՕॴ͕͋ͬͨԿ༷ʹѱ͍͜ͱ͕Ͱ͖ͯ͠·͏ͷͱεέʔ ϧ͢ΔΠϝʔδ͕ͳ͔ͬͨͨΊղܾ͔ͨͬͨ͠
Flux • Fluxര • σʔλϑϩʔFacebookͷFluxͱಉ༷ • ඇRxґଘ -> StoreViewModelͱbindͤͨ͞΄͏͕߹͕ྑ͍Օॴ͕͋ΔͷͰ StoreͷϕʔεΫϥεʹExtensionͰObservableʹม͢ΔॲཧΛՃ͍ͯ͠Δ
Flux • Fluxͷར༻ऀStoreͷΠϯελϯεΛੜ͠దٓbind͢Δ • SingletonͰ࣮͍ͯͨ࣌͠ͱҧ͍ར༻ऀଆ͕ඞཁͳΠϕϯτStateΛ࣋ͭ Store͚ͩΛݟΕ͍͍ͨΊෆཁͳObservableΛߪಡ͢Δ͜ͱΛ͛Δ • ංେԽ͠ଓ͚Δະདྷ͔͠ݟ͑ͳ͔ͬͨSingleton͔ΒඞཁʹԠͯ͡ܗΛม͑Δ StoreΛੜͰ͖ΔΑ͏ʹͳͬͨͷͰεέʔϧ͢Δײ •
σʔλϑϩʔ୯ํͳͷͰAPI௨৴͕ඞཁʹͳΔॲཧͰΩϨΠͳߏΛ อͭ͜ͱ͕Ͱ͖ΔΑ͏ʹ
ͨͩ͠
Flux • ར༻ՕॴͪΌΜͱߟ͑Δ͜ͱ • FluxΛར༻͢Δඞཁ͕ͳ͍ը໘FluxͰ࣮͢Δͱٯʹࡶʹͳͬͯ͠·͏ ՄೳੑΛሃΜͰ͍Δ • MVVMͰΩϨΠʹ࡞Εͳ͍ॲཧͷྲྀΕ͕͋ΔΑ͏ͳͱ͖ʹબࢶͱͯ͠ར ༻ •
ݸਓతʹNotificationCenterͱ͔ObserverύλʔϯͰຖճಠࣗͷศརΫϥε ࡞ΔΑΓஅવFlux
݁Ռͱະདྷ
ྑ͔ͬͨ • ৽࣮͘͠͞ΕΔը໘ͷ࡞Γ͕͋Δఔ౷Ұ͞Ε͍ͯΔͷϨϏϡʔίετ Λߟ͑ͯѹతʹྑ͍ • Ұਓ͕ઃܭ͢ΔͷͰͳ͘ɺνʔϜͰ͖ͬͪΓೝࣝΛ߹Θͤͳ͕ΒਐΊΔ ͜ͱͰઃܭΛߟ͑Δେࣄ͕͞ਁಁͨ͠ײ͕ͨ͡͠ • ઃܭͷࢿྉͳͲ͕ࣾͷυΩϡϝϯτʹ͞Ε͍ͯΔঢ়ଶΛ࡞Εͨ •
෭࣍తͰ͋Δ͕ςετͷࣄΛߟྀ͢ΔΑ͏ʹͳͬͨ͜ͱͰCIڥͷݟ͠ ͳͲਐΊΔ͜ͱ͕Ͱ͖ͨ(ϝϯςφʔ͕ଐਓԽ͍ͯͨ͠Jenkins͔ΒBitrise )
ΠϚΠνͩͬͨ • ࢼߦࡨޡ͠ͳ͕ΒͷϦΞʔΩςΫνϟͩͬͨͷͰίʔυͷதʹຊདྷඞཁͳ͍ ෛ࠴͕ͬͨ • ͕࣌ؒڐ͞ΕΔͳΒͬͱ৭ʑߟ͑Δ͖ͩͬͨ(init͕ංେԽ͢ΔϨΠ ϠʔΛҙࣝͨ͠ઃܭʣ • શը໘Λࠓճͷઃܭʹ͢ΔϚΠϧετʔϯͳͲҾ͚͓ͯΒͣࠜຊʹ͋ΔΧ Φε͕·ͩͳ͍ͤͯ͘ͳ͍
େࣄͳͷ͜ΕΒΛ౿·͑ͯ ͜Ε͔ΒͲ͏͍ͯ͘͠ͷ͔
͜Ε͔ΒͷAmebaͷઃܭ • ݱঢ়՝ͩͱײ͍ͯ͡Δͷ͕ViewModelΑΓཪଆͷ෦ͷ࡞Γ(Usecaseͱ͔ Repositoryͱ͔) • ࠓઃܭΛͨ͠ϝϯόʔ͕·ͩνʔϜʹἧ͍ͬͯΔͷͰடং͕อͨΕ͍ͯ Δ͚ͩ • શһ͍ͳ͘ͳͬͨ͋ͱΧΦεΛੜΈग़͢ةݥੑ·ͩ·ͩሃΜͰ͍Δ •
ͰԿΛ͢Δͷ͔ʁʁʁ
͜Ε͔ΒͷAmebaͷઃܭ • Layered Architectureͷߟ͑ํΛࢀߟʹऔΓೖΕ͍͖͍ͯͨ
͜Ε͔ΒͷAmebaͷઃܭ • Layered Architectureͷߟ͑ํଊ͑ํɺ࣮ࡍͷ࣮ʹࢸΔ·Ͱ৭ʑͳߟ͑ํ Λ࣋ͬͯΔਓ͕͍Δ • ݪཧओٛͰͳ͋͘͘·ͰAmebaͱͯ͠औΓೖΕΔͳΒͲͷܗ͕ཧͳͷ͔ Λߟ͍͖͍͑ͯͨ • ྫ͑EntityDomainͳͷ͔Dataͳͷ͔ɺ༷ʑͳߟ͑ํ͋Δͱࢥ͏
͕AmebaͷಛੑEmbedFrameworkͱͯ͠Γग़ͨ͠ͱ͖ʹෆՄղͳґଘঢ় ଶʹͳΒͳ͍Α͏ߟྀ͖͍ͯͨ͠
·ͱΊ • ͘ӡӦͯ͠ΔαʔϏεͩͱΧΦε͕ੜ·Εͯ͠·͏ͷํͳ͍͜ͱ • ݱঢ়ʹҤ͑Δ͚ͩ͡Όͳͯ͘Ή͠Ζ৳ͼ͠Ζͩͱଊ͑ΒΕΔϝϯόʔͱঢ়گ ͕ἧ͍ͬͯΕΨϯΨϯ͍ͬͯͬͨ΄͏͕͍͍͜ͱ͕͋Δ • ઃܭʹۜͷؙͳ͍ͷͰ৽͍͠ͷΛΩϟον্ͨ͠ͰαʔϏεಛੑʹ Ϛον͢ΕΨγΨγऔΓೖΕ͍ͯ͘ •
ಠΓΑ͕ΓͷઃܭͰͳ͘ઃܭͷνʔϜશମͰͷίϛοτํ๏ઃܭ͢Δ ඞཁ͕͋Δ
͋Γ͕ͱ͏͍͟͝·ͨ͠☺