Our approach, known as Responsibility-Driven Design, is a way of designing complex software systems using objects and component technology. Responsibility-Driven Design was conceived in 1990 as a shift from thinking about objects as data + algorithms, to thinking about objects as roles + responsibilities. Responsibility-Driven Design catalyzes software and systems design with practical techniques and thinking tools. Responsibility-Driven Design had its roots in Smalltalk design and development, where everything is an object and the way to structure an application is by conceiving of right-sized cooperating objects. Since those early object technology days, responsibility-driven design has had a profound influence on other "-driven" development practices. Even though you may be familiar with test-driven development, behavior-driven development, or domain-driven design, you may not know of their influences and what they share in common. As we move forward and discover new ways of designing, it can be productive to examine our past. The keynote, What Drives Design?, that Rebecca Wirfs-Brock delivered at OOPSLA 2008 and reprised at Øredev 2009 makes connections between several "driven" design practices and challenges the post-modern designer to seek practices that sustain living software.
In a responsibility-based object model, objects play specific roles and occupy well-known positions in the system's architecture. It is a smoothly-running community of objects. Each object is accountable for a specific portion of the work. Objects collaborate in clearly-defined ways, contracting with each other to fulfill the larger goals of the application. By creating such a "community" of objects, assigning specific responsibilities to each, you build a collaborative model of your software. When employing object technology you assign responsibilities to objects working together to fulfill the larger responsibilities of your system. And you use responsibilities to define the interfaces of classes and their test plans during coding. Programmers can reason about and discuss a module, function or object's responsibilities while they cope with myriad coding details. When details are hidden in “helper” code they can be changed and extended swiftly without affecting the implementation of major responsibilities.
Objects are more than simple bundles of logic and data ... they are service-providers, information-holders, structurers, coordinators, controllers, and interfacers to the outside world. Each must know and do its part! Thinking in terms of these object role stereotypes enables you to build powerful, flexible software. Developing consistent control styles for similar parts of your software reduces maintenance costs. Incorporating flexibility into your design at specific 'flex points' allows for planned extensions.
“Understanding responsibilities is key to good object-oriented design”—Martin Fowler
Our most recent efforts have focused on integrating concepts from domain-driven design with responsibility-driven design thinking and using Responsibility-Driven Design principles and techniques to design larger scale systems and their elements. In a complex world of code, data, and interconnected systems, responsibilities are a natural way of thinking about how to organize software and to design appropriate patterns of interaction.
Who We Are
Rebecca Wirfs-Brock, who founded Wirfs-Brock Associates in 1997, is an object technology innovator and pioneer. Having invented Responsibility-Driven Design while at Tektronix in 1990, she has pushed on object and design thinking for over 30 years. Wirfs-Brock Associates also calls upon consulting and training associates with proven track records designing complex software and developing high-quality training and education experiences. Our services span the entire development life-cycle, ranging from courses and workshops on agile architecting and design heuristics, to architecture decision-making, software design, and modeling with a practical bent. Check out our Consulting and Training Services and our popular book.