Slide 1

Slide 1 text

/dev/world Structuring Your Code With MVP Sam Jarman iOS Developer, Bank of New Zealand 2018 @samjarman

Slide 2

Slide 2 text

/dev/world ’18 • @samjarman Who Am I? • iOS Developer at the Bank of New Zealand • iOS Dev since ages ago • Sabbatical in Ruby on Rails, EmberJS, AWS, more • Twitter friendly talk!

Slide 3

Slide 3 text

/dev/world ’18 • @samjarman Today A story of Evolution

Slide 4

Slide 4 text

/dev/world ’18 • @samjarman Age of Empires Arguably my favourite game

Slide 5

Slide 5 text

/dev/world ’18 • @samjarman Ages in Age of Empires • Dark Age • Tool Age • Bronze Age • Iron Age

Slide 6

Slide 6 text

/dev/world ’18 • @samjarman The Dark Age

Slide 7

Slide 7 text

/dev/world ’18 • @samjarman 2009ish

Slide 8

Slide 8 text

/dev/world ’18 • @samjarman MVC

Slide 9

Slide 9 text

/dev/world ’18 • @samjarman Model View Controller

Slide 10

Slide 10 text

/dev/world ’18 • @samjarman Model Controller View

Slide 11

Slide 11 text

/dev/world ’18 • @samjarman Model Controller View TableView CollectionView Customer Thing Object Control and coordinate

Slide 12

Slide 12 text

/dev/world ’18 • @samjarman Model Controller View TableView CollectionView Customer Thing Object Network Caching Data Access / Persistence Control and coordinate View Datasources View Delegates

Slide 13

Slide 13 text

/dev/world ’18 • @samjarman Model Controller View TableView CollectionView Customer Thing Object Network Caching Data Access / Persistence All the things…. View Datasources View Delegates

Slide 14

Slide 14 text

/dev/world ’18 • @samjarman Controller • Delegate for TableView • Datasource for TableView • Network calls • Parsing of DTOs into models • Sorting of arrays • SQL/CoreData • Sizing cells • … more!

Slide 15

Slide 15 text

/dev/world ’18 • @samjarman Massive View Controller

Slide 16

Slide 16 text

/dev/world ’18 • @samjarman Massive View Controllers are the hidden shame of every iOS Developer

Slide 17

Slide 17 text

/dev/world ’18 • @samjarman The Problem • Controllers doing too much • Almost no well defined inputs and outputs • Tonnes of side effects • No real consequences of this programmer behaviour

Slide 18

Slide 18 text

/dev/world ’18 • @samjarman Then: The gold rush was over Stop mixing metaphors, Sam Shushhh

Slide 19

Slide 19 text

/dev/world ’18 • @samjarman We Wanted…

Slide 20

Slide 20 text

/dev/world ’18 • @samjarman We Wanted… Products not experiments Longevity Apps as a strategy Readability Teams of developers Maintainability To use source control To release with confidence To keep up with OS updates To make good apps

Slide 21

Slide 21 text

/dev/world ’18 • @samjarman It’s time to advance to the next age

Slide 22

Slide 22 text

/dev/world ’18 • @samjarman The Tool Age

Slide 23

Slide 23 text

/dev/world ’18 • @samjarman Desirable Code What does good code look like?

Slide 24

Slide 24 text

/dev/world ’18 • @samjarman Desirable Code • Single responsibility • Clear inputs and outputs • SOLID • Unit Testable • (… and a lot more!)

Slide 25

Slide 25 text

/dev/world ’18 • @samjarman The Solution • Thoughtfully architect your app

Slide 26

Slide 26 text

/dev/world ’18 • @samjarman Clean, maintainable code comes from thoughtful app architecture

Slide 27

Slide 27 text

/dev/world ’18 • @samjarman Good architecture is the act of decomposing your apps functionality into single responsibility objects with clear inputs and outputs

Slide 28

Slide 28 text

/dev/world ’18 • @samjarman Possible Solutions • There are plenty of possible solutions and architectures for your app • MVP, MVVM, VIPER, More… • Lets chat about one today! Tuesday, 2:00 PM VIPER for iOS Thomas Verbeek

Slide 29

Slide 29 text

/dev/world ’18 • @samjarman MVP Model View Presenter

Slide 30

Slide 30 text

/dev/world ’18 • @samjarman MVP Model View Presenter ^Controller + Provider + View

Slide 31

Slide 31 text

/dev/world ’18 • @samjarman Presenter Provider ViewController View Model Network/Disk

Slide 32

Slide 32 text

/dev/world ’18 • @samjarman View • A standard iOS View • Could contain a tableview, collection view, stack views, whatever your heart* desires *pragmatic implementation of designs

