Slide 1

Slide 1 text

-BZFSFE"SDIJUFDUVSFͰ ֤૚ͷґଘؔ܎ղܾΛ 4XJOKFDUΛ༻͍ͯߦ͏ QPUBUPUJQT!LHNZTIJO

Slide 2

Slide 2 text

ࣗݾ঺հ w ఝٶͰ͢ w ΤϯδχΞͰ͢ w ෱Ԭݝ෱Ԭࢢೆ۠໺ଟ໨ग़਎Ͱ͢

Slide 3

Slide 3 text

͜ͷൃදΛฉ͘৺ߏ͑ w ͜ͷൃද͸ɺʮ΄Βɺ͜Ε͕ਖ਼ٛͩͥʂʯ͍ͬͯ͏ ΋ͷͰ͸͋Γ·ͤΜɻ w ʮ͜͏͍͏΍Γํ΍ͬͯΈͨΒɺ͖ͬ͢Γͨ͠Αʂ ͳΜ͔ଞʹྑ͍΍Γํ͋ͬͨΒڭ͑ͯ͘Εʯͬͯײ ͡ͷൃදͰ͢ɻ w ͱ͍͏ࢫΛ஌্ͬͨͰฉ͍͍ͯͩ͘͞ɻ

Slide 4

Slide 4 text

BHFOEB w %*ͱ͸ w -BZFSFE"SDIJUFDUVSFͱ͸ w ࣮૷ྫ w ·ͱΊ

Slide 5

Slide 5 text

%*ͱ͸

Slide 6

Slide 6 text

%*ͱ͸ w ґଘੑͷ஫ೖ w ͋ΔΫϥεͷͱ͋ΔৼΔ෣͍ʹ͓͚ΔඞཁͳΦϒ δΣΫτΛ֎෦͔Βηοτͯ͋͛͠Δ͜ͱ

Slide 7

Slide 7 text

%*͡Όͳ͍࣌OFX class PokemonListViewController: UIViewController { var pokemonList: [Pokemon] = [] override func viewDidLoad() { let repository = RealmPokemonRepository() pokemonList = repository.findAll() } }

Slide 8

Slide 8 text

%*͡Όͳ͍࣌OFX class PokemonListViewController: UIViewController { var pokemonList: [Pokemon] = [] override func viewDidLoad() { let repository = RealmPokemonRepository() pokemonList = repository.findAll() } }

Slide 9

Slide 9 text

%*͡Όͳ͍࣌TJOHMFUPO class PokemonListViewController: UIViewController { var pokemonList: [Pokemon] = [] override func viewDidLoad() { let repository = RealmPokemonRepository.sharedInstance pokemonList = repository.findAll() } }

Slide 10

Slide 10 text

%*͡Όͳ͍࣌TJOHMFUPO class PokemonListViewController: UIViewController { var pokemonList: [Pokemon] = [] override func viewDidLoad() { let repository = RealmPokemonRepository.sharedInstance pokemonList = repository.findAll() } }

Slide 11

Slide 11 text

%* class PokemonListViewController: UIViewController { var repository: RealmPokemonRepository? var pokemonList: [Pokemon]? override func viewDidLoad() { pokemonList = repository?.findAll() } }

Slide 12

Slide 12 text

%* class PokemonListViewController: UIViewController { var repository: RealmPokemonRepository? var pokemonList: [Pokemon]? override func viewDidLoad() { pokemonList = repository?.findAll() } }

Slide 13

Slide 13 text

-BZFSFE"SDIJUFDUVSF ͱ͸

Slide 14

Slide 14 text

-BZFSFE"SDIJUFDUVSFͱ͸ w ҙຯͷ͋Δ·ͱ·ΓΛ૚ͱ͢Δ w ૚ؒͷґଘ͸ૄʹ͢΂͠ w ͦ͏͢Δ͜ͱͰۃ୺ͳ࿩ɺ૚Λؙ͝ͱεύοͱೖΕସ͑ͨ ΓͰ͖Δ w ϓϨθϯςʔγϣϯϨΠϠʔΛεύοͱΞϓϦ͡Όͳͯ͘΋ ίϚϯυϥΠϯʹ੾Γସ͑ͯ΋࢖͑ΔΑϨϕϧ w ΧʔωϧͩͬͨΓͷԼճΓͰ΋ࣅͨΑ͏ͳߟ͑ํ͋Γ·͢Α Ͷɻ)"-૚ͩͬͨΓɻ

Slide 15

Slide 15 text

