很多程序员刚开始容易陷入构造贫血模型的情况,贫血模型在传统应用中普遍存在。贫血模型的数据和操作方法是分离的,它只包含数据,领域逻辑的实现委托给了领域服务。贫血模型如下:
@Getter
@Setter
public class SnackMachine extends AggregateRoot {
public Money moneyInside;
public decimal moneyInTransaction;
public List<Slot> slots;
}
@Getter
@Setter
public 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,将领域逻辑的实现委托至领域服务势必会导致领域模型的开放,贫血模型机制决定了领域模型封装性极低的特性。这样的代码维护异常艰难。