Fact-checked by Grok 2 weeks ago

Responsibility-driven design

Responsibility-driven design (RDD) is an object-oriented methodology that models systems by assigning specific responsibilities to objects based on their roles and interactions, emphasizing behavioral aspects over internal data structures or algorithms. Developed in the late , RDD contrasts with data-driven design by prioritizing what objects do and how they collaborate to fulfill system goals, deferring implementation details until roles are clearly defined. RDD was introduced by Rebecca J. Wirfs-Brock and Brian Wilkerson in their 1989 paper "Object-Oriented Design: A Responsibility-Driven Approach," presented at the Object-Oriented Programming, Systems, Languages & Applications () conference. Wirfs-Brock, working at , formulated the approach to address challenges in designing complex software with Smalltalk and C++, influencing subsequent practices in . The methodology gained prominence through Wirfs-Brock's consulting and teaching, leading to its expansion in the 2003 book Object Design: Roles, Responsibilities, and Collaborations, co-authored with Alan McKean, which formalized techniques for applying RDD in real-world projects. Central to RDD are the concepts of roles, responsibilities, and collaborations: objects assume roles (such as controller or data holder) that dictate their responsibilities—what they know (e.g., maintaining state) or do (e.g., performing operations)—while collaborations define interactions via explicit contracts to ensure cohesive system behavior. This approach promotes the , enhancing , reusability, and by keeping classes focused and encapsulating behaviors through a client-server model. RDD's iterative process begins with high-level behavioral scenarios, using tools like (Class-Responsibility-Collaboration) cards to explore designs before .

Overview

Definition and Principles

Responsibility-driven design (RDD) is an object-oriented design methodology that conceptualizes objects as collections of responsibilities rather than as data structures with attributes, prioritizing the behaviors and services objects provide over their internal . This approach shifts the focus from "what an object is" to "what an object does," encouraging designers to identify obligations that objects fulfill in response to messages from other objects, such as performing computations or delegating tasks. Introduced by Rebecca Wirfs-Brock and Brian Wilkerson in 1989, RDD emerged as a deliberate departure from data-driven design paradigms that emphasize early implementation details. At its core, RDD adheres to the client-server model for object interactions, where objects act as clients issuing requests or as servers fulfilling them, thereby promoting clear . Encapsulation is achieved through contracts—formal specifications of an object's responsibilities that outline expected services and information exchanges without exposing implementation details, which helps maintain flexibility and reusability. Responsibilities are defined as cohesive units of behavior, encompassing both knowledge an object maintains and the operations it supports, ensuring that each object handles a focused set of obligations. A key principle of RDD is the pursuit of low coupling and high by assigning responsibilities in a way that minimizes dependencies between objects while maximizing the internal relatedness of each object's duties. This assignment process involves analyzing scenarios to determine which objects should respond to events, fostering designs where objects collaborate effectively without unnecessary interconnections. Techniques like cards can aid in initially identifying these responsibilities during design exploration.

Historical Context

Responsibility-driven design (RDD) originated in 1989 when Rebecca Wirfs-Brock and Brian Wilkerson presented their paper "Object-oriented design: a responsibility-driven approach" at the '89 conference, introducing it as a novel method for . In this foundational work, they proposed RDD to address shortcomings in prevailing data-driven design practices, which often prioritized an object's internal over its external behavior and interactions. The approach was inspired by the client-server model, envisioning objects as collaborative entities where each fulfills specific responsibilities in response to requests, thereby enhancing encapsulation and modularity from the outset. During the 1990s, RDD gained significant traction through academic and professional workshops, particularly those led by Wirfs-Brock, and the publication of influential texts that elaborated its application. The 1990 book Designing Object-Oriented Software by Wirfs-Brock, Wilkerson, and Lauren Wiener provided a comprehensive for employing RDD in practical , emphasizing processes and . This was further refined in the early 2000s with Object Design: Roles, Responsibilities, and Collaborations (2003) by Wirfs-Brock and Alan McKean, which expanded on roles and collaborations as core elements, offering advanced techniques for designing robust object systems. RDD developed as a direct counterpoint to early challenges, particularly data-centric methods in languages like Smalltalk, where designs frequently centered on data representation at the expense of clear behavioral boundaries, leading to fragile implementations. By focusing on responsibilities, RDD promoted a behavioral perspective that aligned with emerging ideas in contract-based programming, as seen in Eiffel's support for fine-grained visibility and assertions to enforce object interactions. Following the 2003 publication, RDD experienced limited formal advancements in dedicated literature, yet its principles have been informally incorporated into practices since the 2010s, supporting collaborative and iterative object design in dynamic environments. As of 2025, RDD continues to influence modern methodologies, including integrations with () and discussions in conferences such as the "Responsibility Driven Design Revisited" talk at NDC Oslo 2025.