૚ؒͷґଘ͕ૄͱ͸ w Լͷ૚͸্ͷ૚ʹґଘ͠ͳ͍ ·ͬͨ͘஌Βͳ͍ w ্ͷ૚͸Լͷ૚ͷJOUFSGBDF QSPUPDPM ͔͠஌Βͳ͍ w 64#Λྫʹ͢ΔͱΘ͔Γ΍͍͔͢΋ʁ
 64#Λ࢖͏ଆ͸ܗͱϓϩτίϧ͚ͩ஌͍ͬͯΕ͹ɺ 64#ଆ͸Կ͕ͬͯ͞͞དྷΔͷ͔શ͘஌Βͳ͍Ͱ 0,ɻ w ͜͜ʹ%*Λ࢖͏ͱྑ͍

Slide 16

Slide 16 text

࣮૷ྫ

Slide 17

Slide 17 text

ྫ͑͹͜Μͳઃܭ Πϯϑϥ૚ σʔλͷӬଓԽͳͲΛ੹຿ͱ͢Δ υϝΠϯ૚ ۀ຿ϩδοΫ૚ ΞϓϦέʔγϣϯ૚ ΞϓϦͷͨΊͷϩδοΫΛఏڙ͢Δ૚ ϓϨθϯςʔγϣϯ૚ Ͳ͏͍͏෩ʹݟ͑Δ͔Λఏڙ͢Δ૚ ্ͷ૚͸Լͷ૚ ʹґଘ͍ͯ͠Δ

Slide 18

Slide 18 text

֓ཁ w ԼهͷͭΛ࡞ͬͨ w *OGSB$POUBJOFS w %PNBJO$POUBJOFS w "QQMJDBUJPO$POUBJOFS w *OKFDUPS

Slide 19

Slide 19 text

999$POUBJOFS w 999$POUBJOFS͸࠷্ҐϨΠϠʔҎ֎ͷϨΠϠʔͰ ࡞Δɻ w ͋ΔQSPUPDPMʹରͯ͠Ͳͷ۩ମΫϥεΛฦ͔͢Λ੹ ຿ͱͯ࣋ͭ͠

Slide 20

Slide 20 text

*OGSB$POUBJOFS w *OGSB-BZFSͰఏڙ͍ͯ͠ΔQSPUPDPMͱ࣮ࡍʹ࢖Θ ΕΔ۩ମΫϥε͕ͲΕͳͷ͔Λఆٛ͢Δ

Slide 21

Slide 21 text

*OGSB$POUBJOFS class InfraContainer { static func register(container: Container) { container.register(UserBehaviorEventRepository.self) { _ in RealmUserBehaviorEventRepository() } container.register(ContentsLoader.self) { _ in InternalContentsLoader() } container.register(AppUpdateChecker.self) { _ in NetworkAppVersionChecker() } container.register(RealmInitializer.self) { r in return RealmInitializer(contentsLoader: r.resolve(ContentsLoader.self)!) } } }

Slide 22

Slide 22 text

*OGSB$POUBJOFS class InfraContainer { static func register(container: Container) { container.register(UserBehaviorEventRepository.self) { _ in RealmUserBehaviorEventRepository() } container.register(ContentsLoader.self) { _ in InternalContentsLoader() } container.register(AppUpdateChecker.self) { _ in NetworkAppVersionChecker() } container.register(RealmInitializer.self) { r in return RealmInitializer(contentsLoader: r.resolve(ContentsLoader.self)!) } } } w ఏڙ͍ͯ͠ΔQSPUPDPM

Slide 23

Slide 23 text

*OGSB$POUBJOFS class InfraContainer { static func register(container: Container) { container.register(UserBehaviorEventRepository.self) { _ in RealmUserBehaviorEventRepository() } container.register(ContentsLoader.self) { _ in InternalContentsLoader() } container.register(AppUpdateChecker.self) { _ in NetworkAppVersionChecker() } container.register(RealmInitializer.self) { r in return RealmInitializer(contentsLoader: r.resolve(ContentsLoader.self)!) } } } w ࣮ࡍʹ࢖ΘΕΔ۩ମΫϥε

Slide 24

Slide 24 text

ॳظԽ @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var injector: Injector? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { let container: Container = Container() InfraContainer.register(container) DomainContainer.register(container) UseCaseContainer.register(container) injector = Injector(container: container) : } : } ֤ϨΠϠʔͷந৅۩ମϚοϓΛొ࿥

Slide 25

Slide 25 text

ॳظԽ @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var injector: Injector? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { let container: Container = Container() InfraContainer.register(container) DomainContainer.register(container) UseCaseContainer.register(container) injector = Injector(container: container) : } : } *OKFDUPSΛ࡞੒

