Buy 2+, save 55% on books & eBooks through December 1. Use code BOOKSGIVING. Learn more.
After more than ten years, object technology pioneer Rebecca Wirfs-Brock teams with expert Alan McKean to present a thoroughly updated, modern, and proven method for the design of software. The book is packed with practical design techniques that enable the practitioner to get the job done. Like many human endeavors, design is part art, part engineering, part guesswork, and part experimentation. Discipline, hard work, inspiration, and sound technique all play their part as well. For any given problem, there are many reasonable, but only a few very good solutions. The authors' goal is to help readers learn to make those very good design decisions on their own. The book explores challenges that software developers will face as they build their design, and shows how design patterns can be used to solve design problems. Long awaited and eagerly anticipated, this book represents the first great software design book of the century. A FUTURE CLASSIC!
Click below for Sample Chapter(s) related to this title:
Sample Chapter 3
Foreword by Ivar Jacobson.
Foreword by John Vlissides.
1. Design Concepts.
Object Role Stereotypes.
Roles, Responsibilities, and Collaborations.
Conditions-of-Use and Aftereffect Guarantees.
Applying Double Dispatch to a Specific Problem.
The Real Benefits of Using Patterns.
Centralized Control Style.
Dispersed Control: No Centers.
Examining Interactions: A Layered Architecture Example.
Locating Objects in Layers.
A Process for Seeing, Describing, and Designing.
Launching the Production: Project Definition and Planning.
Setting the Stage: Early Description.
Staging the Production: Design.
“Seeing” from Multiple Perspectives.
Writing the Script: Analysis Descriptions.
Casting the Characters: Exploratory Design.
Inventions: Using Patterns.
Pursuing a Solution.
Bouncing Between Ideas and Details.
Tuning the Production: Design Refinement.
Designing for Flexibility and Extension.
Designing for Reliability.
Making Our Design Predictable, Consistent, and Comprehensible.
A Discovery Strategy.
Looking for Objects and Roles, and Then Classes.
Why Tell a Design Story?
What's in a Name?
Looking for Common Ground.
Defend Candidates and Look for Others.
What Are Responsibilities?
Where Do Responsibilities Come From?
Strategies for Assigning Responsibilities.
Making Initial Assignments.
Implementing Objects and Responsibilities.
Testing Your Candidates' Quality.
What Is Object Collaboration?
Preparing for Collaboration.
Recording Candidate Collaborations.
The Design Story for the Speak for Me Software.
Who's In Control?
How Much Should Objects Trust One Another?
Strategies for Identifying Collaborations.
Looking at an Individual Object's Role: Stereotypes Imply Collaborations.
Looking at Individual Responsibilities: They Imply Collaborations.
Designing the Details of a Complex Responsibility.
Designing Collaborations for a Specific Task.
Identifying Applicable Patterns.
Identifying How Architecture Influences Collaborations.
Solving Problems in Collaborations.
Planning a Simulation.
Running a Simulation.
Designing Good Collaborations.
The Law of Demeter: A Case Study.
Making Collaborations Possible.
Guidelines for Making Connections.
Designing Reliable Collaborations.
When Are We Finished?
What Is Control Style?
Control Style Options.
The Limits of Control Decisions.
Developing Control Centers.
A Case Study: Control Style for External User Events.
Centralizing Control in the MessageBuilder.
Refactoring Decision Making into State Methods within the MessageBuilder.
Abstracting Away Decisions.
Delegating More Responsibility.
Designing the Control Style for the Guessing Neighborhood.
Designing a Similar Control Center: Can We Be Consistent?
Telling Collaboration Stories.
A Strategy for Developing a Collaboration Story.
Establishing Scope, Depth, and Tone.
Listing What You Will Cover.
Deciding on the Level of Detail.
Showing a Bird's-Eye View.
Showing Collaborators Only.
Showing a Sequence of Interactions Among Collaborators.
Showing an In-Depth View.
Showing a Focused Interaction.
Showing an Implementation View.
Showing How to Adapt a Collaboration.
Where UML Diagrams Fall Short.
Choosing the Appropriate Form.
Tell It, Draw It, Describe It: Guidelines.
Organizing Your Work.
Unfolding Your Story.
Understanding What's Fundamental.
Putting It All Together.
Understanding the Consequences of Failure.
Increasing Your System's Reliability.
Determining Where Collaborations Can Be Trusted.
Trusted Versus Untrusted Collaborations.
Implications of Trust.
Identifying Collaborations to Be Made Reliable.
What Use Cases Tell Us.
Distinguish Between Exceptions and Errors.
Object Exceptions Versus Use Case Exceptions.
Object Exception Basics.
Exception- and Error-Handling Strategies.
Determining Who Should Take Action.
Designing a Solution.
Brainstorm Exception Conditions.
Limit Your Scope.
Record Exception-Handling Policies.
Documenting Your Exception-Handling Designs.
Specifying Formal Contracts.
Reviewing Your Design.
What Does It Mean to Be Flexible?
Degrees of Flexibility.
The Consequences of a Flexible Solution.
Nailing Down Flexibility Requirements.
Variations and Realizations.
Identifying the Impact of a Variation.
Exploring Strategies for Realizing Flexibility.
Using Templates and Hooks to Support Variations.
The Role of Patterns in Flexible Designs.
Varying an Object's Behavior with the Strategy Pattern.
Hiding Interacting Objects with Mediator.
Making a Predefined Object or System Fit Using Adapter.
How Do Patterns Increase Flexibility?
How to Document a Flexible Design.
Consider Your Audience.
Describing How to Make a Variation.
Changing a Working System's Design.
The Nature of Software Design.
Tackling Core Design Problems.
Frame the Problem.
Dealing with Revealing Design Problems.
A Story About Managing Shared Information.
A Story About Connection Problem Complexity.
A Story About a Design Problem That Never Got Easier.
Can Revealing Problems Be Wicked, Too?
Strategies for Solving Revealing Problems.
Redefining the Problem.
Synthesizing a Solution.
Working on the Rest.
This is a book about designing object software. Like many human endeavors, design is part art, part engineering, part guesswork and experimentation. Discipline, hard work, inspiration, and sound technique all play their parts. Although a highly creative activity, software design fundamentals can be easily learned. There are fundamental strategies and techniques for developing a design solution. This book is packed with many practical design techniques that help you get the job done. We hope you become adept at thinking in objects and excited about devising solutions that exploit object technology.
Design choices can only be considered in light of what you know to be relevant and important. To achieve good results, however, you need to learn to discriminate important choices from mundane ones, and to acquire a good set of techniques that you intelligently practice. In this book, we present informal tools and techniques that don't require much more than a white board, a stack of index cards, a big sheet of paper and chairs around a table. Oh yeah, be sure to bring your brain, too!
But more important than a grab bag of techniques are the fundamental ways you view a design. Although the techniques we present in this book are independent of any particular implementation technology or modeling language or design method; our approach to object design requires a specific perspective:
Objects are not just simple bundles of logic and data... they are responsible members of an object community.
This approach, called Responsibility-Driven Design, forms the basis of how to reason about objects.
Most novice designers are searching for the right set of techniques to rigidly follow in order to produce the correct design. In practice, things are never that straightforward. For any given problem there are many reasonable, and a few very good solutions. People don't produce identical designs, even if they follow similar practices or apply identical design heuristics. For each problem you approach, you make a different set of tactical decisions. The effects of each small decision accumulate. Your current design as well as your current lines of reasoning shape and limit subsequent possibilities. Given the potential impact of seemingly inconsequential decisions, designers need to thoughtfully exercise good judgment.
Your primary tool as a designer is your power of abstraction--forming objects that represent the essence of a working application. In a design, objects play specific roles and occupy well-known positions in an application's architecture. Each object is accountable for a specific portion of the work. Each has specific responsibilities. Objects collaborate in clearly-defined ways, contracting with each other to fulfill the larger goals of the application.
Design is both a collaborative and a solo effort. To work effectively you not only need a rich vocabulary for describing your design, but strategies for finding objects, recipes for developing a collaborative model, and a framework for discussing design trade-offs. You will find these tools in this book. We also explore how design patterns can be used to solve a particular design problem and demonstrate their effects on a design. We present you with strategies for increasing your software's reliability and flexibility. We discuss different types of design problems and effective ways to approach them. This book presents many tools and techniques for reasoning about a design's qualities and effectively communicating design ideas. Whether a student or a seasoned programmer, a senior developer or a newcomer to objects, there are many practical things you can take away from this book.How to Read This Book
This book is organized into two major parts. The first six chapters--Design Concepts, Responsibility-Driven Design, Finding Objects, Responsibilities, Collaborations, and Control Style--form the core of Responsibility-Driven Design principles and techniques.You should get a good grounding by reading these chapters.
Design Concepts introduces fundamental views of object technology and explains how each element contributes to a coherent way of designing an application. Even if you are a veteran designer, a quick read will set the stage for thinking about object design in terms of their roles and responsibilities. Responsibility-Driven Design provides a brief tour of Responsibility-Driven Design in practice. Finding Objects presents strategies for selecting and, equally important, rejecting candidate objects in an emerging design model. Responsibilities presents many techniques for coming up with responsibilities and intelligently allocating them to objects. Collaborations gives many practical tips and examples of how to develop a collaboration model. Control Style describes strategies for developing your application's control centers and options for allocating decision-making and control responsibilities.
The last four chapters explore challenges you may encounter as you develop your design. Each chapter covers a specific topic that builds on the design concepts and techniques presented in the first part of the book. Describing Collaborations explores options for documenting and describing your design. Reliable Collaborations presents strategies for handling exceptions, recovering from errors and collaborating within and across a "trusted region." Flexibility discusses how to characterize software variations and design to support them. On Design discusses how to sort design problems into one of three buckets--the core, the revealing and the rest--and treat each accordingly.
Click below to download the Index file related to this title: