prdc12 advanced design patterns

64
Amir Barylko Advanced Design Patterns Advanced Design Patterns & Anti-Patterns with Amir Barylko

Upload: amir-barylko

Post on 30-Oct-2014

1.657 views

Category:

Documents


0 download

DESCRIPTION

Talk about common used design patterns and anti-patterns

TRANSCRIPT

Page 1: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

Advanced Design Patterns &

Anti-Patternswith Amir Barylko

Page 2: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

WHO AM I?

• Software quality expert

• Architect

•Developer

•Mentor

• Great cook

• The one who’s entertaining you for the next hour!

Page 3: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

RESOURCES

• Email: [email protected]

• Twitter : @abarylko

• Blog: http://www.orthocoders.com

•Materials: http://www.orthocoders.com/presentations

Page 4: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

PATTERNSWhat are they?

What are anti-patterns?Which patterns do you use?

Page 5: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

WHAT ARE PATTERNS?

•Software design Recipe

•or Solution

•Should be reusable

•Should be general

•No particular language

Page 6: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

ANTI-PATTERNS

• More patterns != better design

• No cookie cutter

• Anti Patterns : Patterns to identify failure

• God Classes

• High Coupling

• Breaking SOLID principles....

• (name some)

Page 7: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

WHICH PATTERNS DO YOU USE?

• Fill here with your patterns:

Page 8: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

ADVANCED PATTERNSLet’s vote!

Page 9: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

SOME PATTERNS...

•MVVM

• Chain of resp.

• Proxy

• ActiveRecord

• Repository

• Event Aggregator

• Event Sourcing

• Test Factory

• Visitor

•Null Object

• Factory

• Strategy

•DTO

• Page Object

Page 10: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

MODEL VIEW VIEW MODEL

• Separate presentation from business logic (view from model)

• Around the family of MVC, MVP, etc...

•Most useful when binding is available

•Many JS libraries uses it (Knockout.js, Ember.js, etc...)

•WPF it is based on MVVM

Page 11: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

THE MODEL

• Represents data

• Could be a one or multiple objects

• Feeds the view model

• However, does not know the view or the view model

Page 12: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

THE VIEW

• Represents what is shown to the user

•Desktop window

• HTML Page

•Does not know the model

• Loosely coupled to the the view model, binding does all the job

Page 13: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

THE VIEW MODEL

• Represents all the data that the view needs

• It could be constructed based on on multiple models

• Communicate events to update the view using binding

• Complex UI may require composition of MVVM

Page 14: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

WHAT IS BINDING?

• Binding connects a model and a UI that represents that model

• In order to update the UI and the model to match

•Native to the framework or library

• Very related to Subject and Observer

• Also could be an MVC implementation

Page 15: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

FOR EACH BINDINGfunction AppViewModel() { var self = this; self.people = ko.observableArray([ { name: 'Bert' }, { name: 'Charles' }, { name: 'Denise' } ]); self.addPerson = function() { self.people.push({ name: "New at " + new Date() }); }; self.removePerson = function() { self.people.remove(this); }}

ViewModel

http://knockoutjs.com/documentation/foreach-binding.html

Page 16: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

FOR EACH BINDING

<h4>People</h4><ul data-bind="foreach: people"> <li> Name at position <span data-bind="text: $index"> </span>: <span data-bind="text: name"> </span> <a href="#" data-bind="click: $parent.removePerson">Remove</a> </li></ul>

<button data-bind="click: addPerson">Add</button>

List binding

Command binding

Data binding

Page 17: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

THE MAGIC

ko.applyBindings(new AppViewModel());

ViewModel View

Adding element Adds <li>

Remove element Removes <li>

Execute function Click <button>

Page 18: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

CHAIN OF RESPONSIBILITY

•More than one object may handle a request, and the handler isn't known a priori.

• The handler should be ascertained automatically.

• You want to issue request to one of several objects without specifying The receiver explicitly.

• The set of objects that can handle a request should be specified dynamically

Page 19: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

Page 20: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

SnapToX

SnapToY

SnapToPrevious

Next

Next

Page 21: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

Page 22: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

PROXY

• Avoid creating the object until needed

• Provides a placeholder for additional functionality

• Very useful for mocking

•Many implementations exist (IoC, Dynamic proxies, etc)

Page 23: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

GOF

Page 24: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

PROXY SEQUENCE

Page 25: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

ACTIVERECORD

• Is a Domain Model where classes match very closely the database structure

• Each table is mapped to class with methods for finding, update, delete, etc.

• Each attribute is mapped to a column

• Associations are deduced from the classes

Page 26: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

create_table "movies", :force => true do |t| t.string "title" t.string "description" t.datetime "created_at" t.datetime "updated_at" end

create_table "reviews", :force => true do |t| t.string "name" t.integer "stars" t.text "comment" t.integer "movie_id" t.datetime "created_at" t.datetime "updated_at" end

class Movie < ActiveRecord::Base validates_presence_of :title, :description has_many :reviewsend

class Review < ActiveRecord::Base belongs_to :movieend

Page 27: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

movie = Movie.new

movie.all # all records

# filter by titlemovie.where(title: 'Spaceballs')

# finds by attributemovie.find_by_title('Blazing Saddles')

