/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!
/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
/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
/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