Core Building Blocks

Objects and Responsibilities

In responsibility-driven design (RDD), objects are viewed as autonomous behavioral entities characterized by their capabilities and actions rather than their internal state or data attributes. This perspective shifts the focus from what an object is to what it does, treating objects as active participants that fulfill specific obligations within a . Each object is bound by a of responsibilities, which defines a cohesive set of behaviors it must perform in response to messages from other objects, ensuring clear expectations for interactions. Assigning responsibilities to objects involves heuristics to determine whether an object should handle a task independently or delegate it to collaborators. A key guideline is the "do it yourself" versus "ask for help" decision: if an object possesses the necessary or capability to complete a responsibility on its own, it does so to maintain encapsulation and ; otherwise, it requests assistance from another object better suited to the task. For instance, an object acting as an information holder manages and provides access to its own data, such as a object knowing its title and duration, while a performs actions on behalf of others, like a player object that renders audio without needing to store the song details itself. These assignments promote low and high by ensuring responsibilities align with an object's inherent expertise. Encapsulation in RDD reinforces this by hiding an object's internal state and implementation details, exposing only the interfaces that fulfill its responsibilities. This approach allows objects to evolve internally without affecting dependent components, enhancing reusability across different contexts while preventing unintended dependencies on hidden data. By prioritizing message-based interactions over direct state access, RDD objects remain flexible and maintainable. Unlike data-driven design, which centers on modeling static attributes and relationships, RDD emphasizes dynamic , collaborations, and the fulfillment of responsibilities through object interactions, leading to more adaptable and intent-focused systems. Responsibilities within an object may be grouped into roles to facilitate analysis of its contributions in broader collaborations.

Roles and Collaborators

In responsibility-driven design (RDD), represent abstract characterizations of behavior that define an object's purpose within a , independent of any specific implementation. A encapsulates a cohesive set of responsibilities that an object assumes to contribute to the system's functionality, allowing designers to focus on what an object does rather than how it is internally structured. This abstraction enables multiple objects to play the same interchangeably across different contexts, fostering a approach where behavior patterns are reusable without tying them to concrete classes. For instance, various objects might fulfill a "" role in a banking system, regardless of their underlying data structures or algorithms. Common role stereotypes in RDD provide designers with archetypal patterns to guide responsibility assignment. These include:
  • Controller: Manages and directs the flow of actions among other objects, often centralizing in response to .
  • Coordinator: Orchestrates interactions by reacting to and delegating tasks to ensure cooperative work among objects.
  • Information Holder: Stores and provides access to data or , maintaining facts without performing complex computations.
  • Service Provider: Executes specialized tasks or operations, offering services that other objects rely upon to complete their responsibilities.
  • Interactor: Handles transformations or exchanges of between components, such as interfaces or external integrations.
These stereotypes are not rigid categories but flexible heuristics derived from observed patterns in object collaborations. Collaborators in RDD are the objects that work together with a given object to fulfill its responsibilities, forming dynamic partnerships through message exchanges. To identify collaborators, designers pose targeted questions for each responsibility, such as "Who does the work required to fulfill this?" or "What other objects provide the necessary information or services?" This process, often documented on CRC cards, reveals dependencies and ensures responsibilities are realistically distributed. By emphasizing roles over fixed implementations, RDD promotes polymorphism and design flexibility, as objects can be substituted if they fulfill the same without altering the overall . This separation allows systems to evolve more readily, accommodating changes in requirements while preserving behavioral .

Design Techniques

CRC Cards

