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
クリーンアーキテクチャとiOSアプリ開発のためのVIPERと
Search
yimajo
January 20, 2020
Technology
520
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
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
880
いま中途半端なSwift 6対応をするより、Default ActorやApproachable Concurrencyを有効にしてからでいいんじゃない?
yimajo
2
690
11年かかって やっとVibe Codingに 時代が追いつきましたね
yimajo
1
390
iOSアプリ開発で 関数型プログラミングを実現する The Composable Architectureの紹介
yimajo
3
330
良いテストコードのために悪いテストコードを理解する - 不安定なテスト編: iOSアプリ開発ユニットテストの場合
yimajo
22
6.8k
TCAの Shared Stateって どういう仕組みになってんの?
yimajo
0
2.7k
Swift 5.9 からの Observation はiOS17 未満 からも使えて struct の変更検知もできるんすかね?
yimajo
2
1.2k
不安定なテストは200種類あんねん
yimajo
3
1.2k
TCA v0.19.0からのSwitchStore/CaseLetが良い
yimajo
0
2k
Other Decks in Technology
See All in Technology
CIで使うClaude
iwatatomoya
0
290
[2026-07-15] AI Ready なはずだったアーキテクチャと、見えてきた課題・次に目指す状態
wxyzzz
9
4k
LLM/Agent評価:トップ営業の発言を「正解」にする 〜暗黙的正解による評価を営業資産に変える〜
takkuhiro
1
230
誤解だらけの開発生産性 / Myths and Misconceptions about Developer Productivity
i35_267
2
790
そのドキュメント、自動化しませんか?
yuksew
1
290
Terraform共通モジュールをチーム横断で“変えられる”運用へ ― リリースと適用の分離
kekke_n
1
3.3k
「早く出す」より「事業に効く」 ── 顧客の業務サイクルから逆算するAI時代の二重ループ開発と「変化の設計者」 / devsumi2026
rakus_dev
1
360
DatabricksにおけるMCPソリューション
taka_aki
1
270
実践!既存 Project への AI-Driven Development 適用〜 一ヶ月で Project 唯一のフロントエンドエンジニアを作り出せ〜
lycorptech_jp
PRO
0
200
美しいコードを書くためにF#を学んでみた話
yud0uhu
1
460
Amazon EVS で VCF 9.0 / 9.1 のサポート開始まとめ
mtoyoda
0
310
Genie Ontologyは銀の弾丸かを考える / Is Genie Ontology a Silver Bullet?
nttcom
0
390
Featured
See All Featured
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
610
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
We Have a Design System, Now What?
morganepeng
55
8.2k
The untapped power of vector embeddings
frankvandijk
2
1.8k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
Optimising Largest Contentful Paint
csswizardry
37
3.8k
For a Future-Friendly Web
brad_frost
183
10k
Amusing Abliteration
ianozsvald
1
230
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
460
Visualization
eitanlees
152
17k
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Λ શϨΠϠʔͰͬͯͦΕʹґଘ͢ΔͷΫϦʔϯΞʔΩςΫνϟతͰͳ͍͚Ͳ ͦΕ֮ޛ͕͋ͬͯΔΜͳΒྑ͍ͱࢥ͍·͢