Reading.CleanArchitecture.Component Coupling

In the “Component Coupling” chapter of Clean Architecture, Robert C. Martin discusses how to manage dependencies between components in a system. Component coupling focuses on how components (collections of classes and modules) depend on each other and introduces principles to maintain a flexible and maintainable architecture.

Key Concepts

1. What is Component Coupling?

  • Component coupling describes how one component depends on another.
  • Proper coupling ensures that components can evolve independently without causing ripple effects throughout the system.

Principles of Component Coupling

The chapter introduces three principles that help manage coupling between components:

1. Acyclic Dependencies Principle (ADP)

  • Definition: The dependency graph of components must have no cycles.
  • Problem:
    • Cyclic dependencies create tightly coupled systems where changes in one component can propagate unpredictably.
    • They make the system harder to understand, test, and maintain.
  • Solution:
    • Break cycles using dependency inversion. Introduce an abstraction (interface) that both components depend on instead of one directly depending on the other.
    • Use a mediator or event-driven architecture to decouple components.

Example:

  • If Component A → Component B → Component C → Component A, introduce an abstraction to break the cycle.

2. Stable Dependencies Principle (SDP)

  • Definition: A component should only depend on components that are more stable than itself.
  • Key Ideas:
    • Stability refers to the likelihood of a component to change. A stable component has many dependents, making changes risky and costly.
    • Depending on unstable components increases the risk of changes propagating.
  • Solution:
    • Identify stable components and ensure that less stable components depend on them.
    • Use abstractions to isolate unstable components, reducing the impact of changes.

Example:

  • A core library (stable) should not depend on a user interface library (unstable). Instead, the UI library should depend on the core library.

3. Stable Abstractions Principle (SAP)

  • Definition: A stable component should be abstract. Instability should be associated with concreteness.
  • Key Ideas:
    • Abstract components (e.g., interfaces) can be extended without changing the component itself, making them ideal for stable components.
    • A stable, concrete component becomes a bottleneck because it cannot easily adapt to changing requirements.
  • Solution:
    • Ensure that highly stable components are primarily abstract.
    • Use abstract classes, interfaces, or dependency inversion to maintain flexibility.

Example:

  • A stable API (interface) is implemented by unstable concrete classes. The API remains stable, even if implementations evolve.

Coupling Metrics

Robert C. Martin discusses metrics to evaluate component coupling:

  1. Afferent Coupling (Ca): Number of components that depend on a given component.
  2. Efferent Coupling (Ce): Number of components that the given component depends on.
  3. Instability (I):
    • Calculated as I = Ce / (Ca + Ce)
    • Values range from 0 (completely stable) to 1 (completely unstable).

Key Takeaways

  1. Avoid Cycles:
    • Cycles create a web of dependencies that is hard to untangle. Use abstraction and dependency inversion to break them.
  2. Depend on Stability:
    • Ensure components depend only on more stable components to reduce the risk of widespread changes.
  3. Make Stable Components Abstract:
    • Stability should align with abstraction. Concrete implementations should remain flexible and evolve without disrupting stable abstractions.
  4. Balance Stability and Instability:
    • Not every component needs to be stable; instability in concrete implementations is acceptable if isolated properly.

Practical Applications

  • When designing systems, keep a close eye on dependency graphs to identify and address cycles.
  • Use dependency inversion and abstractions to decouple components.
  • Assess components using coupling metrics (Ca, Ce, I) to balance stability and flexibility.
This entry was posted in Без рубрики. Bookmark the permalink.