Advanced iOS Application Architecture and Patterns · Advanced iOS Application Architecture and...

Post on 12-Sep-2020

6 views 0 download

Transcript of Advanced iOS Application Architecture and Patterns · Advanced iOS Application Architecture and...

© 2014 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.

#WWDC14

Advanced iOS Application Architecture and Patterns

Session 229 Andy Matuschak iOS Apps and Frameworks

Frameworks

!

Colin Barrett iOS Apps and Frameworks

Software Architecture

Software Architecture…?

Five Things to Never Do in Your AppIt’s software architecture! We promise!

1. Don’t ever use class names explicitly

2. Avoid bare C functions with singletons

3. Why are you reading this?

4. It’s a joke; these are bad ideas

5. Or maybe just dogmatic ideas

“You Ain’t Gonna Need It!”

“You Ain’t Gonna Need It!”“Big Design Up Front.”

vs.

architecturetaste

ability

abilityarchitecture

taste

Insight, not dogma

Insight, not dogmaWhy, not how

Design Information Flow1

Define Clear Responsibilities2

Simplify with Immutability3

Simplify with Immutability3

Design information flow1

Define clear responsibilities2

Simplify with immutability3

Design information flow1

Define clear responsibilities2

Simplify with immutability3

Where Is “Truth”?

DemoWhere is truth?

photo tap action text view focus action

drawer view exists?

photo tap action text view focus action

drawer view exists?

drawer expanded?

photo tap action text view focus action

drawer view exists?

drawer expanded?

photo tap action text view focus action

drawer view exists?

drawer expanded?

Where Is “Truth”?

photo tap action text view focus actiondrawer view exists?

drawer expanded?

Where Is “Truth”?

photo tap action text view focus actiondrawer view exists?

drawer expanded?

drawer view exists?

drawer expanded?

derived value

truthTruth

Derived values

vs.

DemoTruth vs. derived values

text view value character count

model

Derived Values

derived value

input A input B

Derived Values

Compute from inputs

derived value

input A input B

Derived Values

Compute from inputs

Recompute when inputs change

derived value

input A input B

Derived Values

Compute from inputs

Recompute when inputs change

…Like a cache!

derived value

input A input B

original data

cached data

original data

cached data

staleness

original data

cached data

staleness

original data

cached data

staleness

original data

cached data

staleness

original data

cached data

staleness efficiency

original data

cached data

staleness efficiency

truth

derived values

truth

derived values

staleness efficiency

text view value character count

model

text view value character count

model

defines

text view value character count

model

definesinvalidates

text view value character count

model

definesinvalidates

defines

text view value

character count

model

definesinvalidates defines

invalidates

text view value

character count

model

definesinvalidates

invalidates

defines

text view value character count

model

definesinvalidates

defines

text view value character count

model

definesinvalidates

definesinvalidates

Truth vs. Derived Values

character count

model

text view value

model

text view value

text view value

model

model

text view value

Creating New Truth

derived value

truth

DemoCreating new truth

text view value character count

model

text view value character count

model

text view value character count

model

original model

entry viewing controller

entry editing controller

Creating New Truth

text view value character count

model

original model

entry viewing controller

entry editing controller

Design Information Flow1

Design Information Flow

Where is “truth”?

1

Design Information Flow

Where is “truth”?

Truth vs. derived values

1

Design Information Flow

Where is “truth”?

Truth vs. derived values

Creating new truth

1

Simplify with immutability3

Design information flow1

Define clear responsibilities2

Username Johny Appleseed ?

Password ••••••••••••••

ConfirmPassword ••••••••••••••

Email johnnyappleseed@icloud.com

Sign In

Invalid username or password!

Sign InForgot password?

Validation

Validation

Check if valid

If all valid

Enable sign-up button

For each text field

Validation

For each text field

Check if valid

If all valid

Enable sign-up button

Validation

For each text field

Check if valid

If all valid

Enable sign-up button

Validation

Check username field

Check first password field

Check second password field equals first

Check email address field

For each text field

Check if valid

If all valid

Enable sign-up button

Validation

Check username field

Check first password field

Check second password field equals first

Check email address field

For each text field

Check if valid

If all valid

Enable sign-up button

Validation

Check username field

Check first password field

Check second password field equals first

Check email address field

Validation

Check username field

Check first password field

Check second password field equals first

Check email address field

Validation

Create a regular expression

Find matches in username

If have any matches

Username is valid

Check username field

Check first password field

Check second password field equals first

Check email address fieldOtherwise

Decorate text field

ValidationHandling nil

For each text field

Check if valid

If all valid

Enable sign-up button

ValidationHandling nil

For each text field

Check if valid

If all valid

Enable sign-up button

ValidationHandling nil

For each text field

Check if valid

If all valid

Enable sign-up button

ValidationHandling nil

If nil

Leave text field alone

For each text field

Check if valid

If all valid

Enable sign-up button

ValidationHandling nil

For each text field

Check if valid

If all valid

Enable sign-up button

ValidationHandling nil

For each text field

Check if valid

If all valid

Enable sign-up button

ValidationHandling nil

If any nil

Leave sign-up button disabled

For each text field

Check if valid

If all valid

Enable sign-up button

Validation

Create a regular expression

Find matches in username

If have any matches

Username is valid

Check username field

Check first password field

Check second password field equals first

Check email address fieldOtherwise

Decorate text field

Validation

NSString *username = [self.usernameField text]; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@“[a-zA-Z0-9_]{6,}” options:0 error:nil]; NSRange result = [regex rangeOfFirstMatchInString:username options:NSMatchingAnchored range:NSMakeRange(0, [username length])]; if (username && result.location == NSNotFound) { allValid = NO; [self.usernameField setBackgroundColor:[UIColor redColor]]; } else { if (!username) { anyNil = YES; } [self.usernameField setBackgroundColor:[UIColor whiteColor]]]; }

Validation

NSString *username = [self.usernameField text]; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@“[a-zA-Z0-9_]{6,}” options:0 error:nil]; NSRange result = [regex rangeOfFirstMatchInString:username options:NSMatchingAnchored range:NSMakeRange(0, [username length])]; if (username && result.location == NSNotFound) { allValid = NO; [self.usernameField setBackgroundColor:[UIColor redColor]]; } else { if (!username) { anyNil = YES; } [self.usernameField setBackgroundColor:[UIColor whiteColor]]]; }

View Controller A

Text Field

Text Field

Text Field

Button

View Controller A

Text Field

Text Field

Text Field

ButtonValidation

View Controller A

Text Field

Text Field

Text Field

ButtonValidation

View Controller B

Text Field

Text Field

ButtonValidation

View Controller B

Text Field

Text Field

Button

View Controller A

Text Field

Text Field

Text Field

Button

ValidationValidation

Validation

Validation

What is validation?

Validation

What is validation? Inputs Outputs

Validation

What is validation?• Given an input value

Inputs Outputs

inputValue: Any

Validation

What is validation?• Given an input value

• Is input value valid?

Inputs Outputs

inputValue: Any isValid: Bool

Validation

What is validation?• Given an input value

• Is input value valid?

• If not, why not?

Inputs Outputs

inputValue: Any isValid: Bool

error: NSError?

ValidationFoundations

ValidationFoundations

protocol Validator { validateWithError(error: NSErrorPointer) -> Bool }

ValidationFoundations

protocol Validator { validateWithError(error: NSErrorPointer) -> Bool }

Definition of “input” left open to interpretation

ValidationFoundations

protocol Validator { validateWithError(error: NSErrorPointer) -> Bool }

Definition of “input” left open to interpretation

Build larger validators out of smaller ones

ValidationFoundations

protocol Validator { validateWithError(error: NSErrorPointer) -> Bool }

Definition of “input” left open to interpretation

Build larger validators out of smaller ones

Composition

ValidationFoundations

protocol Validator { validateWithError(error: NSErrorPointer) -> Bool }

Definition of “input” left open to interpretation

Build larger validators out of smaller ones

Composition

Works fine in Objective-C, too

ValidationUsernames

ValidationUsernames

class UsernameValidator: Validator { var input: NSString? func validateWithError(error: NSErrorPointer) -> Bool { let regex = NSRegularExpression(pattern: ...) ... }}

ValidationPasswords

ValidationPasswords

class PasswordValidator: Validator { var input: NSString? ...}

ValidationPasswords

class PasswordValidator: Validator { var input: NSString? ...}

Represents the validity of a single password field

ValidationPasswords

class PasswordValidator: Validator { var input: NSString? ...}

Represents the validity of a single password fieldclass SetPasswordValidator: Validator { let firstPasswordValidator = PasswordValidator() let secondPasswordValidator = PasswordValidator() ...}

