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
クリーンアーキテクチャとiOSアプリ開発のためのVIPERと
Search
yimajo
January 20, 2020
Technology
540
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
クリーンアーキテクチャとiOSアプリ開発のためのVIPERと
yimajo
January 20, 2020
More Decks by yimajo
See All by yimajo
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
400
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
950
いま中途半端なSwift 6対応をするより、Default ActorやApproachable Concurrencyを有効にしてからでいいんじゃない?
yimajo
2
770
11年かかって やっとVibe Codingに 時代が追いつきましたね
yimajo
1
410
iOSアプリ開発で 関数型プログラミングを実現する The Composable Architectureの紹介
yimajo
3
360
良いテストコードのために悪いテストコードを理解する - 不安定なテスト編: iOSアプリ開発ユニットテストの場合
yimajo
22
6.9k
TCAの Shared Stateって どういう仕組みになってんの?
yimajo
0
2.8k
Swift 5.9 からの Observation はiOS17 未満 からも使えて struct の変更検知もできるんすかね?
yimajo
2
1.2k
不安定なテストは200種類あんねん
yimajo
3
1.3k
Other Decks in Technology
See All in Technology
Post AI時代のリファクタリング実践記 / Refactoring in the post AI era
kaminashi
1
320
freeeにおける AI を用いた ブラウザ動作確認の自動化の取り組み
freee
PRO
0
120
macOS Golden Gate 時代のMac管理
tategami
0
120
Rustuna: Rustによる高速なOptuna実装
pfn
PRO
0
210
オントロジーって 結局なにもの? AI エージェントに「意味」を渡す知識設計の話
greenmidori
0
260
古い指輪から広がった JAVA コミュニティ とのつながり
yamad
0
140
日本語に強いオープンな大規模言語モデル「LLM-jp」
odashi
5
1.2k
AIカンパニーへの転換を支えた、エンジニアの仕事の再定義
kworkdev
PRO
2
1.4k
20年間 SNS サービス「GREE」 を支えた技術の刷新と、長期運用サービスの Kubernetes へのリアーキテクト
gree_tech
PRO
0
110
CTO Night|NotionのAIエージェントとFDE
kzkhykw1991
0
300
野蛮なアジャイル [サイボウズ発!]組織の常識を覆した反骨のスクラム実践記 / Barbaric Agile - Enterprise Agile Study Group
ama_ch
0
120
ガチで放置できるClaude Code実行環境の作り方.pdf
lamaglama39
0
1.9k
Featured
See All Featured
Designing for humans not robots
tammielis
254
26k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
590
Exploring anti-patterns in Rails
aemeredith
4
540
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.5k
Believing is Seeing
oripsolob
1
250
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Product Roadmaps are Hard
iamctodd
55
13k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
890
Technical Leadership for Architectural Decision Making
baasie
3
610
The Language of Interfaces
destraynor
162
27k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.5k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
410
Transcript
ΫϦʔϯΞʔΩςΫνϟͱ J04ΞϓϦ։ൃͷͨΊͷ 7*1&3ͱ J04$MFBO"SDIJUFDUVSFษڧձTQPOTPSFECZ4BOTBO !ZJNBKP
w ΫϦʔϯΞʔΩςΫνϟຊʢҎԼ$"ຊʣࢲʹಡΈͮΒ͍ w ख์͠Ͱྑ͍ຊʂͱݴ͍ͮΒ͍ w ͕ࣗཧղͰ͖͔ͨͲ͏͔ո͍͠ ͡Ίʹ
ΫϦʔϯΞʔΩςΫνϟͰ͏ ʰґଘؔٯసͷݪଇʢ%*1ʣʱ ʹ͍ͭͯͷٙ
ϓϩάϥϛϯάͷجૅͰ͋Δ ʮநʹରͯ͠ϓϩάϥϛϯάͤΑʯͱ͍͏ࣄͱ ʰґଘؔٯసͷݪଇ %*1 ʱ ͱ͍͏ݴ༿ͷҧ͍Կʁ ͓Μͳ͜͡ͱΛΘ͟Θ͟ݪଇʹ͢Δͷʁ
$"ຊΛԿಡ ΜͰͬͱ ٯసΛཧղͰ͖ͨ
࣍ͷਤґଘؔٯసͷݪଇͰ͔͢ DMBTT 3FQPSU(FOFSBUPS DMBTT $PSF%BUB.BOBHFS ίʔυͷݺͼग़͠ QSPUPDPM %BUB(BUFXBZ ४ڌ ͜Ε୯७ʹେੲ͔ΒݴΘΕͯΔ
ʮநʹରͯ͠ϓϩάϥϛϯάͤΑʯΛ ࣮ݱ͍ͯ͠Δ͚ͩͰʁ
ࢲͷײ ͜ͷ୯७ͳநܕͷར༻ςΫχοΫ ʰґଘؔٯసʱ͚ͩͲ ʰґଘؔٯసͷݪଇʱ Ͱͳ͍
ࢲͷײ ʰґଘؔٯసͷݪଇʱݫີʹɺ ෳϞδϡʔϧ͕͋Δ߹ʹɺ Ϟδϡʔϧͷґଘ͕ؔٯస͢Δͱ͖ ͷΈͦΕ͕ద༻͞ΕΔͷͰ
Θ͔Γ͢͞ͷͨΊ J04ΞϓϦ։ൃతʹ &NCFEEFE'SBNFXPSLʹΑΓ Ϟδϡʔϧׂͯ͠ ̎ͭͷϞδϡʔϧͰͷྫΛߟ͑·͢
DMBTT 3FQPSU(FOFSBUPS Ϟδϡʔϧ" Ϟδϡʔϧ# ίʔυͷݺͼग़͠ ґଘؔ Ϟδϡʔϧ"Ϟδϡʔϧ#ʹґଘ͍ͯ͠Δɻ Ϟδϡʔϧ"͕#ΛݺͿྫ DMBTT $PSF%BUB.BOBHFS
JNQPSU.PEVMF# DMBTT3FQPSU(FOFSBUPS\ MFUEBUB$PSF%BUBNBOBHFS ʜ ^
DMBTT 3FQPSU(FOFSBUPS Ϟδϡʔϧ" Ϟδϡʔϧ# ίʔυͷݺͼग़͠ ґଘؔ Ϟδϡʔϧ"Ϟδϡʔϧ#ʹґଘ͍͕ͯͨ͠ɺϓϩτίϧར༻ʹΑͬͯɺ Ϟδϡʔϧ#͕Ϟδϡʔϧ"ʹґଘ͠͡Ίͨʂʂʜٯసʂʂʂʂ QSPUPDPM %BUB(BUFXBZ
४ڌ Ϟδϡʔϧ#͕"ͷϓϩτίϧʹ४ڌͤ͞Δ DMBTT $PSF%BUB.BOBHFS ͜ͷ߹ͷϓϩτίϧϞδϡʔϧ"ʹॴଐͤ͞ͳ͚Εٯస͠ͳ͍
$"ຊͰ w ͨͩͷநܕͷར༻Λʰґଘؔٯసʱͱ͍ͯ͠Δͷ͕ฆΒΘ͍͠ w $"ຊୈ̑ষʢਤʣ w zιʔείʔυͷґଘؔͱ੍ޚͷํͱٯస w ຊʹϞδϡʔϧͷґଘ͕ؔٯస͢Δ͜ͱ͕ʰґଘؔٯసͷݪ ଇʱͱ͍ͯ͠Δ
w $"ຊୈ̔ষʢਤʣ w z*OUFSBDUPSίϯϙʔωϯτ͔Β%BUBCBTFίϯϙʔωϯτͷ ґଘؔΛٯస
ʰґଘؔٯసͷݪଇʱ ʰґଘؔٯసͷݪଇʱ Ͱͳ͍ *OUFSBDUPSϞδϡʔϧ $POUSPMMFSϞδϡʔϧ %BUBCBTFϞδϡʔϧ
ࣗݾհ w ג ΩϡϦΦγςΟιϑτΣΞ w J04ΞϓϦ։ൃΛੜۀ
ࣗݾհ w BTZODBXBJUݚڀಡຊ w w 3Y4XJGUݚڀಡຊ* ** *** w
w 7*1&3ݚڀಡຊ* w IUUQTTXJGUCPPUIQN
ຊ
ࠓճൃද͍ͨ͜͠ͱ w ͳͥ7*1&3͔ w ΫϦʔϯΞʔΩςΫνϟ $" ͷJ04࣮ύλʔϯͰ͋Δ 7*1&3ͷαϯϓϧίʔυൺֱ w େͷ7*1&3$"ຊʹ͋Δґଘؔٯసͷݪଇ
%*1 Λద ༻͍ͯ͠ͳ͍
ͳͥ7*1&3͔ w 7*1&3ΫϦʔϯΞʔΩςΫνϟ $" ΛJ04ΞϓϦ։ൃʹ෦తʹద༻͠ ͨͷ w 7JFX *OUFSBDUPS 1SFTFOUFS
&OUJUZ 3PVUFSͷύʔπ͝ͱʹΛ ׂ͍ͯ͠Δ 7JFX 3PVUFS 1SFTFOUFS *OUFSBDUPS &OUJUZ %FMFHBUF *OUFSBDUPSΛॴ࣋͠ ߋ৽Λཁٻ͢Δ ૢ࡞ 3PVUFSΛॴ࣋͠ ը໘ભҠٴͼ දࣔΛߦ͏ 7JFXΛॴ࣋͠ ը໘ભҠΛ࣮ߦ͢Δ DPNQMFUJPO 3FTVMU4VDDFTT &SSPS ׂ ΠϕϯτΛ1SFTFOUFSʹ͑ɺ σʔλͷදࣔΛߦ͏ɻ ׂ ը໘ભҠͷͨΊ࣍ͷը໘ͷ੍ޚΛ୲͢Δɻ ΤϥʔΛදࣔ͢Δ͚ͩͷ6*"MFSU$POUSPMMFSදࣔߦ͍͍͢ɻ ׂ ϏδωεϩδοΫΛ୲͢Δ ׂ σʔλΛΧϓηϧԽ͢Δ ׂ 7JFX͔ΒͷೖྗΛड৴͠ɺ *OUFSBDUPSσʔλΛཁٻ͢Δɻ 6*,JUʹґଘͤͣɺ දࣔ͢ΔͷΛ7JFXʹ͑Δɻ ॴ࣋ ௨ ૢ࡞ 1SFTFOUFSΛॴ࣋͠ ΞΫγϣϯΛ͑Δ
7*1&3ͷܥේ ຊՈPCKDJPJTTVFWJQFS ຊՈPCKDJPJTTVFWJQFSTXJGU QFESPIQFSBMUB"SUJDMFTJ047*1&3 KB[[CQO7*1&3%&.0 ΞϯΫϧϘϒʹΑΔΫϦʔϯΞʔΩςΫνϟ ʜ ʜ
ͳ༷ͥʑͳ7*1&3͕ʜ
ຊՈ7*1&3 w w PCKDJPʹدߘ w 50%0ΞϓϦ w $PSF%BUBΛͬͯΔ w
ܕมͷ໋໊͕ΠϚΠν w ΞϓϦىಈ࣌ʹશը໘ͷґଘ ؔΛղܾ
QFESPIQFSBMUB"SUJDMFT J047*1&3 w w $IFFTDBLF-BCT w 344ͷهࣄΛදࣔ w "MBNPpSF3Y4XJGUΛͬͯ
Δ w ܕมͷ໋໊͕ྑ͘ͳͬͨ w 3PVUFS͕ґଘؔΛղܾ
7*1&3αϯϓϧͷڞ௨ w $PSF%BUB3Y4XJGU"MBNPpSFͳͲͷϑϨʔϜϫʔΫʹʰґଘؔ ٯసͷݪଇʱΛద༻͍ͯ͠ͳ͍ w *OUFSBDUPS͕$PSF%BUBʹґଘ w *OUFSBDUPS͕"MBNPpSF3Y4XJGUʹґଘ
%*1ΛΘͳ͍͜ͱͷ σϝϦοτΛղܾ͢Δʹ w $PSF%BUB"MBNPpSFΛΓ ସ͍͑ͨͳΒ w *OUFSBDUPSࣗମΛೖΕସ͑Δ 7JFX 3PVUFS 1SFTFOUFS
*OUFSBDUPS &OUJUZ %FMFHBUF *OUFSBDUPSΛॴ࣋͠ ߋ৽Λཁٻ͢Δ ૢ࡞ 3PVUFSΛॴ࣋͠ ը໘ભҠٴͼ දࣔΛߦ͏ 7JFXΛॴ࣋͠ ը໘ભҠΛ࣮ߦ͢Δ DPNQMFUJPO 3FTVMU4VDDFTT &SSPS ׂ ΠϕϯτΛ1SFTFOUFSʹ͑ɺ σʔλͷදࣔΛߦ͏ɻ ׂ ը໘ભҠͷͨΊ࣍ͷը໘ͷ੍ޚΛ୲͢Δɻ ΤϥʔΛදࣔ͢Δ͚ͩͷ6*"MFSU$POUSPMMFSදࣔߦ͍͍͢ɻ ׂ ϏδωεϩδοΫΛ୲͢Δ ׂ σʔλΛΧϓηϧԽ͢Δ ׂ 7JFX͔ΒͷೖྗΛड৴͠ɺ *OUFSBDUPSσʔλΛཁٻ͢Δɻ 6*,JUʹґଘͤͣɺ දࣔ͢ΔͷΛ7JFXʹ͑Δɻ ॴ࣋ ௨ ૢ࡞ 1SFTFOUFSΛॴ࣋͠ ΞΫγϣϯΛ͑Δ
%*1ΛΘͳ͍͜ͱͷ σϝϦοτΛղܾ͢Δʹ w $PSF%BUB3FBMNͳͲʹґଘ ͠ͳ͍Α͏ʹ w σʔλߏ ʢ.BOBHFE0CKFDU 3FBMN0CKFDUʣΛϓϨʔϯ ͳ4USVDUʹมͯ͠7JFX·
Ͱ͍࣋ͬͯ͘ 7JFX 3PVUFS 1SFTFOUFS %FMFHBUF *OUFSBD ߋ৽Λ 3PVUFSΛॴ࣋͠ ը໘ભҠٴͼ දࣔΛߦ͏ 7JFXΛॴ࣋͠ ը໘ભҠΛ࣮ߦ͢Δ DPNQMFUJPO 3FTVMU ׂ ΠϕϯτΛ1SFTFOUFSʹ͑ɺ σʔλͷදࣔΛߦ͏ɻ ׂ ը໘ભҠ ΤϥʔΛ ׂ 7JFX͔ΒͷೖྗΛड৴͠ *OUFSBDUPSσʔλΛཁ 6*,JUʹґଘͤͣɺ දࣔ͢ΔͷΛ7JFXʹ ॴ࣋ ௨ ૢ࡞ 1SFTFOUFSΛॴ࣋͠ ΞΫγϣϯΛ͑Δ ٭͜Εಛผ7*1&3తͳղܾํ๏ͱ͍͏Θ͚Ͱ͋Γ·ͤΜ
͜͜·Ͱͷ7*1&3·ͱΊ w ͳΜͰ͜Μͳ৭ʑͳ7*1&3͋Δͷʁ w ݫີʹ$"ʹԊ͓ͬͯΒͣϑϨʔϜϫʔΫґଘ͕͋Δ w ຊՈͷܕ໊ม໊ͷϨΨγʔײ w ݫີʹ$"ʹԊͬͯͳ͍͜ͱͷσϝϦοτʁ w
ׂͱղܾͰ͖Δ w ͦͦ%#௨৴ϥΠϒϥϦΛஔ͖͑Δ͜ͱͬͯ͋Δ ͷ͔ʁͱ͍͏ׂΓΓʜ
ࢀߟʹͳΔ 7*1&3࣮ʁ
7*1&3ݚڀಡຊ w ͜ͷຊͳΓͷ7*1&3αϯϓϧ࡞ w νʔϜͰͬͯ͘ͷʹ͓͢͢Ί ͳ6TF$BTFϓϩτίϧ w ςετίʔυͷར༻Օॴ
6TF$BTF protocol UseCase where Failure: Error { associatedtype Parameters //
Ҿͷܕ associatedtype Success // ޭͨ͠ࡍͷܕ associatedtype Failure // ࣦഊ࣌ͷErrorNeverʹͰ͖ΔΑ͏ʹ func execute(_ parameters: Parameters, completion: ((Result<Success, Failure>) -> ())?) func cancel() } 7*1&3Λ͍ͨ͘ͳΔཁٻͬͯɺܕʹቕΊΒΕ੍ͨͷͱͰ νʔϜͰϒϨͳ͘ϓϩάϥϛϯά͕͍ͨ͠Μ͡Όͳ͍ͷ͔ͳͱ
1SFTFOUFSΛςετ͍ͨ͠ͳΒ 5FTU%PVCMF 7JFX 5FTU%PVCMF 3PVUFS 1SFTFOUFS 5FTU%PVCMF *OUFSBDUPS &OUJUZ ςετ༻ͷσʔλ
͘͠ςετ༻ΤϥʔΛग़ྗ͢Δ ༻ҙͨ͠ςετσʔλΛηοτ͠ɺ ৗʹͦΕΛग़ྗ͢Δɻ 1SFTFOUFSͷΤϥʔϋϯυϦϯάΛ ςετ͚ͨ͠Εɺ ΤϥʔΛฦͤΔผͷ5FTU%PVCMF ༻ҙ͢Δɻ 1SFTFOUFSͷग़ྗͱͯ͠7JFXͷEFMFHBUFϝιου͕ಈ࡞ɻ ͦͷϝιου͔ΒظͱΛൺֱ͢Δ ظͱͷൺֱݕূՕॴ ςετίʔυ͔Βͷݺͼग़͠ 1SFTFOUFSͷग़ྗͱͯ͠3PVUFSʹσʔλ͕͞ΕΔ ͦͷϝιου͔ΒظͱΛൺֱ͢Δ
ॲཧܦ࿏Λ௵ͨ͢Ίʹ ςετίʔυόϦΤʔγϣϯΛ૿͢
༨ஊ w ΫϦʔϯΞʔΩςΫνϟͰநͰͳ͘۩Λ͍ͬͯ Δྫ͋Δʢ$"ຊୈষʣ w 4USJOH҆ఆͨ͠۩ͳͷͰґଘ͍͍ͯ͠ w 4USJOH͕ίϩίϩมΘΔ͜ͱؾʹ͠ͳ͍͍ͯ͘ w ґଘͨ͘͠ͳ͍ͷมԽ͍͢͠۩ཁૉ
ͨ·ʹϝδϟʔόʔδϣϯͰ༷มΘͬͨΓ͢Δ3Y4XJGUΛ શϨΠϠʔͰͬͯͦΕʹґଘ͢ΔͷΫϦʔϯΞʔΩςΫνϟతͰͳ͍͚Ͳ ͦΕ֮ޛ͕͋ͬͯΔΜͳΒྑ͍ͱࢥ͍·͢