Upgrade to Pro — share decks privately, control downloads, hide ads and more …

iOSDevUK 2015: Clean Code through Dependency Injection

AppFoundry
September 15, 2015

iOSDevUK 2015: Clean Code through Dependency Injection

This is a 5 minute fast-talk we gave at iOSDevUK 2015.

AppFoundry

September 15, 2015
Tweet

More Decks by AppFoundry

Other Decks in Programming

Transcript

  1. Clean Code through 

    Dependency Injection

    View Slide

  2. Your host
    Mike Seghers
    Developer/Architect
    [email protected]
    @mikeseghers

    View Slide

  3. Creating apps: a recent history

    View Slide

  4. 2012

    View Slide

  5. Coding Example
    Acceptable in 2012
    struct SkeumorphicDesigner {
    func createDesign(requirements: Requirements) -> Design {
    //Draws some boxes with stitches, applies colors
    //returns Design
    }
    }
    struct ObjectiveCDeveloper {
    func createApp(requirements: Requirements,
    design: Design) -> App {
    //Does some code between [], applies the design using
    //InterfaceBuilder, returns App
    }

    View Slide

  6. Coding Example
    Acceptable in 2012
    class AppFactory2012 {
    private let developer:ObjectiveCDeveloper
    private let designer:SkeumorphicDesigner
    init() {
    developer = ObjectiveCDeveloper()
    designer = SkeumorphicDesigner()
    }
    public func createApp(requirements:Requirements) -> App {
    let design = designer.createDesign(requirements)
    return developer.createApp(requirements, design: design)
    }
    }

    let appFactory = AppFactory2012()
    let app = appFactory.createApp(requirements)

    View Slide

  7. 2013

    View Slide

  8. Coding Example
    Acceptable in 2013
    struct FlatDesigner {
    func createDesign(requirements: Requirements) -> Design {
    //Draws some flat boxes, applies less color, returns Design
    }
    }
    struct ObjectiveCDeveloper { … }

    View Slide

  9. Coding Example
    Acceptable in 2013
    class AppFactory2013 {
    private let developer:ObjectiveCDeveloper
    private let designer:FlatDesigner
    init() {
    developer = ObjectiveCDeveloper()
    designer = FlatDesigner()
    }
    public func createApp(requirements:Requirements) -> App {
    let design = designer.createDesign(requirements)
    return developer.createApp(requirements, design: design)
    }
    }

    let appFactory = AppFactory2013()
    let app = appFactory.createApp(requirements)

    View Slide

  10. Current

    View Slide

  11. Coding Example
    Acceptable in now
    struct SwiftDeveloper {
    func createApp(requirements: Requirements,
    design: Design) -> App {
    //Does some code without semi-colons, applies the
    //design using StoryBoards, returns App
    }
    struct FlatDesigner { … }

    View Slide

  12. Coding Example
    Acceptable in now
    class AppFactory2014 {
    private let developer:SwiftDeveloper
    private let designer:FlatDesigner
    init() {
    developer = SwiftDeveloper()
    designer = FlatDesigner()
    }
    public func createApp(requirements:Requirements) -> App {
    let design = designer.createDesign(requirements)
    return developer.createApp(requirements, design: design)
    }
    }

    let appFactory = AppFactory2014()
    let app = appFactory.createApp(requirements)

    View Slide

  13. How many app factories does one
    need?

    View Slide

  14. Coding Example
    Acceptable all the time
    protocol Designer {
    func createDesign(requirements: Requirements) -> Design
    }
    protocol Developer {
    func createApp(requirements: Requirements,
    design: Design) -> App
    }
    extension SkeumorphicDesigner : Designer {}
    extension FlatDesigner : Designer {}
    extension ObjectiveCDeveloper : Developer {}
    extension SwiftDeveloper : Developer {}

    View Slide

  15. Coding Example
    Acceptable all the time
    class AppFoundry {
    private let developer:Developer
    private let designer:Designer
    init(developer: Developer, designer: Designer) {
    self.developer = developer
    self.designer = designer
    }
    func createApp(requirements:Requirements) -> App {
    let design = designer.createDesign(requirements)
    return developer.createApp(requirements, design: design)
    }
    }

    View Slide

  16. Coding Example
    Acceptable all the time
    let developer = ObjectiveCDeveloper()
    let designer = SkeumorphicDesigner()
    let oldSchoolFoundry = AppFoundry(developer: developer,
    designer: designer)
    oldSchoolFoundry.createApp(requirements)

    View Slide

  17. Coding Example
    Acceptable all the time
    let developer = ObjectiveCDeveloper()
    let designer = FlatDesigner()
    let playingItSaveFoundry = AppFoundry(developer: developer,
    designer: designer)
    playingItSaveFoundry.createApp(requirements)

    View Slide

  18. Dependency Injection

    View Slide

  19. Helps with reusable code

    View Slide

  20. Dependency Injection

    View Slide

  21. Helps with loose coupling

    View Slide

  22. Dependency Injection

    View Slide

  23. Helps with (unit) tests

    View Slide

  24. Dependency Injection

    View Slide

  25. Helps keep your code clean

    View Slide

  26. Questions?
    Come talk to me!
    Mike Seghers
    Developer/Architect
    [email protected]
    @mikeseghers
    https://github.com/appfoundry/Reliant

    View Slide