Top Banner
Common Design Patterns Steve Smith @ardalis | ardalis.com Telerik http://flic.kr/ p/4MEeVn
42

Common design patterns (migang 16 May 2012)

Jan 27, 2015

Download

Technology

Steven Smith

A discussion of six common design patterns, when to use them, how they are implemented, and when to avoid them.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Common design patterns (migang 16 May 2012)

Common Design Patterns

Steve Smith@ardalis | ardalis.comTelerik

http://flic.kr/p/4MEeVn

Page 2: Common design patterns (migang 16 May 2012)

Design Patterns

http://flic.kr/p/8XgqKu

Page 3: Common design patterns (migang 16 May 2012)

Stages of Learning

Stage Zero - Ignorance

Stage One - Awakening

Stage Two - Overzealous

Stage Three – Mastery

http://flic.kr/p/6StgW5

Page 4: Common design patterns (migang 16 May 2012)

Language

http://flic.kr/p/6UpMt9

Page 5: Common design patterns (migang 16 May 2012)

http://geekandpoke.typepad.com/geekandpoke/2011/04/design-patterns-are-still-useful.html

Page 6: Common design patterns (migang 16 May 2012)

Actual Usage http://twtpoll.com/r/t7jzrx

Page 7: Common design patterns (migang 16 May 2012)

Common Design Patterns

0.Singleton1.Strategy2.Repository3.Proxy4.Command5.Factory

(Of course there are many others!)

Page 8: Common design patterns (migang 16 May 2012)

(Singleton)

Page 9: Common design patterns (migang 16 May 2012)

Singleton: Intent

Ensure a class has only one instance

Make the class itself responsible for keeping track of its sole instance

“There can be only one”

Page 10: Common design patterns (migang 16 May 2012)

Singleton Structure (not thread-safe)

Page 11: Common design patterns (migang 16 May 2012)

How Singleton Is Used

Call methods on Instance directly

Assign variables to Instance

Pass as Parameter

Page 12: Common design patterns (migang 16 May 2012)

Singleton Structure (thread-safe and fast)

Source: http://csharpindepth.com/Articles/General/Singleton.aspx

Page 13: Common design patterns (migang 16 May 2012)

Singleton Consequences The default implementation not thread-safe

Should not be used in multi-threaded environments Should not be used in web server scenarios (e.g. ASP.NET)

Singletons introduce tight coupling among collaborating classes

Singletons are notoriously difficult to test Commonly regarded as an anti-pattern

Violate the Single Responsibility Principle Class is responsible for managing its instances as well as whatever it

does

Using an IOC Container it is straightforward to avoid the coupling and testability issues

Shameless Plug:Telerik JustMock can be used to mock and test

Singletons

But why would you intentionally write code you can only test with

certain premium tools?

Page 14: Common design patterns (migang 16 May 2012)

Strategy

http://flic.kr/p/6spkwo

Page 15: Common design patterns (migang 16 May 2012)

Strategy: Intent Encapsulate a family of related algorithms

Let the algorithm vary and evolve independently from the class(es) that use it

Allow a class to maintain a single purpose Single Responsibility Principle (SRP) Also enables Open/Closed Principle (OCP) Learn more about SRP and OCP here: http://bit.ly/hfT16I

Page 16: Common design patterns (migang 16 May 2012)

Strategy : Structure

Page 17: Common design patterns (migang 16 May 2012)

Strategy : Common Usage

Dependency Inversion and Dependency Injection

Decouple class dependencies and responsibilities

Create interfaces for each responsibility

Inject the implementation of the interface via the constructor

Move the implementation to a new class that implements the interface

Page 18: Common design patterns (migang 16 May 2012)

Hidden Dependencies Classes should declare their dependencies via their

constructor

Avoid hidden dependencies Anything the class needs but which is not passed into

constructor

Avoid making non-stateless static calls Avoid directly instantiating classes (except those

with no dependencies, like strings)

Instead, move these calls to an interface, and call a local instance of the interface

Page 19: Common design patterns (migang 16 May 2012)

“New is Glue”

Be conscious of the consequences of using “new”

If you need loose coupling, replace “new” with Strategy Pattern

http://flic.kr/p/aN4Zv

“new” creates tight coupling between classes

Page 20: Common design patterns (migang 16 May 2012)

Repository A Data Access Pattern

Separates persistence responsibility from business classes

Enables Single Responsibility Principle Separation of Concerns Testability

Frequently Separate Interfaces for Each Entity in Application E.g. CustomerRepository, OrderRepository, etc. Or using Generics: IRepository<TEntity>

