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
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
クリーンアーキテクチャとiOSアプリ開発のためのVIPERと
Search
yimajo
January 20, 2020
Technology
530
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
360
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
920
いま中途半端なSwift 6対応をするより、Default ActorやApproachable Concurrencyを有効にしてからでいいんじゃない?
yimajo
2
740
11年かかって やっとVibe Codingに 時代が追いつきましたね
yimajo
1
410
iOSアプリ開発で 関数型プログラミングを実現する The Composable Architectureの紹介
yimajo
3
340
良いテストコードのために悪いテストコードを理解する - 不安定なテスト編: 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
Other Decks in Technology
See All in Technology
Podは生きているのにGoだけが落ちる:GOGCとGOMEMLIMITで追うInvisible OOM Killの謎
tkc66buzz
1
220
GoCon2026 - Open Source, Open World
sanposhiho
2
610
全員がプロダクトへ向き合う組織を持続成長させるために——組織づくりのフライホイールと4象限 / The Flywheel Model and Four Quadrants for Organizational Design
hiro_torii
4
930
振り返りこそエンジニアの本領
negima
0
350
Tab5をRubyで動くパソコンにする
kishima
2
280
多層防御と最⼩権限で実現する、安全なAIエージェント設計パターン
lycorptech_jp
PRO
1
240
Snowflakeで実現する全社横断の顧客の声(VOC)分析・活用基盤@Snowflake World Tour Tokyo 2026
yuto16
0
120
Bet AI Day 2026丨Production-Ready AI Agents — エンタープライズの実務を任せるための設計と運用
layerx
PRO
4
2.7k
Amazon S3 Tablesに全部任せてみた結果——コンパクション/スナップショット管理は本当に手放せるか
shigeruoda
0
430
ASTを使って影響範囲を特定する
nealle
0
120
AIで実装は速くなった。なのにプロダクトは速くならない。職能の壁を越えて価値のフローを設計する
nwiizo
7
7.5k
日経電子版を支えていく Kasane Design System/fec_fukuoka
nikkei_engineer_recruiting
0
280
Featured
See All Featured
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
230
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
260
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
240
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
870
Done Done
chrislema
186
16k
Automating Front-end Workflow
addyosmani
1369
210k
Ruling the World: When Life Gets Gamed
codingconduct
0
330
Building Flexible Design Systems
yeseniaperezcruz
330
41k
Ethics towards AI in product and experience design
skipperchong
2
360
Abbi's Birthday
coloredviolet
3
9.9k
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Λ શϨΠϠʔͰͬͯͦΕʹґଘ͢ΔͷΫϦʔϯΞʔΩςΫνϟతͰͳ͍͚Ͳ ͦΕ֮ޛ͕͋ͬͯΔΜͳΒྑ͍ͱࢥ͍·͢