Responsibility-driven design is a design technique in object-oriented programming, which improves encapsulation by using the client–server model. It focuses on the contract by considering the actions that the object is responsible for and the information that the object shares. It was proposed by Rebecca Wirfs-Brock and Brian Wilkerson.
Responsibility-driven design is in direct contrast with data-driven design, which promotes defining the behavior of a class along with the data that it holds. Data-driven design is not the same as data-driven programming, which is concerned with using data to determine the control flow, not class design.
In the client–server model they refer to, both the client and the server are classes or instances of classes. At any particular time, either the client or the server represents an object. Both the parties commit to a contract and exchange information by adhering to it. The client can only make the requests specified in the contract and the server must answer these requests.[1] Thus, responsibility-driven design tries to avoid dealing with details, such as the way in which requests are carried out, by instead only specifying the intent of a certain request. The benefit is increased encapsulation, since the specification of the exact way in which a request is carried out is private to the server.
Overview
Responsibility-driven design focuses on the objects as behavioral abstractions which are characterized by their responsibilities. The CRC-card modelling technique is used to generate these behavioral abstractions. The rest of the object structure including data attributes are assigned later, as and when required.[2] This makes the design follow type hierarchy for inheritance which improves encapsulation and makes it easier to identify abstract classes. It can also group the classes together based on their clients which is considered a unique ability.
A good object-oriented design involves an early focus on behaviors to realize the capabilities meeting the stated requirements and a late binding of implementation details to the requirements. This approach especially helps to decentralize control and distribute system behavior which can help manage the complexities of high-functionality large or distributed systems. Similarly, it can help to design and maintain explanation facilities for cognitive models, intelligent agents, and other knowledge-based systems.
Building blocks
Application: A software application is referred to as a set of interacting objects.
Candidates: Candidates or candidate objects are key concepts in the form of objects described on CRC cards. They serve as initial inventions in the process of object design.
Collaborations: A collaboration is defined as an interaction of objects or roles (or both).
CRC Cards: CRC stands for Candidates, Responsibilities, Collaborators. They are index cards used in early design for recording candidates. These cards are split up into an unlined and a lined side.
Content of lined side: On this side the candidate's name, its responsibilities and its collaborators are recorded.
Content of unlined side: On this side the candidate's name, its purpose in the application, stereotype roles and anything worthwhile such as the names of roles in patterns it participates in are recorded.
Hot Spots: Hot Spots are points in the application where variations occur. They are recorded using Hot Spot Cards.
Hot Spot Cards: Hot Spot Cards are used for recording variations with just enough detail so you can discriminate important difference. Similar to CRC cards, these are also created from index cards. These cards consist of:
Hot Spot Name
General description of the variation
At least two specific examples where the variation occurs
Objects
Objects are described as things that have machine-like behaviors that can be plugged together to work in concert. These objects play well-defined roles and encapsulate scripted responses and information.
Object Neighborhoods: Another term for subsystem. It is a logical grouping of collaborators.
Responsibilities: A responsibility is an obligation to perform a task or know information.These are further categorized according to their usage scenario.
Public Responsibilities: Public responsibilities are the responsibilities an object offers as services to others and the information it provides to others.
Private Responsibilities: Private responsibilities are the actions an object takes in support of public responsibilities.
Subresponsibilities: Sometimes, a large or complicated responsibility is split up into smaller ones called subresponsibilities. They are further categorized based on what they do.
Subordinate Responsibilities: These include the major steps in each subresponsibility.
Sequencing Responsibilities: These refer to the sequencing of the execution of subordinate responsibilities.
Roles
Controller: Object implementing this role makes decisions and closely directs the action of other objects.
Coordinator: This role reacts to events by delegating tasks to others.
Information Holder: Information holder knows and provides information.
Information Provider: A slight variation of an information holder is the information provider, which takes a more active role in managing and maintaining information. This distinction can be used if a designer needs to get more specific.
Interfacer: This role transforms information and requests between distinct parts of an application. It is further divided into more specific roles.
External Interfacer: External interfacer communicates with other applications rather than its own. It is mainly used for encapsulating non-object-oriented APIs and does not collaborate a lot.
Internal Interfacer: Also called intersystem interfacer. It act as a bridge between object neighborhoods.
User Interfacer: User interfacer communicates with users by responding to events generated in the UI and then passing them on to more appropriate objects.
Service Provider: This role performs work and offers computing services.
Structurer: This role maintains relationships between objects and information about those relationships.
Control Styles
Centralized control style
This control style inflicts a procedural paradigm on the structure of the application and places major-decision making responsibilities in only a few objects or a single object.
Types
Call-return model : The control of the objects in the application is in hierarchical way. Control starts at root and moves downwards. It is used in a sequential model.
Manager model : The control of the objects in the application is in with only one object. Generally, it is implemented in concurrent models. It can also be implemented in sequential model using case statement.
Advantages
Application logic is in one place.
Disadvantages
Control logic can get overly complex
Controllers can become dependent on information holders' contents
Objects can become coupled indirectly through the actions of their controller
The only interesting work is done in the controller
When to use
When decisions to be made are few, simple, and related to a single task.
Delegated control style
A delegated control style lies in between a centralized and dispersed control style. It passes some of the decision making and much of the action to objects surrounding a control center. Each neighboring object has a significant role to play. It can also be called as event driven model, where the control is delegated to the object requesting it to process the event.
Types
Broadcast model : An event is broadcast to all objects in the application. The object which can handle the event can acquire the control.
Interrupt-driven model : There will be the interrupt handler to process the interrupt and passes to some object to process it.
Advantages
It is easy to understand.
Though there is an external coordinator, Objects can be made smarter to know what they are supposed to do and can be reused in other applications.
Delegating coordinators tend to know about fewer objects than dominating controllers.
Dialogs are higher-level.
It is easy to change as changes typically affect fewer objects.
It is easier to divide design work among team members.
Disadvantages
Too much distribution of responsibility can lead to weak objects and weak collaborations
When to use
When one wants to delegate work to objects that are more specialized.