文档章节

项目结构及项目对象

郑浩
 郑浩
发布于 2015/04/21 11:08
字数 1089
阅读 51
收藏 1

我按自己的理解重新定义系统用户对象(访客、会员、管理员 ....)、用户功能操作、业务处理对象、数据对象、数据访问对象。期望能按java的面向对象思想用对象定义的方式重新规划项目。并能与spring、strust 等流行框架不冲突。

总体思路为:用户向系统发送操作指令,系统针对用户操作执行对应业务处理流程。业务处理流程中产生数据对象,最终业务处理流程使用数据访问对象对数据对象执行CRUD操作。

系统核心对象:用户对象(UserObject),业务处理对象(Business Objects),数据对象(Data Object),数据访问对象(Data Access Object)。

优点:用户对象 与 数据对象分离,摆脱对象定义的混乱。 比如我们系统中经常用到 Member 对象,会定义 MemberBO,MemberDAO 等等。 然后里面写一堆方法,MemberBO中放与member 相关的业务处理方法,MemberDAO中放与member表相关的CRUD方法。  可是,这个Member 到底是一个用户,还是一张数据表呢? 好像都可以又好像都不可以。比如会员下订单操作(CreateOrder),这个操作是放在 MemberBO中呢?还是放在OrderBO中呢?

这个问题主要就是对象定义不明确产生的。 如果我们将用户对象(User Object)、数据对象(Data Object)分开就不会有问题了。 

比如:会员是系统用户的一种,我们定义 MemberUO,所有会员能对系统发送的操作指令都定义为这个类的方法。比如:下订单就定义为:MemberUO.createOrder() 。而会员数据对象定义为 MemberInfoDO,这个对象理解为系统执行业务流程过程中产生的数据对象。 比如:会员执行注册操作,系统通过“会员注册业务处理流程”产生会员信息对象,最终保存到数据库中。

这样,我们的对象定义就清晰了。 会员用户执行操作,系统针对用户操作执行业务处理流程生成数据对象,最终保存到数据库中。可表达为:

  1. MemberUO.regist();

  2. MemberInfoDO=MemberBO.regist();

  3. MemberInfoDAO.save(MemberInfoDO);

同样的:下订单这个操作是会员发起,那么操作方法自然应该定义在MemberUO中,比如: MemberUO.createOder();

对应的,MemberBO中定义创建订单业务流程处理方法,比如: MemberBO.createOrder(); 

在业务处理流程中产生 订单数据对象, OrderInfoDO, 最终 MemberBO 使用 OrderInfoDAO 保存 OrderInfoDO。比如: OrderInfoDAO.save(OrderInfoDO)。

Look,BO 与 UO 是对应的(MemberBO 里的业务处理方法,对应 MemberUO 中的功能操作方法)而DAO 与 DO 是对应的 (OrderDAO 操作的是 OrderDO)。

最后,框架的整合。结合spring mvc,可以轻松实现。 我们只要把 MemberUO 在spring中打上 @Controller 标签,把MemberUO 中的所有方法 打上 @RequestMapping 就可以了。 所有 UO 中的方法都可以一一对应现实用户的功能操作。

注意:MemberBO 是系统针对 MemberUO 所有功能操作的业务处理方法集,而不是针对数据对象的(MemberInfoDO)。所以我们很自然的把 CreateOrder 业务处理方法放在 MemberBO 中,而不是放在 OrderBO中。

实际上,在整个系统中 Order 都不是一个用户对象, 他只是一个数据对象(OrderInfoDO)。所以不会有 OrderUO ,也不会有OrderBO。同样的还有 产品对象、保单对象、存款对象 等等。 切记,这些对象只是用户在执行系统功能时,系统执行业务处理流程过程中产生的数据信息。 通常他们也是造成系统对象定义混乱的原因。

© 著作权归作者所有

共有 人打赏支持
上一篇: 关于REST
郑浩
粉丝 0
博文 8
码字总数 6298
作品 0
闵行
部门经理
私信 提问
小林攻城狮/dp-GEN

dp-GEN 基于velocity框架的代码生成工具,根据数据库表结构生成sql、dao、manager、service、controller、html、js基础代码,能快速生成基本代码或模块脚手架。生成代码能直接用于dp-LTE、d...

小林攻城狮
2017/09/02
0
0
react开发-----代码组织

最近对自己工作上的项目和业余时间写的项目总结了一下。有挺多感受,在此记录下学习到的东西和我的better practice。在这里我将代码分成三层:通用模块层,适配层和展示层。在通用模块的基础...

-鹏
2016/11/22
17
0
Mock 数据生成服务--MockData

用于开发环境的Mock数据生成服务 演示项目地址 接口文档地址 Readme地址 使用 1、安装项目依赖 npm install 2、构建项目 npm run build 3、启动项目 npm run start 自定义数据结构 普通对象定...

白衣凡尘
2017/07/03
221
1
Service 和Dao的两种方式

方式一 方式二 一个大型的项目,在关注它的功能需求外,更要保证它的非功能性需求。 也就是说,性能、吞吐量、可扩展、可维护、可伸缩、安全等一系列的非功能性需求。 对于结构1来说,每个s...

lee123lee
2013/09/21
0
0
maven内部运行原理解析(二)

在第一篇里主要介绍了maven的几个核心概念,这一篇里我们就以一个简单的例子来分析整个maven运行的过程。构建所使用的项目结构如下: 项目结构 主要是一个echo项目,其包含了两个module,分别...

new_chaos
01/25
9
0

没有更多内容

加载失败,请刷新页面

加载更多

css hack

浏览器的兼容性一直是个头疼的问题,使用“欺骗”技术可使各个浏览器效果一致,花了些时间整理了各个浏览器的HACK,主要包括IE系列和最新版本的Chrome、Safari、Firefox、 Opera,比较全面的...

kitty1116
13分钟前
0
0
zookeeper脑裂问题

一、为什么zookeeper要部署基数台服务器? 二、zookeeper脑裂(Split-Brain)问题 2.1、什么是脑裂? 2.2、什么原因导致的? 2.2、zookeeper是如何解决的? 一、为什么zookeeper要部署基数台...

tantexian
19分钟前
1
0
Spring事务传播行为详解

前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为。这是Spring为我们提供的强大的...

码代码的小司机
29分钟前
2
0
Android设备通过fastboot刷入TWRP

方法一:通过fastboot刷入TWRP的方式 首先去TWRP官网下载TWRP安装文件https://twrp.me/Devices/ 1.进入bootloader adb reboot bootloader 也可在开机时,同时按住电源键+音量减,进入bootloa...

robslove
34分钟前
0
0
为何译为“东家机”和“宾客机”

学习过虚拟化、云计算的人大概都知道,并且都在自己的电脑上安装KVM,如下图所示: 什么情况?不过是在物理机的Windows 10上安装了VMware;在VMware上安装了Linux CentOS 7操作系统;又在其上...

大别阿郎
48分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部