Class-Responsibility- (CRC) cards serve as a core technique in responsibility-driven design (RDD) for identifying and documenting the responsibilities of objects and their interactions. These cards, typically 4x6-inch index cards or their digital equivalents, are divided into three sections: the class name at the top, a list of responsibilities on the left side, and collaborators on the right side. Responsibilities are concise verb-phrase descriptions of what the class knows or does, such as maintaining data or performing actions, while collaborators are other classes with which it exchanges messages to fulfill those responsibilities. Invented by and in 1989 as a tool for object-oriented thinking, CRC cards were adapted for RDD to emphasize behavioral modeling over structural hierarchies. The process of using CRC cards involves collaborative brainstorming sessions where a team starts by identifying candidate classes from domain requirements. For each class, participants assign responsibilities and note collaborators, iteratively refining them through scenario simulations. In these simulations, team members physically pick up cards to role-play active objects, "flipping" them to indicate message passing and revealing how objects collaborate to achieve system behaviors; this often leads to splitting classes, adding new ones, or adjusting responsibilities as dependencies emerge. The low-tech nature of the cards allows for rapid iteration without software tools, making them suitable for early design phases. CRC cards offer several advantages as a in RDD, including their simplicity and portability, which foster team collaboration and shared understanding without requiring programming expertise. They enable the early detection of hidden dependencies and inconsistencies by simulating real-time interactions, promoting a focus on object behaviors rather than premature details. Additionally, the tangible encourages creative and gradual revelation of design complexity. To illustrate, consider designing a library management system. A CRC card for the Book class might include responsibilities such as checking availability and storing metadata, with collaborators like Catalog to query inventory status.
ClassResponsibilitiesCollaborators
BookCheck availability
Store title and author
Catalog

Contract Specification

In responsibility-driven design (RDD), contracts serve as formal agreements that define the behavioral expectations between collaborating objects, modeled as clients and servers. These contracts specify the obligations and guarantees for reliable interactions, ensuring that a server object fulfills its responsibilities only when clients adhere to agreed-upon conditions. Inspired by Bertrand Meyer's Design by Contract (DbC) methodology introduced in the Eiffel programming language, RDD contracts emphasize behavioral specifications over structural details, promoting encapsulation and modularity. Central to these contracts are preconditions, postconditions, and invariants, which outline the precise conditions under which responsibilities are executed. Preconditions represent client obligations that must hold true before invoking a server's , such as ensuring valid input parameters; postconditions detail the server's guarantees upon completion, like returning expected results or modifying state predictably; and invariants maintain consistent properties across an object's lifecycle, such as non-null references to essential collaborators. Responsibilities are specified through public interfaces, typically as signatures annotated with these behavioral clauses, defining what clients can expect without revealing internal . For instance, a signature might declare: "calculateTax(amount: ) requires amount > 0; ensures result >= 0," focusing solely on obligations. This approach, rooted in the client-server , enforces clear boundaries for object interactions. Support for contract specifications in RDD is facilitated by languages and tools that enable DbC-like enforcement. Eiffel provides native syntax for embedding preconditions, postconditions, and invariants directly in code, allowing runtime checks and compile-time verification. In Java, which lacks built-in DbC, annotations via frameworks like the Java Modeling Language (JML) or libraries such as iContract enable similar specifications, integrating with tools for static analysis and . These mechanisms benefit testing by generating verifiable assertions and support , reducing runtime errors and enhancing system reliability during development and maintenance. Effective contract design in RDD follows heuristics to ensure practicality: contracts must be complete, covering all necessary obligations and guarantees; consistent, aligning with the object's overall role without contradictions; and minimal, avoiding excessive detail that could hinder flexibility or lead to over-specification. By adhering to these principles, designers create robust interfaces that facilitate while deferring concerns.

Control Styles

Centralized Control

In responsibility-driven design (RDD), centralized control is a style where a single object, often termed a controller or , assumes primary responsibility for , task , and sequencing actions among collaborating objects, thereby directing the overall flow of in a manner reminiscent of a procedural call-return model. This approach concentrates application logic within one or a few "smart" objects that coordinate subordinate elements, which typically serve as information holders or simple executors without independent authority. By localizing , it establishes a hierarchical where the controller queries necessary , issues directives, and processes results, ensuring a predictable sequence of interactions. Key characteristics of centralized control include a clear, linear flow of execution that simplifies tracing and , as all major decisions pass through the central point, reducing direct couplings between other objects via a mediating controller. It promotes high within the controller by grouping related sequencing logic, making it particularly suitable for systems with simple hierarchies or regular decision patterns, such as those modeled by finite machines. However, this style can lead to indirect dependencies, where the controller relies heavily on details from information-holding objects, potentially complicating maintenance if those details evolve. A representative example is a , where a central TransactionManager object orchestrates operations by initiating steps like validation, execution, and commitment on subordinate objects such as Account and Ledger instances, sequentially delegating tasks and aggregating results to ensure atomicity. Similarly, in a user registration , a RegistrationController might handle input validation, database queries via UserRepository, and notification dispatch through EmailService, centralizing like duplicate user errors to maintain consistent flow. The advantages of centralized control lie in its predictability and ease of oversight, facilitating straightforward and modifications in smaller or less dynamic systems, while fostering looser among non-controller objects through mediated interactions. It enhances reliability by concentrating and in one place, reducing the risk of inconsistent behaviors across the system. Conversely, drawbacks include the potential for the controller to become a or , with overly complex internal logic that concentrates "interesting work" and limits flexibility as system scale increases, often necessitating a shift to alternatives like delegated control for more distributed scenarios.

