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 object technology 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 go examinie our past. The keynote, What Drives Design?, that Rebecca Wirfs-Brock delivered at OOPSLA 2008 makes connections between several "driven" design practices and challenges the post-modern designer to seek practices that sustain living software.
In a responsibility-based model, objects play specific roles and occupy well-known positions in the application 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 application.
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 applications. Developing consistent control styles for similar parts of your application reduces maintenance costs. Incorporating flexibility into your design at specific flex points allows for planned extensions.
Responsibility-Driven Design enables you to think clearly about object design and leverage object technology to its full advantage.
Understanding responsibilities is key to good object-oriented designMartin Fowler
The shift to thinking about responsibilities can be a profound one. It impacts all development activities. During analysis, you think about what the system is responsible for and how it will support its users. You can write a form of use case, called a conversation, that record user-system interactions and clearly separates users actions from system responsibilities. During high-level design, you map system responsibilities to appropriate components and subsystems. When employing object technology you assign responsibilities to objects working together to fulfill the larger responsibilities of application. You use responsibilities to define the interfaces of classes and their test plans during coding. Programmers still reason about and discuss object 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. In a complex world of code, data, and interconnected systems, responsibilities are a natural way of thinking about software.
Quite simply, responsibilities are the best way to think about the behaviors of complex software systems!
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 thinking for the past 20 years. Wirfs-Brock Associates also calsl upon consulting and training associates with proven track records designing complex applications and developing high-quality training and education experiences. Our services span the entire development life-cycle, ranging from courses and workshops on crafting agile use cases, to architecture and object design and programming with a practical bent. Check out our Consulting and Training Services and our popular book.