Slide 26

Slide 26 text

*OKFDUPS w Կ͔ʹґଘ͍ͯ͠ΔΦϒδΣΫτʹґଘ͍ͯ͠Δ΋ͷΛηοτͯ͠ ͋͛Δਓ w *OKFDUPS͸DPOUBJOFSΛϝϯόͱͯ࣋ͭ͠ w 7JFX$POUSPMMFSͳͲґଘͯ͠ΔଆຖʹͦΕΛҾ਺ͱͨ͠JOKFDUϝιο υΛ͍࣋ͬͯΔ w *OKFDUPS͸"QQ%FMFHBUF͕࣋ͭ w 7JFX$POUSPMMFSͷWJFX%JE-PBEͳͲͰ BQQ%FMFHBUFJOKFDUPSJOKFDU TFMG Λݺͼग़͢͜ͱͰϝϯόʔ͕JOKFDU ͞ΕΔ

Slide 27

Slide 27 text

*OKFDUPS class InputViewController: UIViewController, UINavigationControllerDelegate { var userBehaviorEventRepository: UserBehaviorEventRepository? = nil : } ͜ͷΑ͏ʹ6TFS#FIBWJPS&WFOU3FQPTJUPSZʹґଘ͢Δ *OQVU7JFX$POUSPMMFS͕͋Δͱ͢Δ

Slide 28

Slide 28 text

*OKFDUPS class Injector { private let container: Container init(container: Container) { self.container = container } func inject(inputViewController: InputViewController) { inputViewController.userBehaviorEventRepository = container.resolve(UserBehaviorEventRepository.self) } func inject(resultViewController: ResultViewController, pokemon: Pokemon) { resultViewController.userBehaviorEventRepository = container.resolve(UserBehaviorEventRepository.self) } } *OKFDUPS͸*OQVU7JFX$POUSPMMFSΛҾ਺ʹ࣋ͬͨJOKFDUϝιο υΛ࣋ͪɺͦ͜Ͱґଘ͍ͯ͠Δ΋ͷΛηοτͯ͋͛͠Δ

Slide 29

Slide 29 text

*OKFDUPS *OKFDUPSΛ༻͍ͯJOKFDUΛݺͿ class InputViewController: UIViewController, UINavigationControllerDelegate { var userBehaviorEventRepository: UserBehaviorEventRepository? = nil override func viewDidLoad() { appDelegate?.injector?.inject(self) : } : }

Slide 30

Slide 30 text

ͳʹ͕ྑ͍͔ʁ վΊͯ ґଘ͢Δଆ͕શ͘۩ମΫϥεΛ஌Βͳͯ͘ྑ͍ class InputViewController: UIViewController, UINavigationControllerDelegate { var userBehaviorEventRepository: UserBehaviorEventRepository? = nil : } த਎͕3FBMNͰͰ͖͍ͯΔͷ͔ͳͲɺ஌Δඞཁͷ ͳ͍͜ͱΛ஌Βͳ͍ɻ

Slide 31

Slide 31 text

ͳʹ͕ྑ͍͔ʁ σʔλ૚ σʔλͷӬଓԽΛ੹຿ͱ͢Δ υϝΠϯ૚ ۀ຿ϩδοΫ૚ ΞϓϦέʔγϣϯ૚ ΞϓϦͷͨΊͷϩδοΫΛఏڙ͢Δ૚ *OGSB$POUBJOFS %PNBJO$POUBJOFS "QQMJDBUJPO $POUBJOFS ͋Δ૚͕ԿΛఏڙ͍ͯ͠Δͷ͔͸ͦͷ૚Ͱͭͷ$POUBJOFS ΛݟΕ͹͙͢Θ͔ΔͷͰɺίʔυΛಡΉͱ͖ʹ໎Θͳ͍ɻ

Slide 32

Slide 32 text

·ͱΊ w ֤ϨΠϠʔͰͲͷΫϥεΛఏڙ͢Δͷ͔ʹ͍ͭͯ੹೚Λ࣋ͬͯ Δਓ͕͍Δ w ֤ϨΠϠʔͷґଘͯ͠Δଆ͸ɺଞͷϨΠϠʔͷ۩ମΫϥεΛҰ ੾஌Βͳͯ͘ྑ͍ w 7JFX$POUSPMMFS͕Ͳ͜ʹσʔλΛอଘ͢ΔͳͲͷ͍Βͳ͍৘ ใΛ஌Βͳͯ͘ྑ͍ w ςετ͠΍͍͢ w γϯάϧτϯʹґଘͨ͠ઃܭ͔Βղ์͞ΕΔ