prdc12 advanced design patterns

Post on 30-Oct-2014

1.658 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Talk about common used design patterns and anti-patterns

TRANSCRIPT

Amir Barylko Advanced Design Patterns

Advanced Design Patterns &

Anti-Patternswith Amir Barylko

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!

Amir Barylko Advanced Design Patterns

RESOURCES

• Email: amir@barylko.com

• Twitter : @abarylko

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

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

Amir Barylko Advanced Design Patterns

PATTERNSWhat are they?

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

Amir Barylko Advanced Design Patterns

WHAT ARE PATTERNS?

•Software design Recipe

•or Solution

•Should be reusable

•Should be general

•No particular language

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)

Amir Barylko Advanced Design Patterns

WHICH PATTERNS DO YOU USE?

• Fill here with your patterns:

Amir Barylko Advanced Design Patterns

ADVANCED PATTERNSLet’s vote!

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

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

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

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

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

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

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

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

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>

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

Amir Barylko Advanced Design Patterns

Amir Barylko Advanced Design Patterns

SnapToX

SnapToY

SnapToPrevious

Next

Next

Amir Barylko 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)

Amir Barylko Advanced Design Patterns

GOF

Amir Barylko Advanced Design Patterns

PROXY SEQUENCE

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

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

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!')

Amir Barylko Advanced Design Patterns

REPOSITORY

•Mediator between domain and storage

• Acts like a collection of items

• Supports queries

• Abstraction of the storage

Amir Barylko Advanced Design Patterns

Amir Barylko Advanced Design Patterns

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

Amir Barylko Advanced Design Patterns

ANTIPATTERNCHEAPER BY THE DOZEN

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

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

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

Amir Barylko Advanced Design Patterns

MT COMMONS

Amir Barylko Advanced Design Patterns

COUPLED

Amir Barylko Advanced Design Patterns

DECOUPLED

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

Amir Barylko Advanced Design Patterns

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

Amir Barylko 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

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

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

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/

Amir Barylko 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

Amir Barylko Advanced Design Patterns

LINQ EXPRESSION TREE

Amir Barylko Advanced Design Patterns

EXPRESSION VISITOR

Amir Barylko Advanced Design Patterns

AND EXPR EVALUATION

Amir Barylko Advanced Design Patterns

NULL OBJECT

• Represent “null” with an actual instance

• Provides default functionality

• Clear semantics of “null” for that domain

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

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

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

Amir Barylko Advanced Design Patterns

STRATEGY

• Abstracts the algorithm to solve a particular problem

• Can be configured dynamically

• Are interchangeable

Amir Barylko Advanced Design Patterns

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

Amir Barylko Advanced Design Patterns

DATA TRANSFER OBJECT

• Simplifies information transfer across services

• Can be optimized

• Easy to understand

Amir Barylko Advanced Design Patterns

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

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

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

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

Amir Barylko Advanced Design Patterns

QUESTIONS?

Amir Barylko Advanced Design Patterns

RESOURCES

• Email: amir@barylko.com, @abarylko

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

• Patterns: Each pattern example has a link

Amir Barylko Advanced Design Patterns

RESOURCES II

Amir Barylko Advanced Design Patterns

RESOURCES III

top related