Beyond design patterns phpnw14

75
Beyond Design Patterns A Guide To Better OOP

description

Many people teach design patterns as a fundamental step to Object Oriented Programming. They are so universally seen as important that almost every single programming conference that I have been to has had at least one talk about them. They are quite often used as interview questions to test a candidate's OOP knowledge. However, just like inheritance, they are not needed for OOP. And just like inheritance, they are a distraction rather than a foundation. Instead of focusing on patterns, I suggest focusing on learning about abstraction and communication. Why? Come and find out! Talk at #PHPNW14

Transcript of Beyond design patterns phpnw14

Page 1: Beyond design patterns   phpnw14

Beyond Design PatternsA Guide To Better OOP

Page 2: Beyond design patterns   phpnw14

Why Learning Object-Oriented

Design From Design Patterns Is Bad

OR:

Page 3: Beyond design patterns   phpnw14

Object Oriented Design

… is the process of planning a system of interacting objects for the purpose of solving a software problem.

-Wikipedia

Page 4: Beyond design patterns   phpnw14

What Are Design Patterns?

Page 5: Beyond design patterns   phpnw14

What Are Design Patterns?

● Commonly Occurring Solutions?

Page 6: Beyond design patterns   phpnw14

What Are Design Patterns?

● Commonly Occurring Solutions?● Commonly Occurring Structures?

Page 7: Beyond design patterns   phpnw14

What Are Design Patterns?

● Commonly Occurring Solutions?● Commonly Occurring Structures?● Commonly Occurring Limitations?

Page 8: Beyond design patterns   phpnw14

What Are Design Patterns?

● Commonly Occurring Solutions?● Commonly Occurring Structures?● Commonly Occurring Limitations?

● All Of The Above?

Page 9: Beyond design patterns   phpnw14

What Are Design Patterns?

All Of The Above!

Page 10: Beyond design patterns   phpnw14

What Kind Of Design Patterns Are There?

Page 11: Beyond design patterns   phpnw14

Creational

Abstract FactoryBuilderFactory MethodObject PoolPrototype

Gang-Of-Four Design Patterns

Page 12: Beyond design patterns   phpnw14

Creational Structural

Abstract FactoryBuilderFactory MethodObject PoolPrototype

AdapterBridgeCompositeDecoratorFacadeFlyweightProxy

Gang-Of-Four Design Patterns

Page 13: Beyond design patterns   phpnw14

Creational Structural Behavioral

Abstract FactoryBuilderFactory MethodObject PoolPrototype

AdapterBridgeCompositeDecoratorFacadeFlyweightProxy

Chain Of ResponsibilityCommandInterpreterIteratorMediatorMementoNull ObjectObserverStrategyTemplate Method

Gang-Of-Four Design Patterns

Page 14: Beyond design patterns   phpnw14

Let’s Try A Different Organization

Page 15: Beyond design patterns   phpnw14

Shim

FlyweightIteratorNull ObjectObject PoolPrototype

Gang-Of-Four Design PatternsRe-Grouped

Page 16: Beyond design patterns   phpnw14

Shim Compositional

FlyweightIteratorNull ObjectObject PoolPrototype

AdapterBuilderDecoratorFacadeInterpreterMediatorObserverProxy

Gang-Of-Four Design PatternsRe-Grouped

Page 17: Beyond design patterns   phpnw14

Shim Compositional Decompositional

FlyweightIteratorNull ObjectObject PoolPrototype

AdapterBuilderDecoratorFacadeInterpreterMediatorObserverProxy

Abstract FactoryBridgeChain Of ResponsibilityCommandFactory MethodMediatorMementoObserverProxyStrategyTemplate Method

Gang-Of-Four Design PatternsRe-Grouped

Page 18: Beyond design patterns   phpnw14

Compare Groupings

Creational Structural Behavioral

Shim Abstract FactoryObject PoolPrototype

Flyweight IteratorNull Object

Compositional Builder AdapterCompositeDecoratorFacadeProxy

InterpreterMediatorObserver

Decompositional Factory Method BridgeCompositeProxy

Chain Of ResponsibilityCommandMediatorMementoObserverStrategyTemplate Method

Page 19: Beyond design patterns   phpnw14

