dependence day insurgence

33
#Swift3Arch Dependence day: Insurgence Jorge D. Ortiz Fuentes @jdortiz

Upload: jorge-ortiz

Post on 23-Jan-2018

307 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Dependence day insurgence

#Swift3Arch

Dependence day: Insurgence

Jorge D. Ortiz Fuentes @jdortiz

Page 2: Dependence day insurgence

A Canonical Examples Production

#Swift3Arch

Page 3: Dependence day insurgence

#Swift3Arch

Agenda

The Problem

Solutions

Recommendations

Page 4: Dependence day insurgence

The Problem

Page 5: Dependence day insurgence

#Swift3Arch

Job Description

Understand the problem

Identify the right set of pieces

Put proper names

Make them run together properly

Page 6: Dependence day insurgence

#Swift3Arch

Social Network Option A

Social Network

Page 7: Dependence day insurgence

#Swift3Arch

Video

Text

Image

Social Network Option B

User PostGroup

Discussion

Promotion

DM

Page 8: Dependence day insurgence

#Swift3Arch

Single Responsibility Principle

ViewControllerPresenter

View ModelModel

Presentation logic

Business Logic

Data Source

Data Source

Data Source

Navigation

Page 9: Dependence day insurgence

The Jigsaw Puzzle

Page 10: Dependence day insurgence

#Swift3Arch

Making it workObjects require other objects to work -> Dependencies

Each object creates its dependencies

Bad idea™

• Another responsibility

• What if we want to use it with different sets of pieces?

Page 11: Dependence day insurgence

Instanciation =

alien is born

Page 12: Dependence day insurgence

Test environment

Page 13: Dependence day insurgence

#Swift3Arch

How to Provide Dependencies

Initializer

Property

Method

Page 14: Dependence day insurgence

But Who?

Page 15: Dependence day insurgence

Frameworks to the rescue

Page 16: Dependence day insurgence

#Swift3Arch

Inversion of Control

Hollywood Principle

Page 17: Dependence day insurgence

#Swift3Arch

Dependency Inversion Containers

Dip

Swinject

Cleanse

Page 18: Dependence day insurgence

#Swift3Arch

DipCreated by Olivier Halligon, maintained by Ilya Puchka

Beautifully simple

Nice way to inject in Storyboards

Scopes, Named definitions, Runtime arguments, Circular dependencies, Auto-wiring & Auto-injection, Type forwarding, Storyboards integration, Weakly typed components, Easy configuration, Thread safety, Helpful error messages, and configuration validation.

Page 19: Dependence day insurgence

#Swift3Arch

Dipfunc configure(container: DependencyContainer) { container.register(.unique) { InMemoryRepo() } container.register(.unique) { try UseCaseFactory(entityGateway: container.resolve() as InMemoryRepo) }

DependencyContainer.uiContainers = [showProgrammersListModule] }

let showProgrammersListModule = DependencyContainer { container in container.register() { try ProgrammersListPresenter(useCaseFactory: container.resolve() as UseCaseFactory) } container.register(tag: "ProgrammersTableVC") { ProgrammersTableViewController() } .resolvingProperties { container, viewController in viewController.presenter = try container.resolve() as ProgrammersListPresenter } }

extension ProgrammersTableViewController: StoryboardInstantiatable {}

Page 20: Dependence day insurgence

#Swift3Arch

SwinjectCreated by Jakub Vano, Wolfgang Lutz, Yoichi Tagala

Pure Swift Type Support, Injection with Arguments, Initializer/Property/Method Injections, Initialization Callback, Circular Dependencies, Object Scopes, Reference & Value Types, Self-registration, Container Hierarchy, Property Injection from Resource files, Thread Safety, Modular Components, Storyboard

Page 21: Dependence day insurgence

#Swift3Arch

Cleanse

Created by Square

Early version, but promising

Page 22: Dependence day insurgence

No Swift 3 Yet*!

Page 23: Dependence day insurgence

The World Outside

Page 24: Dependence day insurgence

#Swift3Arch

Java for Android

Standard annotations for DI (JSR330)

Introspection & Reflection

Many frameworks available

Some owned by Google (Guice & Dagger 2)

Page 25: Dependence day insurgence

Maturity

Page 26: Dependence day insurgence

What then?

Page 27: Dependence day insurgence

Traditional methods

Page 28: Dependence day insurgence

#Swift3Arch

Assemble the Piecesclass ProgrammersListConnector {

// MARK: - Constants

let entityGateway: EntityGatewayProtocol weak var presenter: ProgrammersListPresenter!

func assembleModule(view: ProgrammersTableViewController) { let useCaseFactory = UseCaseFactory(entityGateway: entityGateway) let presenter = ProgrammersListPresenter(useCaseFactory: useCaseFactory) view.presenter = presenter view.connector = self presenter.view = view self.presenter = presenter } }

Page 29: Dependence day insurgence

#Swift3Arch

Factories are your friendprotocol UseCase { func execute() }

class UseCaseFactory {

enum Use { case showProgrammersList(completion: ShowProgrammersListCompletion) // … }

func create(useCase whichUseCase: Use) -> UseCase { switch whichUseCase { case let .showProgrammersList(completion: completion): return ShowProgrammersListUseCase(entityGateway: entityGateway, completionHandler: completion) // … } }

Page 30: Dependence day insurgence

Recap

Page 31: Dependence day insurgence

#Swift3Arch

Take aways

Make your dependencies explicit

Use factories

Understand how it a container works

Use DI frameworks with caution

Page 32: Dependence day insurgence

Thank You!

Page 33: Dependence day insurgence

@jdortiz #Swift3Arch