intro to ios application architecture

32

Upload: make-school

Post on 21-Jan-2018

912 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Intro to iOS Application Architecture
Page 2: Intro to iOS Application Architecture

INTRODUCTION TO ARCHITECTING YOUR IOS APP

Page 3: Intro to iOS Application Architecture

AGENDA

Goals of software architecture

Design guidelines

Practical tips

Page 4: Intro to iOS Application Architecture

GOALS OF SOFTWARE ARCHITECTURE

Page 5: Intro to iOS Application Architecture

GOALS OF SOFTWARE ARCHITECTURE

Code is comprehensible for other developers

Code can adopt to changing requirements

Code can be shared within the project and throughout

multiple projects

Page 6: Intro to iOS Application Architecture

THINK IN DOMAINS NOT IN OBJECTS

Page 7: Intro to iOS Application Architecture

DOMAINS NOT OBJECTS

Business Logic

PersistenceUI/UX Code

NetworkingReusability

User Object

Trip Object

Page 8: Intro to iOS Application Architecture

DOMAINS NOT OBJECTS

Business Logic

Persistence

UI/UX Code

Networking

Reusability

User Object

Trip Object

User View

Trip View

Page 9: Intro to iOS Application Architecture

SINGLE RESPONSIBILITY PRINCIPLE

Page 10: Intro to iOS Application Architecture

SINGLE RESPONSIBILITY PRINCIPLE

Avoid having many responsibilities within a single class

Very important when implementing UIViewController subclasses

Bad View Controller handles: Persistence, Business

Logic, View Logic, etc.

Page 11: Intro to iOS Application Architecture

ENCAPSULATE

Page 12: Intro to iOS Application Architecture

ENCAPSULATE

Every component should know as little as possible

about its surrounding components → reduces dependencies between components

How can this be accomplished?→ small interfaces for communication

Page 13: Intro to iOS Application Architecture

ENCAPSULATE

Add Trip View Controller Core Data Client

startSavingNewTrip(newTrip)

displayError(nameError)

setNameOfTrip(“SF Trip”)

disableSaveButton()

Classes are poorly encapsulated and very dependent on each other - very hard to change code in any of the two classes

Page 14: Intro to iOS Application Architecture

ENCAPSULATE

Add Trip View Controller Core Data Client

saveTrip(newTrip)

saveErrorOccurred(error)

Small communication interface reduces dependencies!

Page 15: Intro to iOS Application Architecture

PRACTICAL TIPS

Page 16: Intro to iOS Application Architecture

#1 AVOID THE MASSIVE VIEW CONTROLLER

Page 17: Intro to iOS Application Architecture

AVOID THE MASSIVE VIEW CONTROLLER

Rule of thumb: A View Controller with > 300 lines is

probably doing more than it should do

Page 18: Intro to iOS Application Architecture

THINGS A VIEW CONTROLLER SHOULD DO

Listen to callbacks from the View → invoke methods on

the model layer → send responses from model back to

the view

Page 19: Intro to iOS Application Architecture

THINGS A VIEW CONTROLLER SHOULD NOT DO

Construct complex network requests

Construct complex database queries

Take care of object serialization / deserialization

Page 20: Intro to iOS Application Architecture

#2 DEFINE EXPRESSIVE APIS

Page 21: Intro to iOS Application Architecture

DEFINE EXPRESSIVE APIS

E.g. instead of exposing details of the network layer,

provide functions with a simple interface:

func fetchAllUsers(callback: [User] -> ()) fetchAllUsers { users in print(users)}

Page 22: Intro to iOS Application Architecture

#3 USE VIEW OBJECTS

Page 23: Intro to iOS Application Architecture

USE VIEW OBJECTS

View objects encapsulate multiple properties that are

relevant for a type to be displayed by a custom view

This is preferred over setting individual properties from

outside the view

Page 24: Intro to iOS Application Architecture

USE VIEW OBJECTSclass UserView: UIView {

@IBOutlet var nameLabel: UILabel! @IBOutlet var profilePictureImageView: UIImageView! var user: User? { didSet { nameLabel.text = user?.name profilePictureImageView.image = user?.profilePicture } } }

let userView = UserView()let currentUser = User()currentUser.name = "TestUser"

userView.user = currentUser

View encapsulates how an object is displayed!

Page 25: Intro to iOS Application Architecture

USE VIEW OBJECTS

class UserView: UIView {

@IBOutlet var nameLabel: UILabel! @IBOutlet var profilePictureImageView: UIImageView! }

let userView = UserView()let currentUser = User()currentUser.name = "TestUser"

userView.nameLabel.text = currentUser.nameuserView.profilePictureImageView.image = currentUser.profilePicture

Code that uses UserView nowdepends on its UI components.Violates encapsulation!

Page 26: Intro to iOS Application Architecture

#4 BE WARY OF INHERITANCE

Page 27: Intro to iOS Application Architecture

BE WARY OF INHERITANCE

Base View Class

Trip View

You can only inherit one set of functionality

You tend to inherit functionality that you don’t need

More modular alternatives:

Functions that can operate on relevant types (using generics)

Protocols & Protocol Extensions

Page 28: Intro to iOS Application Architecture

BE WARY OF INHERITANCE

Base View Class

Trip View

More Specific Trip View

Trip View

ErrorRepresentable

Restorable Presentable

Page 29: Intro to iOS Application Architecture

SUMMARY

Page 30: Intro to iOS Application Architecture

SUMMARYDivide code into logical domains

Strive for each unit of code having a single responsibility

Consider using protocols instead of inheritance

Define narrow and expressive APIs that hide

implementation details of other units of code and

reduce dependencies between your units

Page 31: Intro to iOS Application Architecture

ADDITIONAL RESOURCES

Page 32: Intro to iOS Application Architecture

ADDITIONAL RESOURCES

Talk: Refactor the Mega-Controller

WWDC 2015: Protocol Oriented Programming

WWDC 2014: Advanced Application Architecture

Ray Wenderlich: Protocol Oriented programming