Let’s Examine 5 Patterns More Closely

Page 20: Beyond design patterns   phpnw14

Compare Groupings

Creational Structural Behavioral

Shim Abstract FactoryObject PoolPrototype

Flyweight IteratorNull Object

Compositional Builder AdapterComposite

DecoratorFacadeProxy

InterpreterMediatorObserver

Decompositional Factory Method BridgeComposite

Proxy

Chain Of ResponsibilityCommandMediatorMementoObserverStrategyTemplate Method

Page 21: Beyond design patterns   phpnw14

Adapter

use Psr\Log\LoggerInterface as Logclass PSR3Logger implements Log {

public function log($level, $msg, array $ctx = array()) {

$severity = $this->convertLevelToSeverity($level);

watchdog(“unknown”, $msg, $ctx, $severity);

}

/* ... */

}

Page 22: Beyond design patterns   phpnw14

Facade

class EntityMetadataWrapper { public function __construct($type, $data = null, $info = array()) {

$this->type = $type;

$this->info = $info + array(

“langcode” => null,

);

$this->info[“type”] = $type;

if (isset($data)) {

$this->set($data);

}

}

/* ... */

}

Page 23: Beyond design patterns   phpnw14

Adapter vs Facade

Class 1

Class 2

Class 3

Class n

Class 1

Class m

ExistingCode

“Pattern”Code Class 1

Class 2

Class 3

Class n

OtherCode

API

Page 24: Beyond design patterns   phpnw14

Adapter vs Facade

Class 1

Class 2

Class 3

Class n

Class 1

Class m

ExistingCode

“Pattern”Code Class 1

Class 2

Class 3

Class n

OtherCode

API

API Exists? Adapter

Page 25: Beyond design patterns   phpnw14

Adapter vs Facade

Class 1

Class 2

Class 3

Class n

Class 1

Class m

ExistingCode

“Pattern”Code Class 1

Class 2

Class 3

Class n

OtherCode

API

API Exists? AdapterNew API? Facade

Page 26: Beyond design patterns   phpnw14

They Look The Same!!!???

Page 27: Beyond design patterns   phpnw14

Adapter Facade

Bridge Decorator Proxy

Page 28: Beyond design patterns   phpnw14

They All Look The Same!!!???

Page 29: Beyond design patterns   phpnw14

Adapter Facade

Bridge Decorator Proxy

Page 30: Beyond design patterns   phpnw14

Adapter Facade

Bridge Decorator Proxy

The Code Is The SameThe Why Is Different

Page 31: Beyond design patterns   phpnw14

DeDuplicated Groupings

Creational Structural Behavioral

Compositional AdapterComposite

MediatorObserver

Decompositional AdapterComposite

CommandMediatorMementoObserver

Page 32: Beyond design patterns   phpnw14

DeDuplicated Re-Groupings

Multiple Systems?

Single System?

Single Objects?

Information Flow?

Mediator Command Observer

Structure Adapter Composite Memento

Page 33: Beyond design patterns   phpnw14

DeDeDuplicated Re-Groupings

Pattern

Information Flow?

Mediator

Structure Adapter

Page 34: Beyond design patterns   phpnw14

DeDeDuplicated ReRe-Groupings

Pattern

Information Flow?

Mediator

Page 35: Beyond design patterns   phpnw14

All Design Patterns Do The Same Thing:

Page 36: Beyond design patterns   phpnw14

All Design Patterns Do The Same Thing:

Control Information Flow

Page 37: Beyond design patterns   phpnw14

So Let’s Talk About Information Flow

Page 38: Beyond design patterns   phpnw14

So Let’s Talk About Communication

Page 39: Beyond design patterns   phpnw14

$msg

A message

Page 40: Beyond design patterns   phpnw14

$obj

Logic

Page 41: Beyond design patterns   phpnw14

Message Vs Logic

State

Page 42: Beyond design patterns   phpnw14

Message Vs Logic

Messages

State

Page 43: Beyond design patterns   phpnw14

Message Vs Logic

Messages

State

Logic

Page 44: Beyond design patterns   phpnw14

Message Vs Logic

Messages

State

Logic HERE BE DRAGONS

Page 45: Beyond design patterns   phpnw14

Why Break Them Apart?

Logic Hybrid Message

