原文:
EvansClassification 设计 Bliki
索引下边是Eric Evans在他的杰作《
领域驱动设计(
Domain Driven Design)》中开创的一套针对Domain Objects的分类法,在你的工作中很可能会遇到这些不同分类的Domain Objects。
- Entity: 在不同时刻不同表现形式下具有唯一身份标识的Object,也被人们称为“reference objects”。
- Service: 在业务领域上下文中的一个独立操作。把多个Service集中到一个object中就是一个Service Object。典型情况下,在执行上下文中每种Service Object类型只需要一个实例。
这套分类法很能引起我的共鸣,根据我的经验,它们正是你在领域模型(Domain Model)里所需要的。但麻烦的是很难把这三者界定清楚,它们是那种“你见了真人才认出是谁”的分类。
或许举几个例子有助于理解:Entity通常是Customer、Ship、Rental Agreement(租赁协议)这类大物件;Value通常是Date、Money、Database Query这种小东西;而需要访问Database Connection、Messaging Gateway、Repository或Product Factory这类外部资源的一般属于Service。
Entity和Value有一个明显的区别:Value会覆写(override)相等比较和哈希方法
(译注1)而Entity 不覆写。这是因为,在业务处理上下文中的实体,如果概念上相同,则最多只能构造出一个object来表示它;但如果表示的是像“5.0”这样的数值,构造出多个object也无妨。Value可以是原语类型(primitives)——在那些区分原语类型和非原语类型的语言里,或者由语言提供专门支持(像.NET那样),但这两点都不是必然的。Value Object应该是不可修改的
(译注2),这是一条重要的设计规则,违反的话容易身陷别名混淆bug导致的种种麻烦
(译注3)。要修改一个Value Object,比如一个代表身高的object,不能修改它的值,而是要构造一个新object。
Service Object经常用作全局变量、class级字段(Robert Martin称之为“monostate”
(译注4))或singleton。通常它们都是单一的,只能获得唯一实例,如何实现这一点有多种方式。这种单一性往往是在业务处理上下文中的单一,在多线程环境下常是每个线程占有一个实例。不管具体是什么情况,都应该把实现机制隐藏起来,不让domain objects知道,这样可以轻松地改变具体怎么实现。Eric在他的书里讲Service应该是无状态的,我和他讨论过这个问题,他现在也认为这不是必须的了,不过能实现无状态更好。
做这种分类有一个麻烦——选用的术语与其他概念混得乱七八糟。Entity也经常用来表示数据库里的一张表,或是对应数据库表的一个object;Service与SOA(Service Oriented Architecture)还有应用架构里的
Service层混在了一起。因此,如果我使用这几个术语,我会先明确我是根据Eric书里的定义来说Domain Model的。听到别人用这几个词时一定要当心,它们被重载(overloaded)过度了,不幸的是很难找出替代者。
译注1:Java里为equals和hashCode。
译注2:immutable,请参考Joshua Bloch的《Effective Java Programming Language Guide》Item 13。
译注3:我理解的是:多个变量引用同一个非immutable object时,这个object就有了多个别名,通过一个别名修改,导致其他别名引用的值也修改了,而后者并不希望被修改。
译注4:请参考Uncle Bob的《敏捷软件开发——原则、模式与实践》16.2。
分享到:
相关推荐
JSP 九个内置对象及四个作用域 JSP(Java Server Pages)是一种基于Java的服务器端脚本语言,用于生成动态网页。在JSP中,九个内置对象是指不需要预先声明就可以在脚本代码和表达式中使用的对象,这些对象都是javax...
面向对象分类是一种针对高分辨率遥感影像的地物信息提取技术,它源于传统基于像素的分类方式的局限性。随着SPOT5、IKONOS、QuickBird、WorldView -ⅠⅡ、GeoEye-1等高分辨率遥感影像的普及,传统方法在处理这些数据...
论文对比了基于区域和基于对象的模型,以及符合OpenGIS规范的对象分类。同时,详细介绍了空间对象在关系数据库中的存储方式,包括存储关系表和相关关系表的策略,以及各种主流GIS软件如ESRI的SDE、Mapinfo Spatial ...
接下来,混合邻域类的计算建立在这些核属性的基础上,通过对样本的邻域分析,将对象分配到相应的正域、边界域或负域。这种方法能够更精细地刻画数据的分布特性,尤其是在处理包含不同类型数据(如连续、离散、缺失等...
领域建模技术也可以帮助企业解决业务问题,例如电商业务涉及订单、库存、营销子域等,可以通过领域模型来描述电商业务的概念类和现实世界中对象的可视化表示,例如订单的定义、订单的分类、订单的使用方式等。...
AD域配置详解主要涉及到微软的Active Directory(活动目录)服务,它是一个基于目录的服务,主要用来存储关于用户、计算机、群组和其他对象的信息,以及这些对象的配置和属性信息。AD域配置对于管理和维护大型网络...
3. 最小化与域中或组织单位中的用户关联的组策略对象的数量。 4. 避免交叉域组策略对象分配。 Win 2008 R2 AD组策略是一种强大的工具,可以帮助管理员统一管理域用户的桌面背景。通过了解组策略的定义、分类、执行...
它的核心思想是把一切事物都看作对象,通过对象来描述问题域中的实体。面向对象的思想更贴近人们的自然思维习惯,便于理解和沟通,使程序设计更加直观、清晰。 面向对象编程有三大基本特征:封装、继承、多态。封装...
这个练习是利用最邻近域分类方法。当你在类描述中插入标准最近邻域分类 器之前,要定义特征空间,在特征仝间中图像对象之间的距离将会被计算。相比 传统的最邻近方法,此标准邻域是个项目的一种定义,因此可以用个有代表...
针对植物图像中存在的不连续、簇类花型等不完整图像局部问题,DL-CNN方法结合局部判别关键域和全局判别域的信息,利用卷积神经网络和迁移学习机制建立植物图像分类模型。迁移学习能够利用预训练网络快速学习到有效的...
面向对象分析和UML是软件开发中的核心概念,它们在...在软件开发过程中,面向对象分析和UML的运用有助于我们更好地理解问题域,设计出符合需求的系统架构,并通过UML图表清晰地传达设计意图,提高团队间的沟通效率。
对象的特性包括唯一性、分类性、继承性和多态性。 二、消息的概念 消息是对象之间的交互手段,对象之间可以通过消息来请求服务或传递数据。 三、方法的概念 方法是对象的一种行为,它是类中的一种函数,用于描述...
2. **构建对象模型**:识别出问题域中的关键实体(对象),定义它们的属性和行为,以及对象之间的关系。 3. **提高软件质量**:通过OOA,可以在编码阶段之前发现并解决问题,从而提高软件的质量和可靠性。 #### 三...
- **功能**:这些域涵盖了文档分类、版本控制、文件夹选项、加密方式、HTML内容、Web响应信息及表单名称等方面。 - **应用场景**:提供多样化的文档管理和呈现方式。 #### 二、CGI变量 CGI变量是公共网关接口的...