什么是领域Domain?
理解DDD,首先要理解领域。
通俗的说,领域就是业务;就是合格的产品经理的需求文档所表达的内容;狭义的说就是你的Business Layer里所有的代码以及产生的影响等等;
严谨的定义是:
一个有边界的业务面,其中包含业务概念,业务行为,业务影响。计算机程序应用于这个业务面,并使得程序具有实际的商业价值,赋予程序实际意义。
域中可以再划分为子域,并且域与域之间一般存在联系。不做展开,后文详述。如下,就是一个无人机交付系统的领域草稿:
DDD 的价值
- DDD 使领域专家与开发人员成为密不可分的团体。
领域专家:精通业务的任何人,不局限于岗位。
领域专家与开发人员通过一套适用于当前领域建模的“通用语言”进行交流沟通,并且持续更新这套语言。“通用语言”是对软件模型的直接反映。
- DDD 关注业务战略
DDD的战略设计在于明确地界限,区分不同系统与业务关注点。这样可以保护每个业务层面的服务,是实现SOA或微服务架构的有力保障。 - DDD 是领域建模的工具
这些战术上的工具保障了开发人员能够按照领域专家的思维模型设计开发软件,也回归了面向对象的思想。并且保障开发出的软件是可测试的、良好伸缩性、健壮性、并且允许分布式。
总而言之,DDD不是一种技术,也不局限与一种开发语言。他是一种指导思想(战略),并提供具体的工具(战术)。从立项到持续交付之间的漫长时间中,保障项目的团队高效,软件易扩展、健壮、稳定。
接下来,我们通过一个常见的不合理设计示例体会DDD思想。
贫血领域对象
@Transactional
public void saveCustomer(
String customerId,
String customerFirstName, String customerLastName,
String streetAddress1, String streetAddress2,
String city, String stateOrProvince,
String postalCode, String country,
String homePhone, String mobilePhone,
String primaryEmailAddress, String secondaryEmailAddress) {
Customer customer = customerDao.readCustomer(customerId);
if (customer == null) {
customer = new Customer();
customer.setCustomerId(customerId);
}
customer.setCustomerFirstName(customerFirstName);
customer.setCustomerLastName(customerLastName);
customer.setStreetAddress1(streetAddress1);
customer.setStreetAddress2(streetAddress2);
customer.setCity(city);
customer.setStateOrProvince(stateOrProvince);
customer.setPostalCode(postalCode);
customer.setCountry(country);
customer.setHomePhone(homePhone);
customer.setMobilePhone(mobilePhone);
customer.setPrimaryEmailAddress(primaryEmailAddress);
customer.setSecondaryEmailAddress (secondaryEmailAddress);
customerDao.saveCustomer(customer);
}
理解领域、子域、界限上下文
领域从广义上来讲,通常包含了过多的信息,可能一个公司所有的业务都可以用某某领域概括。但是对于开发,我们需要把这个领域拆分为多个子域,并且子域之间存在明确的界限。
待续。。。。