领域驱动设计系列(2)浅析VO、DTO、DO、PO的概念、区别和用处

  • 时间:
  • 浏览:0
  • 来源:万人炸金花IOS_万人炸金花APP下载

http://kb.cnblogs.com/page/522348/

  DO与PO的应用

  可能ORM框架的功能非常强大而大行其道,若果JavaEE也推出了JPA规范,现在的业务应用开发,基本还后能 太满 区分DO与PO,PO完整版可还后能 通过JPA,Hibernate Annotations/hbm隐藏在DO之中。确实这么,但或多或少问题图片当当你们还还后能 注意:

  DTO与DO的应用

当当你们千万太满陷入过度设计,大可太满为了设计而设计一定要在代码中区分各个对象。话语技术是为应用服务的。

PO:

persistant object持久对象

最形象的理解后来有另一一八个PO后来数据库中的一根记录。

  首先是概念上的区别,DTO是展示层和服务层之间的数据传输对象(可还后能 认为是两者之间的协议),而DO是对现实世界各种业务角色的抽象,这就引出了两者在数据上的区别,之类UserInfo和User(对于DTO和DO的命名规则,请参见笔者前面的一篇博文),对于有另一一八个getUser法律土办法来说,本质上它永远不应该返回用户的密码,若果UserInfo大约比User少有另一一八个password的数据。而在领域驱动设计中,正如第一篇系列文章所说,DO是是不是简单的POJO,它具有领域业务逻辑。

  在以下才场景中,当当你们可还后能 考虑把VO与DTO二合为一(注意:是实现层面):

  VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。

POJO、PO、DTO、VO是是不是补救流程中的名字,是是不是PO对应有另一一八个POJO,DTO对应有另一一八个POJO,VO对应有另一一八个POJO  

在或多或少状态下PO、DTO、VO是指同有另一一八个POJO

  里边后来用了有另一一八个简单的例子来说明VO与DTO在概念上的区别,本节可能告诉你咋样在应用中做出正确的取舍。

  DTO与DO的区别

  当当你们可能会有个问题图片(在笔者参与的项目中,太满多线程 员是是不是相同的疑惑):既然DTO是展示层与服务层之间传递数据的对象,为社 在么在还还后能 有另一一八个VO呢?对!对于绝大次要的应用场景来说,DTO和VO的属性值基本是一致的,若果当当你们通常是是不是POJO,若果没必要多此一举。但太满忘记这是实现层面的思维,对于设计层面来说,概念上还是应该发生VO和DTO,可能两者有着本质的区别,DTO代表服务层还后能 接收的数据和返回的数据,而VO代表展示层还后能 显示的数据。

  到目前为止,相信当当当你们可能比较清晰的了解VO、DTO、DO、PO的概念、区别和实际应用了。通过里边的完整版分析,当当你们还可还后能 总结出有另一一八个原则:分析设计层面和实现层面完是是不是有另一一八个独立的层面,即使实现层面通过并是是不是技术手段可还后能 把有另一一八个完整版独立的概念合二为一,在分析设计层面,当当你们仍然(大约在头脑中)还后能 把概念上独立的东西清晰的区分开来,你之类原则对于做好分析设计非常重要(工具越先进,往往会让当当你们越麻木)。第一篇系列博文抛砖引玉,大唱领域驱动设计的优势,但确实领域驱动设计在现实环境中还是有种种的限制,还后能 取舍性的使用,正如我在《田七的聪慧》博文中提到,当当你们还后能 永远的理想化的去取舍所谓“最好的设计”,在必要的状态下,当当你们还是要敢于放弃,可能最大约的设计才是最好的设计。这么 ,系列中的第二篇博文应该是讨论领取驱动设计的限制和咋样取舍性的使用,但请原谅我的疏忽,下一篇系列博文会把你之类主题补上,敬请关注。

  以下场景还后能 优先考虑VO、DTO并存:



DTO :

Data Transfer Object数据传输对象

主要用于远程调用等还后能 几瓶传输对象的地方。

比如当当你们一张表有80个字段,这么对应的PO是是不是80个属性。

若果当当你们界面上若果显示10个字段,

客户端用WEB service来获取数据,这么必要把整个PO对象传递到客户端,

这时.你会可还后能 用还后能 太满 这10个属性的DTO来传递结果到客户端,这么 后来能 暴露服务端表型态.到达客户端后来,可能用你之类对象来对应界面显示,什么时它的身份就转为VO

  可能不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行有另一一八个简单描述,名字后来个标识,当当你们重点关注其概念:

欢迎指正。

  对于DO来说,还有或多或少还后能 说明:为社 在么在不在 服务层中直接返回DO呢?这么 可还后能 省去DTO的编码和转换工作,因为如下:

  VO与DTO的区别

  下面以有另一一八个时序图建立简单模型来描述上述对象在三层架构应用中的位置:

  DTO(Data Transfer Object):数据传输对象,你之类概念来源于J2EE的设计模式,这么 的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。

  理论归理论,这到底还是分析设计层面的思维,是是不是在实现层面还后能 这么 做呢?一刀切的做法往往会得不偿失,下面我马上会分析应用中咋样做出正确的取舍。

  模型:

  上一篇文章作为有另一一八个引子,说明了领域驱动设计的优势,从本篇文章后来结束,笔者可能结合或多或少人的实际经验,谈及领域驱动设计的应用。本篇文章主要讨论一下当当你们突然会用到的或多或少对象:VO、DTO、DO和PO。

