Domain-Driven Design (DDD) is an approach to the development of software that:

  • Focuses on the core domain.
  • Explores models in a creative collaboration between business experts and the software team.
  • Defines an ubiquitous language within an explicitly bounded context.

Domain-Driven Design has two sides, both equally important:

  • Strategic design, which address high-level considerations of domain knowledge and its modeling.
  • Tactical design, which propose practical patterns to design the required software.

The business framework, being an implementation framework, naturally focuses on the tactical side of DDD. Nonetheless, strategic design should not be overlooked and is a critical aspect of designing sustainable software.

Definitions

Domain

A sphere of knowledge, influence, or activity. The subject area to which the user applies a program is the domain of the software.

Model

A system of abstractions that describes selected aspects of a domain and can be used to solve problems related to that domain.

Ubiquitous language

A language structured around the domain model and used by all team members within a bounded context to connect all the activities of the team with the software.

Context

The setting in which a word or statement appears that determines its meaning. Statements about a model can only be understood in a context.

Bounded context

A description of a boundary (typically a subsystem, or the work of a particular team) within which a particular model is defined and applicable.

Strategic design

Strategic design has nothing to do with code. It is about identifying and understanding the business mindset, language and solutions. Ultimately, a significant part of the domain knowledge will be implemented as code but it needs to be well understood and structured first.

Tactical design

The following diagram represents the key patterns of tactical Domain-Driven Design and how they relate to each other.

Tactical domain-driven design