谈谈对java web中vo,dto,po,qo等对象定义的理解

首先列出在阿里巴巴的编程规约中对各个对象的概括:

分层领域模型规约:

  • DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。
  • DTO( Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。
  • BO( Business Object):业务对象。 由Service层输出的封装业务逻辑的对象。
  • AO( Application Object):应用对象。 在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度不高。
  • VO( View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。
  • POJO( Plain Ordinary Java Object):在本手册中, POJO专指只有setter/getter/toString的简单类,包括DO/DTO/BO/VO等。
  • Query:数据查询对象,各层接收上层的查询请求。 注意超过2个参数的查询封装,禁止使用Map类来传输。

领域模型命名规约:

  • 数据对象:xxxDO,xxx即为数据表名。
  • 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
  • 展示对象:xxxVO,xxx一般为网页名称。
  • POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。

单一实体类的使用所带来的问题:

​ 在一般的小型项目中,我们大多会使用DO作为唯一的实体类进行操作,不管是controller层接收前端数据,还是service层处理数据乃至dao层操作数据库。由于业务逻辑相对简单,所以这样使用也无可厚非。但是在某些情况下,还是会出现一些比较难以处理的问题:

  1. 后台返回了一大堆数据,但是前端只需要很少数据显示;

  2. 数据库存储例如性别之类的字段是用0,1表示,但是前端显示需要String类型的“男”或“女”;

  3. 在进行一个新增操作时涉及到另一个表(实体类)的某个字段的更新

  4. 定义的查询方法参数为DO实体,通过查看DO的具体信息不能得知具体的查询条件

    ......

解决:

​ 在这里我们通过实例来解释说明各个实体类所能解决的问题(包含但不限于):

  1. 定义VO去除DO返回的但不需要显示的字段,例如用户信息返回了密码字段的信息,但是前端不需要显示和操作密码字段;
  2. 用户信息的VO实体中不包含密码的信息,但是我们在接收实体信息时需要对密码字段的信息进行加密和存储,这时候我们的DTO实体可以完美的解决这个问题;
  3. VO中的性别字段的类型为String(男/女),而DO返回的性别字段为Integer(0/1),这时候我们可以通过操作DTO实体对这些字段进行转换。
  4. Query实体的存在在我看来主要是为了让开发者和阅读代码的人更容易的知道当前方法需要的条件从而更快的了解到所实现的功能

总结:

从上面的解释说明来看,这些概念的理解基本上不成问题。但是值得我们注意的是,我们需要对我们的项目进行足够的评估,通过项目的规模,可能出现的场景来判断我们是否需要某些实体类的定义而不是滥用;虽然这些对象是业界这么多年经验的积累,但是这些东西在不同的业务场景下的使用也是不同的,这是最重要的一点。

链接:

[链接: https://pan.baidu.com/s/1xtDZMh-LF-xnpYm0KmLF0Q 提取码: 22vp ]:

上面是阿里巴巴的Java开发手册,个人觉得十分有借鉴意义,推荐。

你可能感兴趣的:(谈谈对java web中vo,dto,po,qo等对象定义的理解)