code camp 2012-advanced-design-patterns

45
Amir Barylko Advanced Design Patterns AMIR BARYLKO ADVANCED DESIGN PATTERNS WINNIPEG CODECAMP FEB 2012

Upload: amir-barylko

Post on 31-Oct-2014

693 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

AMIR BARYLKO

ADVANCEDDESIGN  PATTERNS

WINNIPEG CODECAMPFEB 2012

Page 2: Code camp 2012-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: Code camp 2012-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: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

PATTERNSWhat are they?

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

Page 5: Code camp 2012-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: Code camp 2012-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: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

WHICH PATTERNS DO YOU USE?

• Fill here with your patterns:

Page 8: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

ADVANCED PATTERNSLet’s vote!

Page 9: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

SOME PATTERNS...

• Chain of resp.

• Proxy

• ActiveRecord

• Repository

• Event Aggregator

• Event Sourcing

• List Comprehension

•Object Mother

• Visitor

•Null Object

• Factory

• Strategy

•DTO

• Page Object

Page 10: Code camp 2012-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 11: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

Page 12: Code camp 2012-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 13: Code camp 2012-advanced-design-patterns

GOF

Page 14: Code camp 2012-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 15: Code camp 2012-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 16: Code camp 2012-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 17: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

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

Page 18: Code camp 2012-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 19: Code camp 2012-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 20: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

MT COMMONS

Page 21: Code camp 2012-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 22: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

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

Page 23: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

Page 24: Code camp 2012-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 25: Code camp 2012-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 26: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

OBJECT MOTHER / BUILDER

• Creates an object for testing (or other) purposes

• Assumes defaults

• Easy to configure

• Fluid interface

• Usually has methods to to easily manipulate the domain

Page 27: Code camp 2012-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 28: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

Page 29: Code camp 2012-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 30: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

http://en.wikipedia.org/wiki/Visitor_pattern#Diagram

Page 31: Code camp 2012-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 32: Code camp 2012-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 33: Code camp 2012-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 34: Code camp 2012-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 35: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

STRATEGY

• Abstracts the algorithm to solve a particular problem

• Can be configured dynamically

• Are interchangeable

Page 36: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

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

Page 37: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

DATA TRANSFER OBJECT

• Simplifies information transfer across services

• Can be optimized

• Easy to understand

Page 38: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

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

Page 39: Code camp 2012-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 40: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

public class LoginPage {    public HomePage loginAs(String username, String password) {        // ... clever magic happens here    }        public LoginPage loginWithError(String username, String password) {        //  ... failed login here, maybe because // one or both of the username and password are wrong    }        public String getErrorMessage() {        // So we can verify that the correct error is shown    }}

http://code.google.com/p/selenium/wiki/PageObjects

Page 41: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

QUESTIONS?

Page 42: Code camp 2012-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 43: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

RESOURCES II

Page 44: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

RESOURCES III

Page 45: Code camp 2012-advanced-design-patterns

Amir Barylko Advanced Design Patterns

QUALITY SOFTWARETRAINING

• Topics: Kanban, BDD & TDD.

•When: May 6, 11-12 & 17-18

•More info: http://www.maventhought.com

• Goal: Learn techniques, methodologies and tools to improve the quality in your day to day job.