Code camp 2012-advanced-design-patterns
-
Upload
amir-barylko -
Category
Technology
-
view
694 -
download
0
description
Transcript of Code camp 2012-advanced-design-patterns
![Page 1: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/1.jpg)
Amir Barylko Advanced Design Patterns
AMIR BARYLKO
ADVANCEDDESIGN PATTERNS
WINNIPEG CODECAMPFEB 2012
![Page 2: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/2.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/3.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/4.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/5.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/6.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/7.jpg)
Amir Barylko Advanced Design Patterns
WHICH PATTERNS DO YOU USE?
• Fill here with your patterns:
![Page 8: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/8.jpg)
Amir Barylko Advanced Design Patterns
ADVANCED PATTERNSLet’s vote!
![Page 9: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/9.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/10.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/11.jpg)
Amir Barylko Advanced Design Patterns
![Page 12: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/12.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/13.jpg)
GOF
![Page 14: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/14.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/15.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/16.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/17.jpg)
Amir Barylko Advanced Design Patterns
http://martinfowler.com/eaaCatalog/repository.html
![Page 18: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/18.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/19.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/20.jpg)
Amir Barylko Advanced Design Patterns
MT COMMONS
![Page 21: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/21.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/22.jpg)
Amir Barylko Advanced Design Patterns
http://martinfowler.com/eaaDev/EventSourcing.html
![Page 23: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/23.jpg)
Amir Barylko Advanced Design Patterns
![Page 24: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/24.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/25.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/26.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/27.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/28.jpg)
Amir Barylko Advanced Design Patterns
![Page 29: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/29.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/30.jpg)
Amir Barylko Advanced Design Patterns
http://en.wikipedia.org/wiki/Visitor_pattern#Diagram
![Page 31: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/31.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/32.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/33.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/34.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/35.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/36.jpg)
Amir Barylko Advanced Design Patterns
http://orthocoders.com/2010/04/
![Page 37: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/37.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/38.jpg)
Amir Barylko Advanced Design Patterns
http://martinfowler.com/eaaCatalog/dataTransferObject.html
![Page 39: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/39.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/40.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/41.jpg)
Amir Barylko Advanced Design Patterns
QUESTIONS?
![Page 42: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/42.jpg)
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](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/43.jpg)
Amir Barylko Advanced Design Patterns
RESOURCES II
![Page 44: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/44.jpg)
Amir Barylko Advanced Design Patterns
RESOURCES III
![Page 45: Code camp 2012-advanced-design-patterns](https://reader034.fdocuments.us/reader034/viewer/2022051608/54540d34b1af9f95228b48b3/html5/thumbnails/45.jpg)
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.