DAO:

data access object数据访问对象

你之类当当你们最熟悉,和里边几个O区别最大,基本这么互相转化的可能和必要.

主要用来封装对数据库的访问。通过它可还后能 把POJO持久化为PO,用PO组装出来VO、DTO

总结下我认为有另一一八个对象究竟是什么O要看具体环境,在不同的层、不同的应用场合,对象的身份后来一样,若果对象身份的转化也是很自然的。就像你对老婆来说就 是老公,对父母来说后来子女。设计什么概念的初衷是是不是为了唬人后来为了更好的理解和补救各种逻辑,让.你会更好的去用面向对象的法律土办法补救问题图片.

  用有另一一八个例子来说明可能会比较容易理解:之类服务层有有另一一八个getUser的法律土办法返回有另一一八个系统用户,其涵盖有另一一八个属性是gender(性别),对于服务层来说,它只从语义上定义:1-男性,2-老婆,0-未指定,而对于展示层来说,它可还能不后能 用“帅哥”代表男性,用“美女”代表老婆,用“秘密”代表未指定。说到这里,可能你是是不是反驳,在服务层直接就返回“帅哥美女”不就行多会儿?对于大次要应用来说,这是是不是问题图片,但设想一下,可能需求允许客户可还后能 定制风格,而不同风格对于“性别”的表现法律土办法不一样,又可能你之类服务同时供多个客户端使用(不同门户),而不同的客户端对于表现层的要求有所不同,这么,问题图片就来了。再者,回到设计层面上分析,从职责单一原则来看,服务层只负责业务,与具体的表现形式无关,若果,它返回的DTO,不应该突然老出与表现形式的耦合。

  DO(Domain Object):领域对象,后来从现实世界中抽象出来的有形或无形的业务实体。



BO:

business object业务对象

主要作用是把业务逻辑封装为有另一一八个对象。你之类对象可还后能 包括有另一一八个或多个其它的对象。

  概念:

  DO与PO的区别

  DO和PO在绝大次要状态下是一一对应的,PO是只涵盖get/set法律土办法的POJO,但或多或少场景还是能反映出两者在概念上发生本质的区别:



VO :

value object值对象

ViewObject表现层对象主要对应界面显示的数据对象。对于有另一一八个WEB页面,可能SWT、SWING的有另一一八个界面,用有另一一八个VO对象对应整个界面的值。



画了个图,感觉这么完整版表达出或多或少人的意思。。。。。谁帮忙完善下,最好能体现各个O在MVC中的位置

  从上一节的例子中,细心的读者可能会发现问题图片:既然getUser法律土办法返回的UserInfo不应该涵盖password,这么就不应该发生password你之类属性定义,但可能同时有有另一一八个createUser的法律土办法,传入的UserInfo还后能 涵盖用户的password,为社 在么在办?在设计层面,展示层向服务层传递的DTO与服务层返回给展示层的DTO在概念上是不同的,但在实现层面,当当你们通常很少会这么 做(定义有另一一八个UserInfo,甚至更多),可能这么 做太满见得很明智,当当你们完整版可还后能 设计有另一一八个完整版兼容的DTO,在服务层接收数据的后来,不该由展示层设置的属性(如订单的总价应该由其单价、数量、折扣等决定),无论展示层是是不是设置,服务层都一概忽略,而在服务层返回数据时,不该返回的数据(如用户密码),就不设置对应的属性。

  PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据型态形成一一对应的映射关系,可能持久层是关系型数据库,这么,数据表中的每个字段(或若干个)就对应PO的有另一一八个(或若干个)属性。



POJO :

plain ordinary java object 简单java对象

或多或少人感觉POJO是最常见最多变的对象,是有另一一八个里边对象,也是当当你们最常打交道的对象。

有另一一八个POJO持久化后来后来PO

  VO与DTO的应用

  对于DTO来说,是是不是或多或少还后能 进行说明,后来DTO应该是有另一一八个“扁平的二维对象”,举个例子来说明:可能User会关联若干个或多或少实体(之类Address、Account、Region等),这么getUser()返回的UserInfo,是是不是就还后能 把其关联的对象的DTO都同时返回呢?可能这么 话语,必然因为数据传输量的大增,对于分布式应用来说,可能涉及数据在网络上的传输、序列化和反序列化,你之类设计更不可接受。可能getUser除了要返回User的基本信息外,还还后能 返回有另一一八个AccountId、AccountName、RegionId、RegionName,这么,请把什么属性定义到UserInfo中,把有另一一八个“立体”的对象树“压扁”成有另一一八个“扁平的二维对象”。笔者目前参与的项目是有另一一八个分布式系统,该系统不管三七二十一,把有另一一八个对象的所有关联对象都转换为相同型态的DTO对象树并返回,因为性能非常的慢。