Domain-driven design (DDD) provides a structure of practices and terminology for making design decisions that focus and accelerate software projects dealing with complicated domains.

The premise of domain-driven design is the following:
  • Placing the project's primary focus on the core domain and domain logic
  • Basing complex designs on a model
  • Initiating a creative collaboration between technical and domain experts to iteratively cut ever closer to the conceptual heart of the problem.

Core 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 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.

Prerequisites for the successful application of DDD

  • Your domain is not trivial
  • The project team has experience and interest in OOP/OOD
  • You have access to domain experts
  • You have an iterative process