Copyright (C) 2018 DeNA Co.,Ltd. All Rights Reserved.Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.θϩΠνϑΣʔζ͔ΒͷClean ArchitectureiOS Clean Architecture ษڧձJanuary 21, 2020Hiroshi ShikataHealthcare DeNA Co., Ltd.1
View Slide
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.ࣗݾհ■ ࢛ํɹ༟■ 20186݄ Sansan → DeNA■ DeNAͷϔϧεέΞࣄۀ෦Ͱ৽نαʔϏε։ൃΛ୲■ DeNAʹೖࣾͯ͠1Ͱ15kg૫ͤ·ͨ͠■ ৄ͘͠ DeNA TechCon 2020 Ͱ͠·͢■ 2020/03/04 Wed. @ ौ୩ώΧϦΤ2
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.3৽نαʔϏε։ൃͷ
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.ϔϧεέΞͷ৽نαʔϏε։ൃ■ 1ͰϔϧεέΞؔ࿈ΞϓϦ3ຊΛ৽ن։ൃ■ ͍ͣΕඇClean Architecture■ ͏ͪҰຊ͓ଂೖΓ■ ݱࡏ4ຊͷΞϓϦΛ։ൃத■ Clean ArchitectureΛ࠾༻4
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.ϓϩδΣΫτ■ ։ൃظؒ■ 2ʙ10ϲ݄■ ։ൃظؒʹ༨༟͕͋Δ͕ɺ࣮ࡍʹ࡞ͬͯΈͯݫͦ͠͏ͳΒଧͪΔ͜ͱ■ ςετظؒͳͲผϓϩδΣΫτͷ։ൃฒ■ ։ൃମ੍■ ΞϓϦ1໊ɺόοΫΤϯυ2໊■ ਓͷग़ೖΓ■ ͨ·ʹԉ܉͕ૹΒΕͯ͘ΔʢϨϕϧײ·ͪ·ͪʣ5
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.6ϓϩδΣΫτߏ
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.AppϓϩδΣΫτߏ7Classes/UI/ViewControllers/Embedded FrameworkEntity/AccessToken.swiftUseCase/InterfaceAdapter/Framework_Driver/DataStore/WebClient/AppDelegate.swiftDomainLayerDependency.swiftAppRoot/Login/AppRootViewController.swiftUI/Components/UI/Protocols/LoginViewController.swiftLoginViewModel.swiftLoginViewRouter.swiftAccessToken.swiftAuthUseCase.swiftAuthGateWay.swiftKeychainDataStore.swiftAuthWebAPI.swift
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.AppϓϩδΣΫτߏ8Classes/UI/ViewControllers/Embedded FrameworkEntity/AccessToken.swiftUseCase/InterfaceAdapter/Framework_Driver/DataStore/WebClient/AppDelegate.swiftLayerDependency.swiftAppRoot/Login/AppRootViewController.swiftUI/Components/UI/Protocols/LoginViewController.swiftLoginViewModel.swiftLoginViewRouter.swiftAccessToken.swiftAuthUseCase.swiftAuthGateWay.swiftKeychainDataStore.swiftAuthWebAPI.swiftϓϨθϯςʔγϣϯ υϝΠϯ
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.AppϓϩδΣΫτߏ9Classes/UI/ViewControllers/AppDelegate.swiftDomainLayerDependency.swiftAppRoot/Login/AppRootViewController.swiftUI/Components/UI/Protocols/LoginViewController.swiftLoginViewModel.swiftLoginViewRouter.swiftUseCaseͷΠϯελϯεΛอ࣋͢Δ Singleton
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.AppϓϩδΣΫτߏ10Classes/UI/ViewControllers/AppDelegate.swiftDomainLayerDependency.swiftAppRoot/Login/AppRootViewController.swiftUI/Components/UI/Protocols/LoginViewController.swiftLoginViewModel.swiftLoginViewRouter.swift• UIWindowͷrootViewController• εϓϥογϡ/ΥʔΫεϧʔͳͲφϏήʔγϣϯͷىΛchildViewControllerͱͯ͠อ࣋&Γସ͑
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.AppϓϩδΣΫτߏ11Classes/UI/ViewControllers/AppDelegate.swiftDomainLayerDependency.swiftAppRoot/Login/AppRootViewController.swiftUI/Components/UI/Protocols/LoginViewController.swiftLoginViewModel.swiftLoginViewRouter.swift
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.Router12ը໘͔Βൃੜ͢Δը໘ભҠΛఆٛ
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.TransitionProtocol13ը໘ભҠ͕ൃੜ͢ΔViewControllerʹ࣋ͨͤΔΠϯλʔϑΣʔεʢProgressΛ͜͜ʹ࣋ͨͤΔ͔͔ͳΓ໎ͬͨʣ
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.AppϓϩδΣΫτߏ14Classes/UI/ViewControllers/AppDelegate.swiftDomainLayerDependency.swiftAppRoot/Login/AppRootViewController.swiftUI/Components/UI/Protocols/LoginViewController.swiftLoginViewModel.swiftLoginViewRouter.swift• ViewController͔ΒUseCaseͷΠϯελϯεΛड͚औΔ• υϝΠϯϩδοΫͱͷ
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.ϓϩδΣΫτߏ15Embedded FrameworkEntity/AccessToken.swiftUseCase/InterfaceAdapter/Framework_Driver/DataStore/WebClient/AccessToken.swiftAuthUseCase.swiftAuthGateWay.swiftKeychainDataStore.swiftAuthWebAPI.swift• ϓϨθϯςʔγϣϯͱͷ
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.ϓϩδΣΫτߏ16Embedded FrameworkEntity/AccessToken.swiftUseCase/InterfaceAdapter/Framework_Driver/DataStore/WebClient/AccessToken.swiftAuthUseCase.swiftAuthGateWay.swiftKeychainDataStore.swiftAuthWebAPI.swift• UseCase͔Βެ։͞Εͨprotocolͷ࣮• ௨৴ͱσʔλͷ֨ೲΛ࣮ࡍʹߦ͏
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.ϓϩδΣΫτߏ17Embedded FrameworkEntity/AccessToken.swiftUseCase/InterfaceAdapter/Framework_Driver/DataStore/WebClient/AccessToken.swiftAuthUseCase.swiftAuthGateWay.swiftKeychainDataStore.swiftAuthWebAPI.swift• GateWay͔Βެ։͞Εͨprotocolͷ࣮• σʔλͷऔಘ֨ೲͷΈΛߦ͏
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.18Clean Architecture & Embedded Framework Λ͏ϝϦοτ
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.19։ൃࢹ
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.։ൃࢹͰͷϝϦοτ■ ૄ݁߹■ Ͳ͜ʹͳʹ͕࣮͞Ε͍ͯΔ͔͕ࣗ໌ʹͳΔ■ DIͰϩδοΫͷࠩ͠ସ͕͑༰қʹͳΔ■ ϓϩτλΠϐϯάಈ࡞֬ೝͷදࣔσʔλग़͚͠■ ϝϯόʔͷೖΕସΘΓ■ ϝϯόʔͷεΩϧϨϕϧʹ߹Θ࣮ͤͯΛϨΠϠʔ୯ҐͰ୲Ͱ͖Δ■ iOSʹशख़͍ͯ͠ͳͯ͘UI͚ͩɺϏδωεϩδοΫ͚ͩΓग़ͤΔ■ iOSʹशख़͍ͯ͠ΔਓΩϟονΞοϓָ͕ʹͳΔ20
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.21ϓϩμΫτࢹ
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.ϔϧεέΞϓϩμΫτࢹͰͷϝϦοτ22APP ShowAppWatch Extension WidgetͷରԠָ͕ʹͳΔEmbedded Framework✘✔
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.23ࣄۀࢹ
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.ࣄۀࢹͰͷϝϦοτ݈߁ߦಈ × ސ٬ͰෳͷαʔϏεΛ࡞͍ͬͯΔ24า͘ ݮྔ ېԎB2B2C αʔϏεA αʔϏεB αʔϏεCB2C αʔϏεD αʔϏεE ?B2C(ΞϥΠΞϯε)αʔϏεF ? ?
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.ࣄۀࢹͰͷϝϦοτ݈߁ߦಈ × ސ٬ͰෳͷαʔϏεΛ࡞͍ͬͯΔ25UIҟͳΔ͕݈߁ߦಈ͝ͱͷϏδωεϩδοΫࣅ͍ͯΔา͘ ݮྔ ېԎB2B2C αʔϏεA αʔϏεB αʔϏεCB2C αʔϏεD αʔϏεE ?B2C(ΞϥΠΞϯε)αʔϏεF ? ?→υϝΠϯϩδοΫΛΓग़͓ͯ͘͜͠ͱͰผϓϩμΫτͰ࠶ར༻Ͱ͖Δ
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.26Embedded Framework ͷׂʹ͍ͭͯ
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.Embedded Framework Ͳ͏͚Δʁ27Embedded FrameworkEntity/UseCase/InterfaceAdapter/Framework_Driver/Embedded Framework (InterfaceAdapter)Embedded Framework (Entity)Embedded Framework (UseCase)Embedded Framework (Framework_Driver)VS
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.ͳͥ Embedded Framework ͕Ұ͚ͭͩͳͷ͔■ νʔϜʹXcodeϓϩδΣΫτઃఆͷख࿅͕͍ͳ͍ͱ٧ΉϦεΫ■ XcodeͷTargetઃఆ■ ϥΠϒϥϦՃ■ ґଘؔ■ Entity <-UseCase <- InterfaceAdapter <- Framework/Driver■ ͋ͱ͔ΒׂͰ͖ͳ͘ͳ͍28
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.29·ͱΊ
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.30θϩΠνϑΣʔζ͔ΒClean ArchitectureΛಋೖ͢Δ
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.ʰٕज़తࢿʱͱͯ͠Ϧλʔϯ͕ݟࠐΊΔͳΒ͋ΓͰ■ ϔϧεέΞͷ߹Ϧλʔϯ͕ݟࠐΊͦ͏ˍֶशίετΛڐ༰Ͱ͖ͦ͏ͳͷͰಋೖͨ͠■ ελʔτΞοϓϕϯνϟʔͳͲখنorظϓϩδΣΫτͩͱݫͦ͠͏■ ࣄۀ/ϓϩμΫτ/։ൃͷࢹͰϦιʔεΛࢿ͖͔͢ͷஅΛ31
Copyright (C) 2020 DeNA Co.,Ltd. All Rights Reserved.32