$30 off During Our Annual Pro Sale. View Details »
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
71
Other Decks in Programming
See All in Programming
안드로이드 9년차 개발자, 프론트엔드 주니어로 커리어 리셋하기
maryang
1
130
俺流レスポンシブコーディング 2025
tak_dcxi
14
9.2k
著者と進める!『AIと個人開発したくなったらまずCursorで要件定義だ!』
yasunacoffee
0
150
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
110
Context is King? 〜Verifiability時代とコンテキスト設計 / Beyond "Context is King"
rkaga
10
1.4k
Navigating Dependency Injection with Metro
l2hyunwoo
1
160
Go コードベースの構成と AI コンテキスト定義
andpad
0
130
複数人でのCLI/Infrastructure as Codeの暮らしを良くする
shmokmt
5
2.3k
大規模Cloud Native環境におけるFalcoの運用
owlinux1000
0
170
UIデザインに役立つ 2025年の最新CSS / The Latest CSS for UI Design 2025
clockmaker
18
7.6k
令和最新版Android Studioで化石デバイス向けアプリを作る
arkw
0
420
Giselleで作るAI QAアシスタント 〜 Pull Requestレビューに継続的QAを
codenote
0
250
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
50
14k
From π to Pie charts
rasagy
0
86
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.7k
The untapped power of vector embeddings
frankvandijk
1
1.5k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
0
940
A designer walks into a library…
pauljervisheath
210
24k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
250
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
110
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
0
240
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
Writing Fast Ruby
sferik
630
62k
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ͱͯ͠Γग़ͨ͠ͱ͖ʹෆՄղͳґଘঢ় ଶʹͳΒͳ͍Α͏ߟྀ͖͍ͯͨ͠
·ͱΊ • ͘ӡӦͯ͠ΔαʔϏεͩͱΧΦε͕ੜ·Εͯ͠·͏ͷํͳ͍͜ͱ • ݱঢ়ʹҤ͑Δ͚ͩ͡Όͳͯ͘Ή͠Ζ৳ͼ͠Ζͩͱଊ͑ΒΕΔϝϯόʔͱঢ়گ ͕ἧ͍ͬͯΕΨϯΨϯ͍ͬͯͬͨ΄͏͕͍͍͜ͱ͕͋Δ • ઃܭʹۜͷؙͳ͍ͷͰ৽͍͠ͷΛΩϟον্ͨ͠ͰαʔϏεಛੑʹ Ϛον͢ΕΨγΨγऔΓೖΕ͍ͯ͘ •
ಠΓΑ͕ΓͷઃܭͰͳ͘ઃܭͷνʔϜશମͰͷίϛοτํ๏ઃܭ͢Δ ඞཁ͕͋Δ
͋Γ͕ͱ͏͍͟͝·ͨ͠☺