# order, skip some and limit the resultmovie.order('title DESC').skip(2).limit(5)

# associations CRUDmovie.reviews.create(name: 'Jay Sherman',

stars: 1, comment: 'It stinks!')

Page 28: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

REPOSITORY

•Mediator between domain and storage

• Acts like a collection of items

• Supports queries

• Abstraction of the storage

Page 29: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

Page 30: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

http://martinfowler.com/eaaCatalog/repository.html

Page 31: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

ANTIPATTERNCHEAPER BY THE DOZEN

Page 32: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

WHAT TO DO?

• Use a criteria or better a queryable result (LINQ)

• Use a factory to return repositories

• Use a UnitOfWork with a factory

Page 33: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

EVENT AGGREGATOR

•Manage events using a subscribe / publish mechanism

• Isolates subscribers from publishers

•Decouple events from actual models

• Events can be distributed

• Centralize event registration logic

•No need to track multiple objects

Page 34: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

Channel events from multiple o b j e c t s i n t o a single object to s i m p l i f y registration for clients

Page 35: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

MT COMMONS

Page 36: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

COUPLED

Page 37: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

DECOUPLED

Page 38: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

EVENT SOURCING

• Register all changes in the application using events

• Event should be persisted

• Complete Rebuild

• Temporal Query

• Event Replay

Page 39: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

http://martinfowler.com/eaaDev/EventSourcing.html

Page 40: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

Page 41: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

LIST COMPREHENSION

• Syntax Construct in languages

•Describe properties for the list (sequence)

• Filter

•Mapping

• Same idea for Set or Dictionary comprehension

Page 42: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

• Scalafor (x <- Stream.from(0); if x*x > 3) yield 2*x

• LINQ var range = Enumerable.Range(0..20);from num in range where num * num > 3 select num * 2;

• Clojure(take 20 (for [x (iterate inc 0) :when (> (* x x) 3)] (* 2 x)))

• Ruby(1..20).select { |x| x * x > 3 }.map { |x| x * 2 }

LANGUAGE COMPARISON

Page 43: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

TEST FACTORY / BUILDER

• Creates an object for testing (or other) purposes

• Assumes defaults

• Easy to configure

• Fluent interface

• Usually has methods to to easily manipulate the domain

Page 44: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

public class When_adding_a_an_invalid_extra_frame{ [Test] public void Should_throw_an_exception() { // arrange 10.Times(() => this.GameBuilder.AddFrame(5, 4));

var game = this.GameBuilder.Build();

// act & assert new Action(() => game.Roll(8)).Should().Throw(); }}

http://orthocoders.com/2011/09/05/the-bowling-game-kata-first-attempt/

Page 45: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

Page 46: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

VISITOR

• Ability to traverse (visit) a object structure

•Different visitors may produce different results

• Avoid littering the classes with particular operations

Page 47: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

LINQ EXPRESSION TREE

Page 48: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

EXPRESSION VISITOR

Page 49: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

AND EXPR EVALUATION

Page 50: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

NULL OBJECT

• Represent “null” with an actual instance

• Provides default functionality

• Clear semantics of “null” for that domain

Page 51: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

class animal {public: virtual void make_sound() = 0;}; class dog : public animal { void make_sound() { cout << "woof!" << endl; }}; class null_animal : public animal { void make_sound() { }};

http://en.wikipedia.org/wiki/Null_Object_pattern

Page 52: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

FACTORY

• Creates instances by request

•More flexible than Singleton

• Can be configured to create different families of objects

• IoC containers are closely related

• Can be implemented dynamic based on interfaces

• Can be used also to release “resource” when not needed

Page 53: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

interface GUIFactory { public Button createButton();} class WinFactory implements GUIFactory { public Button createButton() { return new WinButton(); }}class OSXFactory implements GUIFactory { public Button createButton() { return new OSXButton(); }} interface Button { public void paint();}

http://en.wikipedia.org/wiki/Abstract_factory_pattern

Page 54: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

STRATEGY

• Abstracts the algorithm to solve a particular problem

• Can be configured dynamically

• Are interchangeable

Page 55: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

http://orthocoders.com/2010/04/

Page 56: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

DATA TRANSFER OBJECT

• Simplifies information transfer across services

• Can be optimized

• Easy to understand

Page 57: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

http://martinfowler.com/eaaCatalog/dataTransferObject.html

Page 58: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

PAGE OBJECT

• Abstract web pages functionality to be used usually in testing

• Each page can be reused

• Changes in the page impact only the implementation, not the clients

Page 59: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

class ProjectListPage include PageObject def navigate visit('/projects') self end def edit(project) row = find(:xpath, "//td[.='#{project.name}']") row.parent.click_link('Edit') ProjectEditPage.new end def projects all(:css, "#projects tr")...... endend

Page 60: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

When /^I go to the projects page$/ do project_list_page.navigateend

When /^I activate the project$/ do project_list_page. navigate. edit(current_project). activate. saveend

Page 61: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

QUESTIONS?

Page 62: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

RESOURCES

• Email: [email protected], @abarylko

• Slides: http://www.orthocoders.com/presentations

• Patterns: Each pattern example has a link

Page 63: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

RESOURCES II

Page 64: PRDC12 advanced design patterns

Amir Barylko Advanced Design Patterns

RESOURCES III