领域模型是一种在软件设计中广泛应用的概念,它强调将业务逻辑与数据模型分离,以提高代码可维护性和系统灵活性。火龙果软件工程技术中心在早期并未有系统性地理解和实践领域模型,而是随着ORM(对象关系映射)技术如Hibernate的成熟,逐渐采用这种方法进行项目开发。
领域模型通常包含四种常见的设计模式:
1. **失血模型(Anemic Model)**:在这种模式中,领域对象(domain objects)只包含业务逻辑和基本的数据属性,而与数据库操作(如CRUD操作)分离,这些操作由服务层(Service)通过DAO(Data Access Object)来处理。失血模型的优点是保持领域对象的纯粹性,易于测试和维护,但可能增加Service层的复杂性。
2. **贫血模型(Fat Model)或业务逻辑模型(Service Layer Model)**:Service层包含了业务逻辑和事务处理,同时直接与DAO交互,而领域对象相对简单,仅负责核心业务逻辑。robbin倾向于使用这种设计,因为它允许更清晰的职责划分,且利于独立测试,但可能会导致Service层过重。
3. **充血模型(Overloaded Model)**:与贫血模型相反,领域对象既包含业务逻辑又直接操作数据,双向依赖于DAO。这可能导致代码耦合度高,不易管理和扩展。
4. **胀血模型(Bloated Model)**:这是一种极端形式,领域对象不仅包含业务逻辑,还负责数据访问。这种模型通常被认为是过度设计,因为它违背了领域驱动设计原则,增加了复杂性。
在实际项目中,比如一个使用Struts和Hibernate的Java项目,采用了失血模型,domain object(如Company_Info类)主要是数据载体,Manager作为DAO处理持久化操作,业务逻辑和事务封装在Action层。然而,随着项目的演进,有时会尝试更为复杂的模型,如畸形设计的domain object,其生成可能依赖工具,但这往往不是最佳实践。
领域模型的设计选择取决于项目需求、团队经验和架构风格。理想的情况是结合业务规则和设计原则,找到一个既能满足当前需求又能支持长期演进的平衡点。失血模型和贫血模型,尽管各有优缺点,但都强调了领域对象与数据访问的解耦,是构建健壮和可扩展系统的重要基石。