Purpose Behavior General Code State

State Stateless Stateful Stateful

Paradigm Functional OOP? Data

Page 46: Beyond design patterns   phpnw14

$msg = $obj->something();

Ask

Logic Hybrid Message

No Yes Yes

Page 47: Beyond design patterns   phpnw14

$obj->something($msg);

Tell

Logic Hybrid Message

No Yes Yes

Page 48: Beyond design patterns   phpnw14

$msg2 = $obj->do($msg);

Translate

Logic Hybrid Message

Yes Yes No

Page 49: Beyond design patterns   phpnw14

Everything Else Is A Combination Of These

Atoms

Page 50: Beyond design patterns   phpnw14

Note:

Page 51: Beyond design patterns   phpnw14

Ask Is Always Stateful

Note:

Page 52: Beyond design patterns   phpnw14

Ask Is Always StatefulTell Is Always Stateful

Note:

Page 53: Beyond design patterns   phpnw14

Ask Is Always StatefulTell Is Always Stateful

Translate Can Be Stateless

Note:

Page 54: Beyond design patterns   phpnw14

Why Does This Matter?

Page 55: Beyond design patterns   phpnw14

It Lets Us Analyze Object Roles

Page 56: Beyond design patterns   phpnw14

Object Role Patterns

State? Logic? Mode

Page 57: Beyond design patterns   phpnw14

Object Role Patterns

State? Logic? Mode

Representer User No Ask/Tell

Page 58: Beyond design patterns   phpnw14

Representer

class User {

public function getName();

public function isAdmin();

public function setName($name);

}

Page 59: Beyond design patterns   phpnw14

Object Role Patterns

State? Logic? Mode

Representer User No Ask/Tell

Doer No Yes Tell

Page 60: Beyond design patterns   phpnw14

Doer

class EmailSystem {

/** * @return boolean */ public function send(Message $msg);

}

Page 61: Beyond design patterns   phpnw14

Object Role Patterns

State? Logic? Mode

Representer User No Ask/Tell

Doer No Yes Tell

Dispatcher System No Translate

Page 62: Beyond design patterns   phpnw14

Dispatcher

class Controller {

/** * @return Response */ public function handle(Request $req);

}

Page 63: Beyond design patterns   phpnw14

Object Role Patterns

State? Logic? Mode

Representer User No Ask/Tell

Doer No Yes Tell

Dispatcher System No Translate

Translator No Yes Translate

Page 64: Beyond design patterns   phpnw14

Translator

class UserView {

/** * @return string HTML */ public function render(User $user);

}

Page 65: Beyond design patterns   phpnw14

Object Role Patterns

State? Logic? Mode

Representer User No Ask/Tell

Doer No Yes Tell

Dispatcher System No Translate

Translator No Yes Translate

Maker System Yes Ask

Page 66: Beyond design patterns   phpnw14

Makers

class UserFactory {

/** * @return User a user object */ public function getUser();

}

Page 67: Beyond design patterns   phpnw14

Object Role Patterns

State? Logic? Mode

Representer User No Ask/Tell

Doer No Yes Tell

Dispatcher System No Translate

Translator No Yes Translate

Maker System Yes Ask

Page 68: Beyond design patterns   phpnw14

Object Role Patterns

Representer

Doer

Dispatcher

Translator

Maker

Page 69: Beyond design patterns   phpnw14

Object Oriented Design

… is the process of planning a system of interacting objects for the purpose of solving a software problem.

-Wikipedia

Page 70: Beyond design patterns   phpnw14

Object Oriented Design

… is the process of planning a system of interacting objects for the purpose of solving a software problem.

-Wikipedia

Page 71: Beyond design patterns   phpnw14

Design PatternsAre Important!

And Should Be Used!

Page 72: Beyond design patterns   phpnw14

But OOP Is Not About “Finding The Correct

Pattern”

Page 73: Beyond design patterns   phpnw14

Focus on:Communication

InteractionAnd Abstraction

Page 74: Beyond design patterns   phpnw14

Remember:OOP Is About

Solving Problems

Page 75: Beyond design patterns   phpnw14

Anthony Ferrarajoind.in/11796

@[email protected]

github.com/ircmaxellyoutube.com/ircmaxell