Delegated Control

In responsibility-driven design (RDD), delegated control is a style where a central passes decision-making and actions to surrounding objects, allowing them to handle responsibilities autonomously rather than directing every step. This approach emphasizes high-level messages, such as requests to perform tasks, rather than low-level commands, enabling objects to collaborate without a dominating controller. Key characteristics include its event-driven nature, where coordinators react to events by delegating tasks to specialized collaborators, often using patterns like observer or broadcast to propagate notifications. This fosters flexibility in reactive systems, as objects respond independently to events, promoting encapsulation and reducing tight coupling between the coordinator and its delegates. Responsibilities are assigned as delegated tasks, aligning with RDD's focus on behavioral roles. A representative example is a (GUI) application, such as a balloon simulation game, where a object delegates click events to a controller, which then propagates the action to model and view components for updating state and redrawing the interface autonomously. The advantages of delegated control include in dynamic environments, as changes remain localized to affected objects, simplifying maintenance for experienced developers and facilitating team-based design by dividing work among collaborators. However, it can be challenging to trace due to distributed , particularly for less skilled developers, who may require more time to understand and modify the system compared to centralized styles.

Clustered Control

In responsibility-driven design (RDD), clustered control is a style where control responsibilities are distributed among semi-autonomous groups of related objects, forming clusters or "neighborhoods" that manage specific aspects of the system's behavior, while maintaining loose coupling between clusters through high-level message coordination. This approach balances the structure of centralized control with elements of distribution, allowing each cluster to handle local decision-making without a single global authority dominating the entire system. Key characteristics of clustered control include the organization of objects into self-contained neighborhoods with consistent interaction patterns, where a local controller or within each directs actions and sequences tasks via messages that radiate outward like spokes on a . Inter-cluster communication is minimized and occurs at a higher level, often through explicit roles such as that define boundaries, ensuring that changes remain localized and responsibilities are shared among multiple objects rather than concentrated in one. This style frequently employs like the to distribute complex decisions across collaborating objects, promoting predictable and modular flows without full dispersion. A representative example of clustered control appears in an e-commerce system, where separate clusters manage distinct domains: an inventory cluster led by a local manager object handles stock checks and updates, while a payment cluster with a local processor object oversees transactions and validations, with coordination between clusters achieved through high-level messages from an overarching orchestrator to initiate processes like order fulfillment. The advantages of clustered control include enhanced and , as self-contained clusters facilitate reusability and extensibility by isolating responsibilities and allowing interchangeable objects within defined roles, while the loose inter-cluster simplifies overall system evolution. However, it requires clear boundaries between clusters to avoid complexity from multiple interacting controllers, which can lead to over-communication or brittle designs if coordination is not carefully managed, potentially increasing the during development.

Dispersed Control

In responsibility-driven design (RDD), dispersed control represents a style where decision-making and control responsibilities are distributed across a of peer objects, without any dominant central . Instead of funneling logic through a single point, objects autonomously handle localized decisions and collaborate dynamically to achieve overall system goals, intertwining responsibilities with in a decentralized manner. This approach aligns with RDD's emphasis on , where objects fulfill roles through interactions rather than hierarchical command structures. Key characteristics of dispersed control include high , with control flowing based on and object , often resulting in moderately intelligent objects that perform small, additive tasks collectively. Objects maintain encapsulation by managing their own behaviors and exceptions locally, but this can introduce hardwired dependencies in interaction chains if not carefully patterned. Such systems are common in reactive or distributed environments, where no clear control centers exist, leading to dynamic, emergent behaviors from collaborations among equals. Collaborators enable this dispersion by providing predictable interaction protocols that support peer coordination. A representative example of dispersed control is the Pipes and Filters architectural pattern, where processing tasks are divided into sequential steps, each handled by an independent filter object that passes data to the next without a central orchestrator; decisions about data transformation occur locally within each filter, collectively building the system's output. In this setup, such as a pipeline, agents (filters) make autonomous choices on or modification based on their responsibilities, mimicking a distributed where entities decide locally without global oversight. Dispersed control offers advantages in to failures, as the absence of a single point eliminates bottlenecks and supports through modular, adaptable interactions that reduce tight . However, it poses challenges in comprehension and maintenance, as tracing across numerous objects can complicate and lead to unpredictable behaviors if collaborations are inconsistent; this style may also break encapsulation via implicit dependencies, making it generally less favored in RDD for complex systems unless patterns like blackboards enforce structure.

