32

INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt
Page 2: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

INTRODUCTION TO ARCHITECTING YOUR IOS APP

Page 3: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

AGENDA

Goals of software architecture

Design guidelines

Practical tips

Page 4: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

GOALS OF SOFTWARE ARCHITECTURE

Page 5: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

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: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

THINK IN DOMAINS NOT IN OBJECTS

Page 7: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

DOMAINS NOT OBJECTS

Business Logic

PersistenceUI/UX Code

NetworkingReusability

User Object

Trip Object

Page 8: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

DOMAINS NOT OBJECTS

Business Logic

Persistence

UI/UX Code

Networking

Reusability

User Object

Trip Object

User View

Trip View

Page 9: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

SINGLE RESPONSIBILITY PRINCIPLE

Page 10: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

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: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

ENCAPSULATE

Page 12: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

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: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

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: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

ENCAPSULATE

Add Trip View Controller Core Data Client

saveTrip(newTrip)

saveErrorOccurred(error)

Small communication interface reduces dependencies!

Page 15: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

PRACTICAL TIPS

Page 16: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

#1 AVOID THE MASSIVE VIEW CONTROLLER

Page 17: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

AVOID THE MASSIVE VIEW CONTROLLER

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

probably doing more than it should do

Page 18: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

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: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

THINGS A VIEW CONTROLLER SHOULD NOT DO

Construct complex network requests

Construct complex database queries

Take care of object serialization / deserialization

Page 20: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

#2 DEFINE EXPRESSIVE APIS

Page 21: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

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: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

#3 USE VIEW OBJECTS

Page 23: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

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: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

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: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

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: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

#4 BE WARY OF INHERITANCE

Page 27: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

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: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

BE WARY OF INHERITANCE

Base View Class

Trip View

More Specific Trip View

Trip View

ErrorRepresentable

Restorable Presentable

Page 29: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

SUMMARY

Page 30: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

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: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

ADDITIONAL RESOURCES

Page 32: INTRODUCTION TO ARCHITECTING YOUR IOS APP · Practical tips. GOALS OF SOFTWARE ARCHITECTURE. GOALS OF SOFTWARE ARCHITECTURE Code is comprehensible for other developers Code can adopt

ADDITIONAL RESOURCES

Talk: Refactor the Mega-Controller

WWDC 2015: Protocol Oriented Programming

WWDC 2014: Advanced Application Architecture

Ray Wenderlich: Protocol Oriented programming