领域驱动设计学习(1)

贫血领域对象

贫血领域对象是指一种不完善的程序设计方式,这种方式使得代码简单地表达所实现的功能而忽视了程序设计过程中所依赖的业务逻辑关系。贫血领域对象反应了一种自然的过程式的编程风格;贫血领域对象的代码是尽可能简单的去展示一些特定的概念或者API特性,而不是从业务的层面上去构造一个对象。

功能与业务

下面从一个例子来思考如何避免贫血领域对象的出现以及如何从业务的角度上去设计一个对象。

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(cus“tomerLastName);
    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);
}

上面这一段代码完整地实现了将用户的信息保存到数据库中这样一个功能,无论用户的信息如何改变,都会作为方法的参数保存到数据库中。
然而,这个saveCustomer方法至少存在三个问题
1. 业务意图不明确:从业务场景上来考虑,这样一种saveCustomer的方法究竟适用于什么场景?因为这个方法对应了太多的用例流,对于用户某个字段的信息的改变就要动辄伴随着整个用户信息的更新。
2. 方法的实现本身增加了潜在的复杂性:还是同样的问题,这个方法包含了太多了用例流。
3. Customer领域对象并不是对象,而是一个数据持有器:这个方法的设计思路更偏向于如何处理数据而不是从一个对象的本身出发考虑这个对象应该具有哪些功能

从业务场景上思考问题

这里给出一个从业务场景上针对上一个代码的更好的设计

public interface Customer {
    public void changePersonalName(
        String firstName, String lastName);
    public void postalAddress(PostalAddress postalAddress);
    public void relocateTo(PostalAddress changedPostalAddress);
    public void changeHomeTelephone(Telephone telephone);
    public void disconnectHomeTelephone();
    public void changeMobileTelephone(Telephone telephone);
    public void disconnectMobileTelephone();
    public void primaryEmailAddress(EmailAddress emailAddress);
    public void secondaryEmailAddress(EmailAddress emailAddress);
}

public void changeCustomerPersonalName(
    String customerId,
    String customerFirstName,
    String customerLastName) {

    Customer customer = customerRepository.customerOfId(customerId);

    if (customer == null) {
        throw new IllegalStateException("Customer does not exist.");
    }

    customer.changePersonalName(customerFirstName, customerLastName);
}

对于Customer来说,它的设计依据是其具有的所有业务场景,每一个业务场景的用途与使用场景相比于原来的代码要更加清晰,每一个方法都对应着单一的用例流,比如changeCustomerPersonalName()方法除了修改用户的名称之外没有其他的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值