Applications and Comparisons

Practical Examples

One prominent practical example of responsibility-driven design (RDD) involves the development of a banking system's using cards. In this scenario, the class is cast in the of an information holder, responsible for maintaining balance details, accepting deposits or , and providing current balance information. The class, particularly subclasses like Withdrawal and Deposit, serves as a controller, responsible for initiating financial operations such as verifying funds and executing polymorphic transactions, while delegating specific actions (e.g., debiting amounts) to the collaborating class. This structure employs delegated control, where the controller object passes responsibility to the information holder to fulfill the request, promoting encapsulation and reducing tight coupling in the system. In modern architectures, RDD principles have been adapted post-2010s to define boundaries through contracts that specify responsibilities and collaborations, akin to modeling at a higher level. are assigned distinct roles, such as a user authentication responsible for verifying credentials and issuing tokens, collaborating with an order for secure ; this mirrors object-level but across distributed components, enabling independent deployment and fault isolation in cloud-based systems. A step-by-step walkthrough of RDD application can be seen in the design of a simple inventory application, which manages a collection of as inventory items. First, responsibilities are identified through CRC cards: the class is responsible for knowing its title, artist, playtime, and usage limits (e.g., maximum plays per day), while the SongCollection class acts as an information holder for storing and querying available songs. Next, collaborators are defined, such as the controller querying the SongCollection and delegating playback to a SongPlayer class. Then, a control style is selected—centralized control via the , which orchestrates the flow by reading user input through a CardReader, checking account limits via a JukeboxAccount, and enforcing rules before playback. Finally, contracts are specified for interactions, ensuring the Jukebox coordinates without micromanaging internal song details, resulting in a cohesive system for music selection and playback.

Relation to Other Paradigms

Responsibility-driven design (RDD) stands in contrast to data-driven design approaches, which emphasize modeling the internal structure and attributes of objects, such as entity-relationship diagrams that prioritize and associated operations. In RDD, the focus shifts to defining object behaviors and responsibilities first, using a client-server model to specify what objects do without prematurely committing to their data structures, thereby enhancing encapsulation and flexibility. This behavioral emphasis avoids the pitfalls of data-driven methods, where changes to data representations can propagate widely and violate . RDD also differs from traditional attribute-based object-oriented programming (OOP), which often centers on classes defined by their attributes and methods, leading to designs tightly coupled around data implementation. By prioritizing responsibilities over attributes, RDD promotes a role-based view of objects, where behaviors are assigned based on contractual obligations, influencing the evolution of OOP toward more dynamic and polymorphic systems. This shift has notably impacted (DDD), where RDD's responsibility assignment informs the modeling of domain entities and aggregates through bounded contexts and ubiquitous language, as articulated in foundational DDD texts that reference responsibility-driven heuristics for behavioral specification. RDD integrates well with agile methodologies, particularly through tools like CRC cards, which facilitate iterative exploration of object responsibilities in collaborative settings, aligning with extreme programming's design-test-implement cycles since the early 2000s. It complements (TDD) by emphasizing behavioral specifications that guide unit tests for modular components.

Benefits and Limitations

Advantages