ValidationPasswords

class PasswordValidator: Validator { var input: NSString? ...}

Represents the validity of a single password fieldclass SetPasswordValidator: Validator { let firstPasswordValidator = PasswordValidator() let secondPasswordValidator = PasswordValidator() ...}

Represents two password fields that must match in value

ValidationOverall form

ValidationOverall form

class SignUpValidator: Validator { let usernameValidator = UsernameValidator() let setPasswordValidator = SetPasswordValidator() let emailAddressValidator = EmailAddressValidator() ...}

ValidationOverall form

class SignUpValidator: Validator { let usernameValidator = UsernameValidator() let setPasswordValidator = SetPasswordValidator() let emailAddressValidator = EmailAddressValidator() ...}

Represents the validity of the entire form

ValidationOverall form

class SignUpValidator: Validator { let usernameValidator = UsernameValidator() let setPasswordValidator = SetPasswordValidator() let emailAddressValidator = EmailAddressValidator() ...}

Represents the validity of the entire form

Behavior of nil

ValidationOverall form

class SignUpValidator: Validator { let usernameValidator = UsernameValidator() let setPasswordValidator = SetPasswordValidator() let emailAddressValidator = EmailAddressValidator() ...}

Represents the validity of the entire form

Behavior of nil• Most validators allow nil

ValidationOverall form

class SignUpValidator: Validator { let usernameValidator = UsernameValidator() let setPasswordValidator = SetPasswordValidator() let emailAddressValidator = EmailAddressValidator() ...}

Represents the validity of the entire form

Behavior of nil• Most validators allow nil

• SignUpValidator verifies contained inputs are non-nil

Validation

Validation

Set input on corresponding validator

Enable sign-up button

Decorate invalid text fields

For each text field

If sign-up validator OK

Otherwise

Define Clear Responsibilities2

Simplify with immutability3

Design information flow1

Define clear responsibilities2

“Mutability is bad and you should feel bad for using it”

The Internet, probably…

Insight, not dogmaWhy, not how

5

A

B

C

5

A

B

C

5

5

A

B

C

99

99

A

B

C

99

99

A

B

C

99

A

B

C

99 99

99

A

B

C

99 99

99

A

B

C

99 99

99

A

B

C

5

A

B

C

5

A

B

C

5

5

A

B

C

995

5

A

B

C

99

5

5

A

B

C

Swift StructsBest of both worlds

Swift StructsBest of both worlds

Opt-in mutability • mutating keyword

Swift StructsBest of both worlds

Opt-in mutability • mutating keyword

Call-by-value • New copy automatically created when passing struct to another function

55

A

B

C

55

A

B

C

5

5

A

B

C

5

9999

A

B

C

5

9999

A

B

C

5 99

99

A

B

C

UIMotionEffect

UIMotionEffect

Adjust views based on gyroscope data

UIMotionEffect

Adjust views based on gyroscope data

Used to achieve parallax effects

UIMotionEffect

Adjust views based on gyroscope data

Used to achieve parallax effects

Reusable across views

UIMotionEffect

Adjust views based on gyroscope data

Used to achieve parallax effects

Reusable across views

Low-latency requirements

UIMotionEffect

UIMotionEffect

Inputs Outputs

UIMotionEffect

Inputs Outputs

Device pose

UIMotionEffect

Inputs Outputs

Device pose Relative offset for each key path

Inputs Outputs

UIMotionEffectInput deltas

Inputs Outputs

UIMotionEffectInput deltas

Device pose deltas

Inputs Outputs

UIMotionEffectInput deltas

Device pose deltas Relative offset for each key path

Inputs Outputs

UIMotionEffectInput deltas

Previous poses

Device pose deltas Relative offset for each key path

UIMotionEffectAbsolute offsets

Inputs Outputs

UIMotionEffectAbsolute offsets

Inputs Outputs

Device pose

UIMotionEffectAbsolute offsets

Inputs Outputs

Device pose Value for each key path

UIMotionEffectAbsolute offsets

Inputs Outputs

A particular view

Device pose Value for each key path

Simplify with Immutability3

Review

Design Information Flow1

Define Clear Responsibilities2

Simplify with Immutability3

What now?

More Information

Jake Behrens App Frameworks Evangelist behrens@apple.com

Apple Developer Forums http://devforums.apple.com

Related Sessions

• Core iOS Application Architectural Patterns Mission Thursday 9:00AM