很多程序员刚开始容易陷入构造贫血模型的情况,贫血模型在传统应用中普遍存在。贫血模型的数据和操作方法是分离的,它只包含数据,领域逻辑的实现委托给了领域服务。贫血模型如下:
@Getter@Setterpublic class SnackMachine extends AggregateRoot {public Money moneyInside;public decimal moneyInTransaction;public List<Slot> slots;}@Getter@Setterpublic class SnackMachineService {public void buySnack(SnackMachine snackMachine, int position) {}public void loadSnacks(SnackMachine snackMachine, int position, SnackPile snackPile) {}public void loadMoney(SnackMachine snackMachine, Money money) {}}
SnackMachine只包含数据,所有操作委托至SnackMachineService领域服务。在面向对象语言中,引入贫血模型是不可接受的。因为它和面向对象编程理念背道而驰。可以看到贫血模型积弱的封装性。所有字段都是public,将领域逻辑的实现委托至领域服务势必会导致领域模型的开放,贫血模型机制决定了领域模型封装性极低的特性。这样的代码维护异常艰难。