Responsibility-driven design (RDD) promotes modularity by defining objects through their roles and responsibilities, which establishes clear boundaries that reduce coupling between components. This approach defers decisions about internal structure until after behavioral specifications are set, enhancing encapsulation and making it easier to modify, reuse, and extend objects without widespread impacts. For instance, by focusing on cohesive subsets of behavior as responsibilities, designers avoid exposing structural details in interfaces, thereby minimizing dependencies and supporting independent development of modules. RDD enhances collaboration in teams through techniques like class-responsibility-collaboration () cards, which facilitate brainstorming and refinement of object interactions in group settings. These cards encourage experimental exploration of responsibilities and collaborations, allowing teams to clarify roles early and distribute design work more effectively. Additionally, the emphasis on roles supports polymorphism, enabling objects to fulfill similar responsibilities in varied contexts, which fosters flexible team-based design and reuse across projects. The design method improves reliability by specifying client-server contracts that outline expected , enabling early detection of errors during the design phase rather than in or testing. This behavioral focus allows for better of object interactions and reduces costly rework by identifying inconsistencies upfront. Contracts also promote robust testing, as responsibilities define testable units of , leading to more reliable systems overall. RDD supports in large through styles such as delegated and clustered , which distribute responsibilities across multiple objects to handle complexity without central bottlenecks. Delegated , for example, localizes changes and simplifies additions to the , while clustered balances for expansive applications. These styles, drawn from practical experiences in object-oriented projects, enable modeling of hundreds or thousands of objects efficiently, contributing to extensible architectures in enterprise-scale software.

Challenges and Criticisms

One significant challenge in applying responsibility-driven design (RDD) to large systems is the subjective nature of assigning responsibilities to objects, which can lead to inconsistent or suboptimal distributions that complicate and . In particular, dispersed styles, a hallmark of RDD, distribute across multiple objects, potentially resulting in tangled interactions akin to spaghetti logic, where tracing functionality becomes difficult and reusability suffers due to minimal contributions from individual objects. This issue is exacerbated in complex applications, where initial designs often require extensive iteration to resolve emergent sub-design problems, as responsibilities may overwhelm objects or necessitate additional collaborators, increasing overall intricacy. RDD also presents a steep , demanding a fundamental shift from data-centric or procedural thinking to a behavioral focus on object roles and collaborations, which many developers find counterintuitive. Professional surveys of object-oriented practitioners highlight that mastering these techniques involves significant difficulty, often requiring practice to determine appropriate levels for responsibilities. Flexible RDD designs, while promoting adaptability, can further intensify this curve by introducing complex procedures and exception hierarchies that demand time to comprehend. Critics have noted that RDD's emphasis on behavioral responsibilities may undervalue concerns, leading to designs where objects act as passive information holders without adequate safeguards against or issues. Post-2003 analyses in object-oriented point to this behavioral bias as potentially skewing designs toward weak, action-deficient objects that neglect robust handling. Additionally, RDD suffers from limited dedicated tooling compared to more diagrammatic approaches like UML, which better visualize interactions but still obscure algorithmic details and side effects in RDD scenarios. To mitigate these challenges, practitioners often integrate RDD with complementary methods such as (DDD), which extends responsibility assignment to larger-scale modeling while addressing through bounded contexts. Recent discussions as of 2025 revisit RDD in conjunction with DDD and (TDD) to enhance its applicability in modern contexts like . Contract specifications can partially resolve in responsibility delegation by clarifying interfaces, though they do not fully eliminate subjectivity in large systems.