Slide 33

Slide 33 text

/dev/world ’18 • @samjarman View (Controller) • A view controller • Acts as delegate / datasource of TV/CV etc • Layout and populates views • Receives user actions • Asks and informs the presenter

Slide 34

Slide 34 text

/dev/world ’18 • @samjarman Presenter • Interacts with Data provider classes • Instructs view what to do • Doesn’t know/care about the view

Slide 35

Slide 35 text

/dev/world ’18 • @samjarman Provider • Reads/Writes to the source of truth • Server • Database • Other • Constructs models from that source • Passes models back to presenter

Slide 36

Slide 36 text

/dev/world ’18 • @samjarman Model • A class or struct with properties • Represents an object • Maybe created by server response directly or Domain Transfer Object • Maybe failable init?

Slide 37

Slide 37 text

/dev/world ’18 • @samjarman Presenter Provider ViewController View Model Network/Disk

Slide 38

Slide 38 text

/dev/world ’18 • @samjarman Communication How does it work in MVP?

Slide 39

Slide 39 text

/dev/world ’18 • @samjarman Presenter Provider ViewController View Model Network/Disk Delegate UIKits standard Method Call Delegate Method Call

Slide 40

Slide 40 text

/dev/world ’18 • @samjarman Ownership

Slide 41

Slide 41 text

/dev/world ’18 • @samjarman Presenter Provider ViewController View Model Network/Disk Weak delegate Owns (Strong*) Owns(Strong) Weak delegate Owns (Strong) Constructs Owns/Singleton

Slide 42

Slide 42 text

/dev/world ’18 • @samjarman Code Walkthrough

Slide 43

Slide 43 text

/dev/world ’18 • @samjarman Unit testing

Slide 44

Slide 44 text

/dev/world ’18 • @samjarman Presenter Provider ViewController View Model Network/Disk Delegate UIKits standard Method Call Delegate Method Call

Slide 45

Slide 45 text

/dev/world ’18 • @samjarman Unit testing • Clear inputs ✅ - Interface • Clear outputs ✅ - Delegate/Protocol • Clear side affects ✅ - Only in provider! • Single responsibility ✅

Slide 46

Slide 46 text

/dev/world ’18 • @samjarman –Me, excited about unit testing decent architecture “We can unit test the crap out of this thing”

Slide 47

Slide 47 text

/dev/world ’18 • @samjarman Anatomy of a test • Setup / Given • Run / When • Verify / Then

Slide 48

Slide 48 text

/dev/world ’18 • @samjarman Anatomy of a test Presenter Mock Delegate + Recording Method Call

Slide 49

Slide 49 text

/dev/world ’18 • @samjarman Demo of Tests

Slide 50

Slide 50 text

/dev/world ’18 • @samjarman A word on tests

Slide 51

Slide 51 text

/dev/world ’18 • @samjarman If you’re finding your tests hard to write, revise your code.

Slide 52

Slide 52 text

/dev/world ’18 • @samjarman And that’s MVP • Logical units of work • Clear inputs, clear outputs, no side effects • Possible to 100% unit test non-UI • Use of interfaces and delegates for communication

Slide 53

Slide 53 text

/dev/world ’18 • @samjarman MVP is… • An option for you to structure your code • A light weight architecture for those new to architecting code

Slide 54

Slide 54 text

/dev/world ’18 • @samjarman MVP is not.. • The only way to do this • A solution for all use cases, teams, and code bases • An end to all bugs • Noticeable to your users… for now

Slide 55

Slide 55 text

/dev/world ’18 • @samjarman What’s next?

Slide 56

Slide 56 text

/dev/world ’18 • @samjarman iosarchitecture.top

Slide 57

Slide 57 text

/dev/world ’18 • @samjarman The Bronze Age

Slide 58

Slide 58 text

/dev/world ’18 • @samjarman The Bronze Age Tuesday, 2:00 PM VIPER for iOS Thomas Verbeek

Slide 59

Slide 59 text

/dev/world ’18 • @samjarman So what’s this all really about?

Slide 60

Slide 60 text

/dev/world ’18 • @samjarman Architectural patterns are about expressing yourself in logical units that are individually replaceable, expandable, testable and interoperable

Slide 61

Slide 61 text

/dev/world ’18 • @samjarman Better patterns: …better code …better apps …better user experience …better for business

Slide 62

Slide 62 text

/dev/world ’18 • @samjarman Thank you!

Slide 63

Slide 63 text

/dev/world ’18 • @samjarman Thank you! • Me? www.samjarman.co.nz • Learn more about SOLID? https:// en.wikipedia.org/wiki/SOLID