$30 off During Our Annual Pro Sale. View Details »

layered arch with swinject

layered arch with swinject

potatotips#34で話した際に使ったスライドです。iOSの話です。

Shinnosuke Kugimiya

October 26, 2016
Tweet

More Decks by Shinnosuke Kugimiya

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  5. %*ͱ͸

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  13. -BZFSFE"SDIJUFDUVSF
    ͱ͸

    View Slide

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

    View Slide

  15. ૚ؒͷґଘ͕ૄͱ͸
    w Լͷ૚͸্ͷ૚ʹґଘ͠ͳ͍ ·ͬͨ͘஌Βͳ͍

    w ্ͷ૚͸Լͷ૚ͷJOUFSGBDF QSPUPDPM
    ͔͠஌Βͳ͍
    w 64#Λྫʹ͢ΔͱΘ͔Γ΍͍͔͢΋ʁ

    64#Λ࢖͏ଆ͸ܗͱϓϩτίϧ͚ͩ஌͍ͬͯΕ͹ɺ
    64#ଆ͸Կ͕ͬͯ͞͞དྷΔͷ͔શ͘஌Βͳ͍Ͱ
    0,ɻ

    w ͜͜ʹ%*Λ࢖͏ͱྑ͍

    View Slide

  16. ࣮૷ྫ

    View Slide

  17. ྫ͑͹͜Μͳઃܭ
    Πϯϑϥ૚ σʔλͷӬଓԽͳͲΛ੹຿ͱ͢Δ

    υϝΠϯ૚ ۀ຿ϩδοΫ૚

    ΞϓϦέʔγϣϯ૚ ΞϓϦͷͨΊͷϩδοΫΛఏڙ͢Δ૚

    ϓϨθϯςʔγϣϯ૚ Ͳ͏͍͏෩ʹݟ͑Δ͔Λఏڙ͢Δ૚

    ্ͷ૚͸Լͷ૚
    ʹґଘ͍ͯ͠Δ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  21. *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)!)
    }
    }
    }

    View Slide

  22. *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

    View Slide

  23. *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 ࣮ࡍʹ࢖ΘΕΔ۩ମΫϥε

    View Slide

  24. ॳظԽ
    @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)
    :
    }
    :
    }
    ֤ϨΠϠʔͷந৅۩ମϚοϓΛొ࿥

    View Slide

  25. ॳظԽ
    @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Λ࡞੒

    View Slide

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

    View Slide

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

    View Slide

  28. *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ϝιο
    υΛ࣋ͪɺͦ͜Ͱґଘ͍ͯ͠Δ΋ͷΛηοτͯ͋͛͠Δ

    View Slide

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

    View Slide

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

    View Slide

  31. ͳʹ͕ྑ͍͔ʁ
    σʔλ૚ σʔλͷӬଓԽΛ੹຿ͱ͢Δ

    υϝΠϯ૚ ۀ຿ϩδοΫ૚

    ΞϓϦέʔγϣϯ૚ ΞϓϦͷͨΊͷϩδοΫΛఏڙ͢Δ૚

    *OGSB$POUBJOFS
    %PNBJO$POUBJOFS
    "QQMJDBUJPO
    $POUBJOFS
    ͋Δ૚͕ԿΛఏڙ͍ͯ͠Δͷ͔͸ͦͷ૚Ͱͭͷ$POUBJOFS
    ΛݟΕ͹͙͢Θ͔ΔͷͰɺίʔυΛಡΉͱ͖ʹ໎Θͳ͍ɻ

    View Slide

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

    View Slide