References

  1. [1]
    [PDF] Responsibility-Driven Design - Rebecca Wirfs-Brock
    The concepts and motivations behind responsibility-driven design were initially formulated with Brian Wilkerson, myself, and others developed and taught a ...
  2. [2]
    Object Design: Roles, Responsibilities, and Collaborations
    This approach, called Responsibility-Driven Design, gives you the basis for reasoning about objects. Most novice designers are searching for the right set of ...
  3. [3]
    [PDF] Responsibility Driven Design
    Responsibility-Driven Design is a way to design that emphasizes behavioral modeling using objects, responsibilities and collaborations.Missing: engineering | Show results with:engineering
  4. [4]
    Wirfs-Brock Associates Responsibility-Driven Design
    Our approach, known as Responsibility-Driven Design, is a way of designing complex software systems using objects and component technology.Missing: engineering | Show results with:engineering
  5. [5]
    Object-oriented design: a responsibility-driven approach
    We propose an alternative object-oriented design method which takes a responsibility-driven approach. We show how such an approach can increase the ...
  6. [6]
    Designing object-oriented software: | Guide books
    Wirfs-Brock R Are software patterns simply a handy way to package design heuristics? Proceedings of the 24th Conference on Pattern Languages of Programs, (1 ...Missing: 1989 | Show results with:1989
  7. [7]
    Object Design: Roles, Responsibilities, and Collaborations - InformIT
    Object Design: Roles, Responsibilities, and Collaborations. By Rebecca Wirfs-Brock, Alan McKean; Published Nov 8, 2002 by Addison-Wesley Professional.
  8. [8]
    [PDF] Object Design: Roles, Responsibilities, and Collaborations
    Responsibility-Driven Design was first described in a paper by Rebecca Wirfs-Brock and Brian Wilkerson, "Object-Oriented. Design: A Responsibility-Driven ...
  9. [9]
    [PDF] A Laboratory For Teaching Object-Oriented Thinking
    Kent Beck, Apple Computer, Inc. Ward Cunningham, Wyatt Software Services, Inc. ... We have also asked skilled object programmers to try using CRC cards. Our ...
  10. [10]
    [PDF] Design by Contract - Chair of Software Engineering
    Some assertions, called preconditions and postconditions, apply to individual routines; others, called class invariants, constrain all the routines of a given ...
  11. [11]
    [PDF] A Brief Tour of Responsibility-Driven Design - Wirfs Brock
    The principles behind Responsibility-Driven Design were first described in an OOPSLA paper in 1989, and the book, Designing Object-Oriented Software. If you are ...
  12. [12]
    [PDF] Examples of Design by Contract in Java
    Design by Contract - What is it ? □ Classes of a system communicate with one another on the basis of precisely defined benefits and obligations ...
  13. [13]
    [PDF] OBJECT DESIGN - Pearsoncmg.com
    Rebecca Wirfs-Brock and Brian Wilkerson, “Object-Oriented Design: A Responsibility-Driven Approach,” presented at the OOPSLA '89. Conference. A year later ...
  14. [14]
    Roles in Responsibility-Driven Design - Apium Academy
    May 12, 2020 · Responsibility-Driven Design (RDD) is a technique in object-oriented programming, which improves encapsulation by using the client–server model.Missing: engineering | Show results with:engineering
  15. [15]
    Evaluating the effect of a delegated versus centralized control style ...
    Aug 9, 2025 · According to expert opinion, a delegated control style, typically a result of responsibility-driven design, represents object-oriented design at ...<|control11|><|separator|>
  16. [16]
    [PDF] OBJECT ORIENTED DESIGN - with UML and Java
    delegation of responsibilities, known as responsibility-driven design (RDD). ... * BalloonControl is a Control Panel with GUI to control the Balloon.
  17. [17]
    [PDF] Credit where Credit is Due Responsibility-Driven Design
    Lecture 20: Responsibility-Driven Design ... This is an example of a clustered control style; ... Responsibility Driven Design provides a design technique based on.
  18. [18]
    None
    ### Summary of 'Dispersed Control' in Responsibility-Driven Design
  19. [19]
    CSCI 581 (Object-Oriented Design) Lecture Notes on Using CRC ...
    Jan 19, 2000 · These notes discuss principles and techniques for design using CRC cards using a bank's Automated Teller Machine (ATM) as its example. Who ...Missing: driven | Show results with:driven
  20. [20]
    [PDF] Designing Objects with Responsibilities - Rose-Hulman
    What is a basic principle by which to assign responsibilities to objects? Assign a responsibility to the class that has the information needed to fulfill it.
  21. [21]
    Applying the concept of Class Responsibility Cards to microservice ...
    Nov 16, 2015 · Our microservices can also be described as a system of objects with defined responsibilities and collaborators. We wanted to see how this might ...
  22. [22]
  23. [23]
    What are CRC Cards? - Agile Alliance
    1989: Ward Cunningham describes the CRC technique in a joint article with Kent Beck ... 1995: Based on the same inspiration as CRC cards, Ward Cunningham ...
  24. [24]
    Object-oriented design: a responsibility-driven approach
    Wirfs-Brock, Allen and Brian Wilkerson, “Variables Limit. Reusability,” Journal of Object-Oriented Programming,. 2(l), May/June, 1989. pp. 3440. October I-6 ...
  25. [25]
    Identifying the difficulties of object-oriented development
    Aug 5, 2025 · According to expert opinion, a delegated control style, typically a result of responsibility-driven design ... spaghetti code to the present state ...
  26. [26]
    Information Holder Resource - Microservice API Patterns
    ... data integrity and quality ... Information Holder is a role stereotype in Responsibility-Driven Design (RDD) Wirfs-Brock and McKean (2002) ...