Skip to main content

Software Architecture

When diving into software design, you'll often hear about Clean Architecture. It's almost become the de facto blueprint for designing maintainable systems. However, in my current work environment, Hexagonal Architecture has emerged as a compelling alternative. Let’s take a closer look at both, their nuances, and why Hexagonal might soon become even more popular.

Clean Architecture

Popularized by Uncle Bob, this pattern organizes code into four concentric layers:

clean architecture
  1. Enterprise business rules: Entities representing core business concepts.
    Example: InsurancePolicy class with validation logic.

  2. Application business rules: Use cases orchestrating entity interactions.
    Example: ProcessClaimUseCase handling claim approval workflow.

  3. Interface adapters: Converts data between layers. Includes controllers, presenters, and gateways.
    Example: ClaimRestController converting HTTP requests to Java objects.

  4. Frameworks & drivers: Infrastructure details (DB, Web, UI).
    Example: Spring Data JPA repositories, Hibernate configurations.

Why You'll Often Encounter Clean Architecture

  • Widespread adoption: Its clear demarcation of concerns has led to extensive community and enterprise support.
  • Ease of understanding: The layered approach mirrors traditional systems, making it accessible for those familiar with classic architectural patterns.
  • Separation of concerns: By isolating business logic in the inner layers, the system remains resilient against external volatility.

Hexagonal Architecture

Also known as Ports & Adapters, this pattern by Alistair Cockburn shifts the focus to the interactions between the system and its external actors, organizing responsibilities across two distinct perspectives:

hexagonal architecture
  • Driver side (Left):
    • Driver ports: Define how external actors interact with the app.
      Example: REST API endpoints.
    • Use cases: Business logic triggered by external input.
  • Driven side (Right):
    • Driven ports: Define how the app interacts with external services.
      Example: Database access.
    • Adapters: Implementation details.
      Example: MySQL implementation of repository interface.

What Sets Hexagonal Apart

  • Flexible integration: By clearly separating the roles on the driver and driven sides, the architecture easily accommodates various interfaces and integration mechanisms.
  • Enhanced testability: Isolating external interactions through well-defined ports simplifies testing—the core use cases can be driven with mocks or stubs without invoking actual external systems.

I really recommend Alex Hyett's video "Hexagonal Architecture: What You Need To Know - Simple Explanation".

Comparison

AspectClean ArchitectureHexagonal Architecture
Conceptual FocusEmphasizes clear directional dependenciesFocuses on segregating external interactions
AdaptabilityExcellent for applications with well-demarcated layers in traditional enterprise setupsExcels in environments requiring dynamic integration options (APIs, messaging systems, GUIs) with clear separation of concerns
Adoption and MindsetWidely adopted due to its intuitive design and clear separation of responsibilitiesIncreasingly popular in dynamic environments; offers a forward-thinking approach that adapts to evolving integration demands

Both architectures strive to produce resilient, maintainable software by insulating the core business rules from volatile external changes. Whether you opt for the layered clarity of Clean Architecture or the interaction-focused Hexagonal Architecture, the key is to align your design with your team’s needs and the demands of your project.

May your architecture be as robust—whether cleanly layered or hexagonally streamlined—as the code you write!