Also known as the problem we are trying to solve
The 'domain' refers to the specific area or subject matter that the software is being developed for. It is a specific business area or problem space that has its own boundaries, distinct meanings and concepts. It is a way of isolating and encapsulating a specific part of the system and applying a specific set of ubiquitous language, rules and models to that part. For example, in an e-commerce application, the domain would be the buying and selling of products online.
In general, it can be divided into 3 parts:
Refers to the most important and central area of the business or organization that the software is being developed for. It represents the key business activities and capabilities that provide the most value to customers and differentiate the organization from its competitors.
It is the activity that supports the core domain, in other words, it is a more specific area within the general domain. For example, within the eCommerce domain, a subdomain could be customer account management.
These are enabling solutions for the domain that are not directly related to the business, usually a third-party service, for example, a receipt generator.
There are patterns to help this separation and they can be divided into: strategic design and tactical design
Is focused on the long-term vision and goals of the system. It is concerned with creating a robust and flexible architecture that can adapt to changing requirements and business needs over time. This approach involves identifying the core domain and subdomains within the system, and creating a clear and consistent model that represents the core business concepts and their relationships. It also involves identifying the boundaries of the system and how it will interact with external systems and stakeholders. The focus of strategic design is on creating a stable, maintainable, and scalable system that can evolve over time.
On the other hand, tactical design is focused on the implementation of the features and functionality to build the system.This approach involves creating detailed designs for specific components and modules of the system, and implementing them using specific technologies and frameworks. The focus of tactical design is on delivering working software according to the strategic design.
An image of common patterns for these designs: