Mastering Software Design Patterns: A Guide to the 'Gang of Four' Book
E N D
Presentation Transcript
“Design Patterns” • A popular and influential software engineering text • Published in 1995 amid upsurge of OO programming • Triggered widespread and ongoing interest in patterns • Often referred to as the “Gang of Four” (GoF) book • Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides • Thanks to Stephen Jewett (CSE 432 Spring 2006) for the following ha-ha-only-serious observation: “Warning – Reading this Book May Cause an Uncontrollable Urge to Redesign Everything”
GoF Book’s Preface • Assumptions about readers’ background • Familiarity with object-oriented design ideas • E.g., polymorphism, types, interface, implementation, etc. • A willingness to revisit (see iterator pattern :-) the ideas • What this book isn’t • A deeply technical or formal treatment of programming • I.e., other texts cover type theory, automata, algorithms, etc. • A recipe (or cookbook) for generating a design or designs • What this book is • A (potentially new) way of thinking about program design • A great source of small illustrative design examples • A resource to return to again and again as you design code
GoF Book’s Forward • The GoF book’s forward was written by Grady Booch • An early leader in the development of object-oriented design • Founded Rational Software, which IBM later acquired • The Booch Method was merged with OMT to form UML • An important observation about software and patterns • Well structured object-oriented software is “pattern-rich” • “Collaborations” among objects are common (recurring) • This level of detail is crucial to crafting complex systems well • Connecting building and software architecture • Alexander et al. used patterns to characterize houses, cities • Gamma, Helm, Johnson, Vlissides showed how that idea can be translated to software systems
GoF Book’s Guide to Readers • Multiple ways to read this book (we’ll use all 3 ways) • As a textbook: a primer, then a case study, then a catalog • As a design treatise: from common problems to specifics • On-demand: skipping around based on what you need • Suggestions for simple and common patterns to study • Abstract Factory • Adapter • Composite • Decorator • Factory Method • Observer • Strategy • Template Method
GoF Book’s Introduction • Designing reusable object-oriented software is difficult • Objects, classes, interfaces, hierarchies, associations • Structure how these different features inter-relate in a design • Expert designers already know how to do this well • They also re-use solutions (or parts of solutions) that work • How can what they re-use be captured, and communicated? • Key idea is that the problems and their solutions recur • So we can document problems and solutions together • Design patterns do this recording, in an accessible form • Helps us remember patterns, and learn new ones
What is a Design Pattern? (GoF 1.1) • A pattern has a name • So that we can refer to it, as part of a design vocabulary • A pattern documents a recurringproblem • Tells us when to apply the pattern, and in what contexts • A pattern describes the core of a solution • An approach that we can apply/adapt in different contexts • Not a recipe for a concrete design (not so narrow/limited) • A pattern documents resulting consequences • Possible trade-offs in applying that solution to that problem • New problems that may arise due to the use of the pattern
Model-View-Controller Case Study (GoF 1.2) • A nice illustration of Grady Booch’s observation • Well-structured software (MVC vs. monolithic interfaces) • Evident patterns (Observer, Composite, Strategy, etc.) • Observation holds true even for many small examples • Thought question: is MVC itself a pattern? • Are a name, problem, solution, and consequences evident? • How general is its domain of applicability? • Can it be decomposed further into more fundamental patterns?
Describing Design Patterns (GoF 1.3) • We said what features a pattern must have • a name, problem, solution, and consequences (inherent) • But, what else is useful to describe about a pattern? • GoF authors present one such layout in the book • “Intent” is particularly useful (see 1.4, inside front cover) • “Also known as” helps prune proliferation of names (a key merit of patterns lies in commonality rather than originality) • Structure/collaborations relate to design methodology (UML) • Sample code illustrates use of the pattern concretely • Known uses help document recurrence of the pattern • There are many other formats in the patterns literature • GoF format is merely one of the more popular ones • Each establishes a particular genre for describing patterns • And, some authors use some or all of a genre’s attributes
A Catalog of Design Patterns (GoF 1.4, 3, 4, 5) • Each pattern’s name and intent are listed • Along with the page number in the GoF book where it starts • List is also inside the book’s front cover for quick access • Patterns are listed alphabetically by name in 1.4 • In the catalog they’re organized by category of purpose • I.e., creational, structural, or behavioral (Table 1.1 in 1.5)
Catalog Organization (GoF 1.5) • GoF patterns are creational, structural, or behavioral • Creational patterns involve construction of new objects • Structural patterns involve static class/object relationships • Behavioral patterns involve dynamic (run-time) interactions • Apply (primarily) to classes, objects, or both • E.g., class form of adapter involves (private) inheritance • E.g., object form of adapter involves delegation
How to Select a Design Pattern (GoF 1.7) • (We’ll come back to GoF section 1.6 in a moment) • Think concretely about your design problem (GoF 1.6) • Object/interface/implementation level structure matters • Everything you’ve already learned about design still applies • Look at the intent descriptions in 1.4 (as a quick index) • Think about how patterns interrelate in evolving design • See patterns map on page 12 in 1.6, and inside back cover • Would other patterns in the same category fit better? • Creational, structural, or behavioral • Watch and avoid causes of redesign (page 24 in 1.6) • Consider what should be fixed and what should vary • See table 1.2 on page 30
How to Use a Design Pattern (GoF 1.8) • First, skim a pattern to determine whether its useful • Look especially at applicability and consequences • If it looks like a good match, study it more thoroughly • Understand classes, static and dynamic structure • Look at the code examples for implementation ideas • Start with high level design • Initially, name the participants in your design (descriptively, aptly, and clearly) • Make sure the participants fulfill pattern roles well • Move into low level design (specification of classes) • Lay out class members, interfaces, associations • Move from there into implementation • Define class methods, their interactions within the system
How Patterns Solve Design Problems (GoF 1.6) • First, a few reminders/pointers to useful info • Patterns list inside front cover and on pages 8-9 • Patterns map inside back cover and on page 12 • Diagram notation in Appendix B and inside back cover • Section 1.6 focuses on how design patterns fit within established object-oriented development techniques • Patterns augment rather than replace existing methods • Section 1.6 follows standard design evolution described in section 1.8 • Begin with high-level design (identifying participants) • Move to low-level design (specify concrete relationships) • Move to implementation (define concrete behaviors)
Finding Appropriate Objects • This should all be very familiar in OO design • An object combines data and behavior • An object plays a role within a program (does something) • Not all objects are immediately obvious • Try the “noun/verb” trick for spotting objects • A variant of the CRC approach (not part of GoF per se) • In any requirement, try to write as concretely as possible • Should have lots of description of what’s done by whom • Underline nouns in the description as potential objects • Underline verbs in the description as potential behaviors • Identifying object granularity and multiplicity also matters for pattern choice (flyweights vs. singletons)
Specifying Object Interfaces • Pay attention to operations and their signatures • Name and ordered list of types supplied to an operation • Collect common sets of operations into cohesive abstractions (possibly organized hierarchically) • Allows polymorphic substitution of objects per subtyping
Specifying Object Implementations • Once the interfaces are established, what’s left? • Need to identify necessary data to implement interface operations • Need to establish class relationships allowing substitution of objects passed as operation arguments • E.g., inheritance for object-oriented polymorphism • E.g., models relations for generic (interface) polymorphism • Need to establish other relationships like delegation, etc. based on interfaces rather than on implementations (so design isn’t brittle to changes)
Putting Re-use Mechanisms to Work • Inheritance vs. composition • Inheritance of interface vs. implementation • Delegation as a powerful form of composition (allows replacement of target class even at run-time if necessary) • Inheritance vs. parameterized types • This has come a long way since 1995, but they anticipated several of the most important issues at least abstractly
Relating Run-Time and Compile-Time Structures • Different languages have different compile time vs. run-time features (say, Smalltalk vs. C++) • Even within a language, these distinctions matter • Run-time polymorphism with C++ virtual member functions • Compile-time polymorphism with C++ templates and traits • Careful attention to when things can change as well as what can change is crucial to robust design
Designing for Change • Change can be required at several different scales • Fine-grained time scale (e.g., run-time object substitution) • Medium-grained time scale (e.g., program updates) • Long-term time scale (e.g., system requirement evolution) • Designing for change is crucial to master • Pages 24 through 28 offer tips and ideas • With pointers to specific patterns that are relevant (a very nice guide to go back to again and again as you design) • Experience with when to worry about change also helps • Design with the idea that change is “looking over your shoulder” at all times
Summary and Review Questions • The GoF book presents a useful design pattern genre • And a catalog of many important patterns described that way • The GoF book also motivates and describes the process of pattern-oriented design, with examples • E.g., MVC involving observer, strategy, composite, etc. • Thanks to Genevieve Gurney (CSE 432 Spring 2006) for the following review questions: “What are the four essential elements of a design pattern?” “What design issues don’t the GoF design patterns address?”