Slide 1

Slide 1 text

Clean Code through 
 Dependency Injection

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

Creating apps: a recent history

Slide 4

Slide 4 text

2012

Slide 5

Slide 5 text

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 }

Slide 6

Slide 6 text

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)

Slide 7

Slide 7 text

2013

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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)

Slide 10

Slide 10 text

Current

Slide 11

Slide 11 text

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 { … }

Slide 12

Slide 12 text

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)

Slide 13

Slide 13 text

How many app factories does one need?

Slide 14

Slide 14 text

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 {}

Slide 15

Slide 15 text

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) } }

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

Dependency Injection

Slide 19

Slide 19 text

Helps with reusable code

Slide 20

Slide 20 text

Dependency Injection

Slide 21

Slide 21 text

Helps with loose coupling

Slide 22

Slide 22 text

Dependency Injection

Slide 23

Slide 23 text

Helps with (unit) tests

Slide 24

Slide 24 text

Dependency Injection

Slide 25

Slide 25 text

Helps keep your code clean

Slide 26

Slide 26 text

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