`

对JEEApp分层的浅知和ROR下DomainModel的质疑

阅读更多
基于目前的认知,我大概清楚目前JEE App里的架构分层大概如下:
view-->controller-->service-->dao-->entity
1.controller层
(1)职责:负责协调view层与service层,具体而言就是获取、过滤view层的输入,调用相应的service逻辑处理并根据其返回结果选择不同的view进行显示。
(2)依赖性:向下依赖service,向上依赖容器或框架      
2.service层
(1)职责:负责向controller提供业务逻辑处理接口,事务安全的调用dao层完成业务逻辑处理。
(2)依赖:组合或继承dao(下面会解释)或向下依赖dao,向上依赖容器或框架。
3.dao层
(1)职责:负责对应实体的持久化工作,包括CRUD等。
(2)依赖:向下依赖PO或entity,向上依赖容器或框架
上面说到service会组合或继承dao,我相信有人会觉得疑惑或质疑。我以我个人的认知来谈谈这个问题。首先,我们不能排除那些微型的基于数据库CRUD的JEEApp的存在,实际上留言板、BBS等都具有该特点,在这种系统中,service层对controller提供的业务逻辑接口至少会有CRUD方法吧?而且是“纯粹”的CRUD,例如添加一条留言,这个行为无论对于service还是dao来说,都是一样的,其方法签名甚至连名字都可以一样,那么,我们是否可以让service具有CRUD的能力呢?不仅如此,我们是否应该无需手动编写任何的CRUD代码呢?(因为这些代码完全可以让反射帮你搞定)。那么,service层到底应该手动编写什么代码呢?从上面说到的职责来看,有两个理由,一个是具有事务性,一个是复杂性,这里说的复杂性是对于超过单个dao方法能力而言。例如前面谈到的添加一条留言,如果添加留言需要某些前置条件,例如保证添加者是登陆状态的,那么这时候dao的create方法就没办法满足要求了,这时候service的create和dao的create方法处理逻辑完全不同,因此需要手动编写service的create方法了,也许编写如下:

public String create(MessageVO message,HttpServletSession session){
    String error = null;
    if (session.getAttribute(message.getAuthor()) == null){
        error = "您还没有登录,请先登录才能发表留言";
    }else{
        error = this.dao.create(message);
    }
    return error;
}


但是,如果没有这种需求呢?如果仅仅是发表一下留言而无需登陆呢?我想,这这时候代码应该如下:

public String create(Message message){
    return this.dao.create(message);
}

我们发现这时候service里的create方法做的仅仅是调用一下dao的create方法而已,除此之外没有任何额外的动作,那么,想象一下,如果一个系统的service层,这样的方法竟然占了大部分,我想,没有人愿意承受这样无趣的代码编写工作吧?这种问题其实完全可以通过组合dao或者继承dao来解决。这时候,service层依然存在,但是某些无趣的代码就无需开发者手动编写了,当然,前提条件是“无趣的代码”,这里即和dao完全一样的代码,再当然,这一切都基于需求,需求决定了是否能够这样做,上面的例子也已经足够说明问题了,不是吗?
另外,对于DomainModel,我个人有这样一个想法,DomainModel不需要也不必要一一对应一个Java Class,它是对现实世界某个领域的建模,而实现这种模型可以通过多个类的协作或组合来达到目的。Java现在的做法就是Service+DAO+PO的方式。我个人是这么理解的这三部分与DomainObject的关系的,Service包含了DomainObject的DomainLogic,DAO解决了DomainObject的持久化逻辑,PO封装了DomainObject的属性。这三者共同协作完成了对Domain建模(模拟?反映?)
而对于ROR里一个domain既包含了持久化行为,又包含了逻辑行为,本身还是属性数据载体的做法,本人水平有限,不敢苟同。它宣称这样更加OO,可是OO里另外一条重要的原则“保持类的职责单一”,却在这里被违背了,在我认为,持久化、商业(领域)逻辑、数据载体(对外提供setter和getter访问)都算一种职责,那么这里就已经包含了三中职责了。


本人是菜鸟,欢迎拍砖。

分享到:
评论

相关推荐

    JAVA异常的概念

    一份好的PPT有关于JAVA,第一章异常的概念,让你浅知异常的基本概念和解决方法

    传统服装展示的网页.rar

    要了解中国服饰那多样的款式、独特的风采、出色的工艺,首要的目的就应该浅知一点中华民族博大深邃的服饰文化发展轨迹,这样才能通过浏览,去着意开掘中华服饰文化的底蕴。 网站将中国的传统服饰作为主题,主要介绍...

    C# 监听键盘.rar

    C#监听键盘源码 非常好用 C#监听键盘源码 非常好用

    C#系统托盘图标闪动.rar

    C#程序源代码 类似QQ托盘图标闪动效果

    peak-linux-driver-8.15.2.tar

    peak-linux-driver-8.15.2.tar

    VSCodeUserSetup-x64-1.86.1.exe

    VSCodeUserSetup-x64-1.86.1

    毕业设计使用ncnn在ios+android上部署yolov5源码+详细说明.zip

    高分毕业设计 毕业设计源码 使用ncnn在ios+android上部署yolov5源码+详细说明.zip 高分毕业设计 毕业设计源码 使用ncnn在ios+android上部署yolov5源码+详细说明.zip 高分毕业设计 毕业设计源码 使用ncnn在ios+android上部署yolov5源码+详细说明.zip 高分毕业设计 毕业设计源码 使用ncnn在ios+android上部署yolov5源码+详细说明.zip 高分毕业设计 毕业设计源码 使用ncnn在ios+android上部署yolov5源码+详细说明.zip 高分毕业设计 毕业设计源码 使用ncnn在ios+android上部署yolov5源码+详细说明.zip 高分毕业设计 毕业设计源码 使用ncnn在ios+android上部署yolov5源码+详细说明.zip 高分毕业设计 毕业设计源码 使用ncnn在ios+android上部署yolov5源码+详细说明.zip 高分毕业设计 毕业设计源码 使用ncnn在ios+android上部署yolov5源码+详细说明.zip

    课设毕设基于SSM的医院远程诊断系统-LW+PPT+源码可运行.zip

    课设毕设基于SSM的医院远程诊断系统--LW+PPT+源码可运行.

    node-v0.10.25-sunos-x86.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v0.10.24-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    matlab-简明实例教程详解

    matlab实用的例程详解可供学习与参考理解,MATLAB 已经受了用户的多年考验 在欧美发达国家 MATLAB 已经成为应用线性代数 自动控制理论 数理统计 数字信号处理 时间序列分析 动态系统仿真等高级课程的基本教学工具 成为攻读学位的大学生 硕士生 博士生必须掌握的基本技能 在设计研究单位和工业部门 MATLAB 被广泛地用于研究和解决各种具体工程问题。

    node-v0.10.26-sunos-x64.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    javascript 中关于 this 的用法.zip

    javascript 中关于 this 的用法.zip

    【课程设计】基于python实现多AGV路径规划算法研究源码.zip

    【课程设计】基于python实现多AGV路径规划算法研究源码.zip

    【课程设计】基于间接卡尔曼滤波的IMU与GPS融合MATLAB仿真(IMU与GPS数据由仿真生成)源码.zip

    【课程设计】基于间接卡尔曼滤波的IMU与GPS融合MATLAB仿真(IMU与GPS数据由仿真生成)源码.zip

    静态网页比赛.zip

    静态网页比赛.zip

    【毕业设计】缺陷检测-基于深度学习实现的高效轮胎磨损+缺陷检测算法实现python源码.zip

    【毕业设计】缺陷检测-基于深度学习实现的高效轮胎磨损+缺陷检测算法实现python源码.zip

    springboot282基于web的机动车号牌管理系统.rar

    开发语言:java 框架:springboot,vue JDK版本:JDK1.8 数据库:mysql5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat11+ 开发软件:idea/eclipse(推荐idea)

    《软件设计与体系结构R》实验报告

    21级太原理工大学JACVAEE实验报告,各位当个参考即可,不用过分较真,如果与你们想法不同,请以自己为主,各位加油。

Global site tag (gtag.js) - Google Analytics