Page 21: Common design patterns (migang 16 May 2012)

Data Access Evolution

No separation of concerns:

Data access logic baked directly into UI ASP.NET Data Source Controls Classic ASP scripts

Data access logic in UI layer via codebehind ASP.NET Page_Load event ASP.NET Button_Click event

User Interface

Database

Compile Time

Runtime

Page 22: Common design patterns (migang 16 May 2012)

Data Access : Helper Classes

Calls to data made through a utility

Example: Data Access Application Block (SqlHelper)

Logic may still live in UI layer

Or a Business Logic Layer may make calls to a Data Access Layer which might then call the helper

User Interface

Database

Compile Time

Runtime

Helper Class

Page 23: Common design patterns (migang 16 May 2012)

What’s Missing? Abstraction!

No way to abstract away data access

Tight coupling

Leads to Big Ball of Mud system

Solution: Depend on interfaces, not

concrete implementations What should we call such

interfaces? Repositories!

User Interface

Database

Compile Time

Runtime

CoreIFooRepository

InfrastructureSqlFooRepository

Page 24: Common design patterns (migang 16 May 2012)

Repository

Page 25: Common design patterns (migang 16 May 2012)

Repository - Example

Page 26: Common design patterns (migang 16 May 2012)

Repository - Example

Page 27: Common design patterns (migang 16 May 2012)

Where do Repositories Live?

Place interfaces in Core Core includes Model classes and most business logic Core has no dependencies (ideally)

Place implementation in Infrastructure Infrastructure references Core

UI layer references both Core and Infrastructure Responsible for creating object graph, either manually or

via an IOC Container

Page 28: Common design patterns (migang 16 May 2012)

Proxy

Page 29: Common design patterns (migang 16 May 2012)

Proxy A class that controls access to another

Implemented via subclass or via delegation using a common interface

Frequent use cases: Remote Proxy for web services / network calls Lazy loading implementations Security / access control

Page 30: Common design patterns (migang 16 May 2012)

Proxy - Structure

Page 31: Common design patterns (migang 16 May 2012)

Adding Caching to a Repository

Caching is frequently added to query methods in repositories

Caching logic is a separate concern and should live in a separate class from the main data access logic

Proxy pattern provides a straightforward means to control access to the “real” data, versus the cache

Page 32: Common design patterns (migang 16 May 2012)

Proxy – CachedRepository Implementation

Page 33: Common design patterns (migang 16 May 2012)

Command

http://flic.kr/p/5Yb5i

Page 34: Common design patterns (migang 16 May 2012)

Command Represent an action as an

object

Decouple performing the action from the client that is issuing the command

Common scenarios: Delayed execution Logging activity Enabling Undo / Revoke

Transaction functionality

Page 35: Common design patterns (migang 16 May 2012)

Command

Page 36: Common design patterns (migang 16 May 2012)

Command : Usage Great for representing state transitions (the arrows

below)

Pending

PublishedArchived

Page 37: Common design patterns (migang 16 May 2012)

Factory

http://flic.kr/p/vGpC2

Page 38: Common design patterns (migang 16 May 2012)

Factory: Intent Separate object creation from the decision of which

object to create

Defer creation of objects Only create them if and when needed

Add new classes and functionality without breaking client code Only factory needs to know about new types available

Store possible objects to create outside of program Configuration Persistent Storage Plug-in assemblies

Page 39: Common design patterns (migang 16 May 2012)

Practice PDD Pain

Driven

Development

If it’s causing pain, fix it.

Page 40: Common design patterns (migang 16 May 2012)

CODEDesign Patterns in Action

Page 41: Common design patterns (migang 16 May 2012)

References Design Patterns, http://amzn.to/95q9ux Design Patterns Explained, http://amzn.to/cr8Vxb Design Patterns in C#, http://amzn.to/bqJgdU Head First Design Patterns, http://amzn.to/aA4RS6

Pluralsight Design Patterns Libraryhttp://www.pluralsight-training.net/microsoft/olt/Course/Toc.aspx?n=patterns-library

Pluralsight Principles of OO Design / SOLID Coursehttp://www.pluralsight-training.net/microsoft/Courses/TableOfContents?courseName=principles-oo-design

My Blog http://ardalis.com

Page 42: Common design patterns (migang 16 May 2012)

Summary Design Patterns can be used during

refactoring or initial design to improve code quality

Become comfortable with a number of design patterns, but focus on the most common ones

Use design patterns to address pain in your design, such as tight coupling or excessive repetition

Design patterns can be combined in powerful ways, such as Strategy-Proxy-Repository