在软件生产与模型:分离领域以及软件生产与模型(二):模型描述(实体、值对象、服务) 探讨了分层对领域的意义以及如何表达领域模型,下面来看看领域对象的生命周期
在知道了突出领域以及表达领域之后,便要深入的了解一下领域的生命周期。处理领域对象的生命周期有两类挑战:
l 在生命周期中维护对象的完整性
l 避免模型由于管理生命周期的复杂性而陷入困境
这可以使用3个模式来处理这些问题,首先是聚合(Aggregate),通过定义清晰的所有权和边界来使模型变得更紧凑,避免出现盘根错节的对象(关系)网。这个模式对维护模型的完整性非常关键。
接下来,便是生命周期的开始部分,用工厂(Factory)来创建个重组复杂的对象和聚合,并保持对其内部结构的良好封装。最后,仓储(Repository)用于处理生命周期的中间和结束部分。
建立聚合的模型,并把工厂和仓储加入到设计中来,可以使我们系统的对模型对象进行操纵,同时使得这些对象的生命周期成为一个个意义明确的单元。
聚合
对于一个人的删除,删除了这个人的名字、生日和职位描述信息等等,但是,是不是要删除地址呢?其他人可能也住在同一个地址。如果把地址也删很粗,那么其他Person对象将引用一个被删除了地址的对象。但是如果把地址流下来,会积累一些无用的地址的对象。这看起来好像是一个技术上的问题,但是实际上来自于模型-------------模型中缺乏明确的边界。
聚合边界内构成了一个小整体,里面有一个聚合根,比如,对于一辆车来说,有车轮。车胎,但是聚合根是车身。
为了将概念上的聚合转换成为实现,我们需要在所有的事物中应用一系列的规则:
l 根实体具有全局标识,并最终负责对不变量的检查
l 边界之内的ENTITY具有本地标识,这些标识仅在聚合内部是唯一的
l 聚合边界以外的任何对象,除了可以引用根实体,不能持有任何对其内部对象的引用。跟实体可以把其内部实体的引用传递给其他对象,但是它们只是能临时引用,而不能持有这种引用。
l 能通过数据库查询直接获得的对象只有聚合根,所有其他对象必须通过导航关联来访问
l 聚合内的对象可以持有其他聚合根的引用
l 删除操作必须一次性删除聚合边界内的所有对象
l 当在聚合边界内发生的任何对象修改被提交时,整个聚合的所有不变两必须都被满足
这样,由于控制了访问,因此我们无法绕过它去修改内部元素。这种安排使得可以保证在任何状态变化中,聚合本身(作为一个整体)的不变两,以及聚合中对象的不变量都可以被满足。
工厂
聚合定义了一个事物的边界,那么创建一个对象或整个聚合的逻辑变得非常复杂,或者过多的暴露了内部结构时。工厂提供了封装。
比如轿车引擎是非常复杂的,只有在生产轿车时才需要组装的功能,所有组装一个复杂的复合对象的工作,与该对象被组装成功以后所执行的任何其他工作,最好分离开来。但是如果把组装的职责转移到其他对此感兴趣的对象,比如客户,那就会使问题变得更兼糟糕。
复杂对象创建工作属于一种领域层的职责,然而创建工作并不属于表达模型对象。对象的创建和组装在领域中通常没有含义,它们只是实现上的需要。为了解决这个情况,我们必须在另一种构造,它既不是实体也不是实体或是服务,这就是一个工厂,他不对应于模型中的任何事物,但是它确实要完成领域层的部分职责。
工厂的应用场合
工厂的应用场合一般是围绕聚合来考虑的,每当我们希望隐藏一些信息(具体实现细节或复杂的构造逻辑)但是似乎由没有一个自然的地方可以容纳它们时,我们就应该创建一个专门的工厂对象。
(工厂好像和服务类似,都是为了解决领域层中一些不自然的地方而建立的,但是两者从意义上不同,工厂是专门为创建对象而创建的,而创建对象并没有业务意义,不属于服务)
仓储
领域驱动设计的一个目标就是通过聚焦领域模型(而不是技术)来生产更好的软件。
但是我们在构造一个SQL时,模型的焦点已经消失了。我们很自然的把对象想象为查询提供的数据的容器,而整个的设计就偏向数据处理的风格了,开发人员还是考虑技术机制,而不是领域。
我们需要一种技术来解决数据访问技术挑战,包括把SQL封装为查询对象(QUERY OBJECTS)或者通过元数据映射层实现对象和表示之间的转换。仓储模式提供一个简单的概念框架,用来把上面那些解决方案封装起来,并且找回模型的焦点。
一个仓储将某种类型的所有对象描述为一个概念性的几何(通常是模拟几何),它的行为与集合类似,但它包含更兼精细的查询能力。
为每种需要全局访问的对象类型创建一个对象,该对象为该类型所有对象在内存中的集合提供影像。根据某种标准筛选对象的方法,返回完整实例化了的属性值,符合标准的对象或对象几何,把实际的存储和查询技术封装起来。仅为确实需要直接访问的聚合提供仓储。让客户聚焦于模型,把所有对象存储和访问的工作委托给仓储来完成。
工厂与仓储
工厂处理的是对象生命周期的开始,仓储则是帮助管理生命周期的中间和结束部分。从技术上,可以认为仓储就是一种工厂,从领域驱动的设计视角中,工厂和仓储职责完全不同,工厂创建新的对象化,仓储寻找旧的对象。
分享到:
相关推荐
3. **持久化框架**:在实际应用中,领域对象的生命周期往往与数据存储紧密相关。ORM(对象关系映射)框架如 Hibernate 或 Entity Framework 可以帮助我们将领域对象与数据库中的记录进行绑定,从而实现对象的持久化...
综上所述,领域对象的生命周期管理是软件开发中至关重要的一部分,它涉及到对象的创建、使用、状态管理、持久化、查询和销毁等多个环节。理解和掌握这些知识点对于构建高效、稳定且符合业务需求的系统至关重要。在...
软件工程是一门涉及软件开发全生命周期的学科,涵盖了从需求分析到软件维护的各个阶段。在软件生命周期中,主要包括可行性分析、需求分析、设计、编码、测试和维护等阶段,并不存在“软件销售阶段”。瀑布模型是一种...
2. **需求工程**:需求工程是软件开发生命周期中的一个重要环节,它涉及到收集、分析、规格化、验证和管理用户的需求。这部分内容可能包括如何有效地与客户沟通、如何使用不同的技术和工具来捕获需求(如用例图、...
6. **Repositories**:作为领域对象的持久化接口,隔离了数据访问细节。 7. **Services**:处理跨越多个领域模型的操作,或者不直接归属任何实体的行为。 8. **Domain Events**:记录领域中的重要事件,用于解耦和...
对象标识(OID)是每个对象在生命周期中的唯一标识,它由系统自动生成,保证了对象的唯一性,并且是不可更改的。 在数据库的体系结构方面,本章提出了模式及其映射的概念。模式是数据库整体逻辑描述的框架,它包括...
通过《软件开发生命周期与统一建模语言UML》的电子教案,学习者可以深入学习这两个重要领域的理论和实践应用,掌握如何有效地规划、设计和实现软件项目。这些知识不仅适用于软件开发者,也对项目经理、系统分析师和...
状态图和活动图则描述对象或系统的生命周期及行为流程。 7. **系统架构建模**:组件图和部署图用于描绘软件系统的物理架构,包括硬件、软件组件的分布以及它们之间的连接。 通过阅读“UML精粹:标准对象建模语言...
第一单元:软件生命周期与软件架构介绍 2 第二单元:技术架构视图─面向对象程序设计原则与模式 59 用GRASP模式指导设计 62 领域模型 96 面向对象设计的基本原则 132 第三单元:用UML辅助系统分析与设计 177 UML简介...
领域模型管理是一种用于处理领域模型对象在运行时的行为和生命周期的技术。其目的是确保领域模型对象能够正确地与其他系统组件交互,同时保持代码的简洁性和可维护性。 - **重要性**:在复杂的应用程序中,领域模型...
- 持续重构:在业务生命周期内,不断对现有代码进行优化和治理,保障代码可读性和稳定性。 5. 复杂业务场景的应用 领域驱动设计在处理复杂业务场景时,如电商系统、CRM管理系统、供应链系统、财务系统以及订单管理...
在结构化方法下,软件生产过程模型定义了软件开发的整个生命周期,并指导整个团队完成每个阶段的任务和目标。 瀑布模型是结构化方法下的软件生产过程模型之一,它是一种线性软件开发过程模型,其特点是需要逐步进行...
**软件生命周期:** 软件生命周期是指软件从构思到废弃的整个过程。这一过程通常包括以下阶段: - **需求分析:** 确定软件需要满足的功能和性能要求。 - **系统设计:** 定义如何满足需求并构建系统架构。 - **...
《领域驱动设计:软件核心复杂性应对之道》是Eric Evans的经典著作,这本书深入探讨了如何在复杂的软件开发项目中有效地管理业务逻辑和模型。DDD(领域驱动设计)是一种软件开发方法,它强调通过理解和建模业务领域...
第一单元:软件生命周期与软件架构介绍 2 第二单元:技术架构视图─面向对象程序设计原则与模式 59 用GRASP模式指导设计 62 领域模型 96 面向对象设计的基本原则 132 第三单元:用UML辅助系统...
这本书的目标是帮助读者理解C++对象模型背后的细节,包括内存管理、类型系统、对象生命周期、继承、多态等核心概念。 C++对象模型是C++编程的基础,它描述了如何在内存中表示类和对象,以及它们之间的关系。首先,...
行为建模方面,状态图(State Diagram)展示了对象在其生命周期中的状态变化,而活动图(Activity Diagram)则以流程图的形式表示系统的动态行为,通常用于表示工作流或计算过程。此外,组件图(Component Diagram)...
其核心目标在于提高软件产品的质量与生产效率,降低开发与维护的成本。 **1.2 软件危机与软件工程的诞生** - **背景**:1960年代,随着计算机技术的快速发展,软件项目变得越来越复杂,传统的手工编程方式难以满足...