The Palos Publishing Company

Follow Us On The X Platform @PalosPublishing
Categories We Write About

How to Identify Objects and Responsibilities in Design Problems

Identifying objects and their responsibilities is a key step in object-oriented design (OOD) and plays a crucial role in making software systems modular, maintainable, and scalable. Here’s how you can approach this:

1. Understand the Problem Domain

Before diving into object identification, it’s essential to have a deep understanding of the problem you’re trying to solve. This can be achieved by:

  • Reviewing requirements: Examine the user stories, functional requirements, and business rules.

  • Stakeholder Interviews: Engage with stakeholders to clarify needs.

  • Use Cases: Study the workflows, interactions, and use cases that describe how users will interact with the system.

2. Identify Nouns as Objects

Objects are usually entities in the system that have distinct behaviors and data. A good rule of thumb is to look for nouns in the requirements or use cases. These nouns can represent:

  • Concrete objects: Things that exist in the real world (e.g., Car, Employee, Customer).

  • Abstract concepts: Things that represent ideas or processes (e.g., Transaction, Invoice, Order).

Example:

  • In an online shopping system, potential objects could include Product, Cart, Customer, Payment, Order, and Shipping.

3. Define Responsibilities

Once you’ve identified potential objects, the next step is to assign them responsibilities—the actions or behaviors that each object should manage. Responsibilities can often be derived from verbs in the requirements or use cases.

  • What should this object do?

  • What state does it manage?

  • What operations can it perform?

Example:

  • For an Order object, the responsibilities could include:

    • Calculating total price: The order must calculate the total of all items, taxes, and discounts.

    • Updating status: The order can have various states like “Pending,” “Shipped,” or “Delivered,” and it should manage those state transitions.

4. Classify Objects

Group objects based on their roles within the system:

  • Entity objects: Represent business data (e.g., Customer, Product).

  • Boundary objects: Act as interfaces between the system and external entities (e.g., user interface components, APIs).

  • Control objects: Manage the flow of the system and orchestrate interactions between entities (e.g., OrderProcessor, PaymentGateway).

5. Use CRC Cards (Class-Responsibility-Collaborator)

A CRC card is a simple tool for organizing your thoughts about each object. It has three sections:

  • Class Name: The name of the object.

  • Responsibilities: The duties or behaviors of the object.

  • Collaborators: Other objects the class interacts with.

Using CRC cards can help you solidify the object’s role in the system and its collaboration with others.

6. Refine with Principles

Use design principles to guide object identification:

  • Single Responsibility Principle (SRP): Ensure each object has one clear responsibility.

  • Encapsulation: Keep an object’s data and behavior together, hiding internal state when possible.

  • Cohesion: Group related behaviors within the same object to improve focus and clarity.

  • Coupling: Reduce dependencies between objects to make the system more flexible and maintainable.

7. Validate with Scenarios

Validate the identified objects and responsibilities by simulating how they will interact within the system. Work through real-world scenarios and edge cases to ensure the system’s design holds up under various conditions.

Example:

  • Scenario: A customer adds items to a shopping cart.

    • Object Customer adds an item to object Cart.

    • The Cart object calculates the updated total price and communicates with the Order object when the customer proceeds to checkout.

8. Iterate and Refactor

Object identification and responsibility assignment isn’t a one-time task. As you continue to refine your design and add more functionality, revisit the objects and their responsibilities to ensure they still make sense. Keep refactoring to keep your design clean and modular.


In summary:

  1. Start with understanding the domain and identifying nouns (objects).

  2. Assign each object responsibilities based on verbs in the requirements.

  3. Use tools like CRC cards to organize and refine the design.

  4. Follow principles like SRP, Encapsulation, and Cohesion to ensure high-quality design.

  5. Validate your design through real-world scenarios.

  6. Iterate as the system evolves.

By following this process, you’ll be able to systematically identify objects and their responsibilities in any design problem.

Share this Page your favorite way: Click any app below to share.

Enter your email below to join The Palos Publishing Company Email List

We respect your email privacy

Categories We Write About