论坛首页 Java企业应用论坛

开发为什么要分层,征求大家的意见

浏览 10503 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-10-03  
fsword 写道
今天偶然发现一个兄弟发的牢骚: 主题:一个“过度设计”的项目,快把我弄晕了,进去看了看,反响还挺大。

类似的话题以前也讨论过多次,不过我还是把内容都看了一遍,似乎有些人有点各说各话,所以很想了解一下基本问题大家对于分层都是怎么考虑的,对我们做java应用常见的分层(jsp、action、do/vo、bo、dao......)该如何理解呢?

我先列几个常见的说法和相应的问题,大家可以进行说明,如果有其它原因也欢迎补充
  • 为了符合MVC的模型 —— 为什么要符合MVC呢?MVC到底是在解决什么问题?
  • 为了分离业务逻辑 —— 这里的业务逻辑是指什么?能否举个例子说明必要性?
  • 为了隔离数据库的变化(例如更换数据库) —— 实际使用中有没有更换过数据库?如果更换过,是不是真的隔离了变化,不用大动干戈了呢?


1.mvc是为了分离,解耦,复用
2.很多例子,看看你们的项目代码
3.现在没出现不代表以后不出现。
当然mvc也是有利有弊的。权衡罢了。
0 请登录后投票
   发表时间:2010-10-03  
看了看大家的回复,老实说还是觉得不够丰富,有人看来认为“不要在jsp里面写逻辑,要有service层“是理所应当的事情,但是我提出这个问题正是希望能够引起思考,即使是follow正确的做法,如果不知道这么做的原因,你依然不可能把事情做对。

整理一下,只有两个人提到了自己对分层原因的理解:
rmn190 写道
解耦合, 下一层的变动不至于引起上层的变动。

norwind 写道
分层...这个还得追溯到问题分解的领域,将问题分解至可控的粒度。。。

rmn190的表达显然有利于进一步讨论,因为他提出了一个很具体的原则“下一层的变动不至于引起上层的变动“,实际上这也是我最近一直在考虑的问题,有空详细说
0 请登录后投票
   发表时间:2010-10-03  
rmn190 写道
解耦合, 下一层的变动不至于引起上层的变动。



这只是一方面-依赖倒置的问题。契约型编程建议这么做,不过代码分层只是一个途径,并不是唯一的途径。
0 请登录后投票
   发表时间:2010-10-03  
可以这么看,如果不做这些设计的话要怎么处理相对应的问题呢?
1.如果没有MVC,是否有更好的分层结构,如果没有,那使用MVC便成为最佳选择
2.如果不分享业务逻辑,那业务逻辑与一些技术上的实现就在一起,到时无论是一些系统技术上的升级或者是业务逻辑的改动都会改动到同一段代码,这并非说一定会有问题,但事实上这种情况明显加重维护人员的技术及业务要求,如果该人员分不清那就杯具了
3.如果没有隔离数据库层,更换数据库势必造成整个系统重写
个人觉得设计都是在考虑如果以后出现扩展或变化,该设计能将改动降低到最少即可,没有可能会有一个设计能够满足各种不同类型的需求,系统成长到某一阶段,原先优秀且经过良好设计的系统也必然会显得设计糟糕
0 请登录后投票
   发表时间:2010-10-03  
lzyzizi 写道
有一次我的一个同事在ACTION里写了好多业务代码,当时确实没问题。

但是后来来个需求,说要把原来显示在页面的数据呈现在EXCEL里。。。然后就晕了,因为ACTION是没办法复用的,这个时候他才明白为什么要有SERVICE这一层。

加多一个ACTION也很好解决啊?
0 请登录后投票
   发表时间:2010-10-03  
280511772 写道
lzyzizi 写道
有一次我的一个同事在ACTION里写了好多业务代码,当时确实没问题。

但是后来来个需求,说要把原来显示在页面的数据呈现在EXCEL里。。。然后就晕了,因为ACTION是没办法复用的,这个时候他才明白为什么要有SERVICE这一层。

加多一个ACTION也很好解决啊?

这个倒不是问题,action可以复用的。
0 请登录后投票
   发表时间:2010-10-03  
PO,VO层是面向对象设计的产物,相比于使用Map更加直观,面向对象之后便拥有继承等特性,方便扩展。
DAO,数据库访问层,将数据模型与控制层分离。
service层,故名思意,服务层。
Action,强化的Servlet而已。
Action负责将数据封装成对象或者以参数形式传入service层,将service返回数据组织之后response过去,说白了,只处理request和response对象,不对request的数据本身作任何处理,包括合法性验证,否则,service层没任何意义。
Action的作用:处理Http协议相关操作,不对数据本身进行任何操作,对数据的收和发以及封装操作。
service层:服务层,处理请求数据,数据的所有相关操作都在这里处理。

举个简单例子:有一个项目,最初为BS结构,按照Dao、Service、Action三层设计,项目完成之后,新需求,需要将一部分功能做成CS结构,只需将Action中处理的Http协议转换为处理自定义socket协议即可。
若不分service层,Action充当控制器,则服务端代码基本上是在重写一个控制层。
0 请登录后投票
   发表时间:2010-10-03  
笑我痴狂 写道
fsword 写道
今天偶然发现一个兄弟发的牢骚: 主题:一个“过度设计”的项目,快把我弄晕了,进去看了看,反响还挺大。

类似的话题以前也讨论过多次,不过我还是把内容都看了一遍,似乎有些人有点各说各话,所以很想了解一下基本问题大家对于分层都是怎么考虑的,对我们做java应用常见的分层(jsp、action、do/vo、bo、dao......)该如何理解呢?

我先列几个常见的说法和相应的问题,大家可以进行说明,如果有其它原因也欢迎补充
  • 为了符合MVC的模型 —— 为什么要符合MVC呢?MVC到底是在解决什么问题?
  • 为了分离业务逻辑 —— 这里的业务逻辑是指什么?能否举个例子说明必要性?
  • 为了隔离数据库的变化(例如更换数据库) —— 实际使用中有没有更换过数据库?如果更换过,是不是真的隔离了变化,不用大动干戈了呢?


问题一:你会把业务逻辑写在jsp页面上吗?不会吧 理由就不说了
问题二:业务逻辑一般都在service,你开发项目的时候是不是把调用业务逻辑的代码都写在servlet中,我想也不会吧
问题三:你说的很对,虽然这样做了,但到真正跟换数据库的时候难免要大动干戈,但是想一下,如果按你说的,那么整个系统我想没改的必要了  ,干脆重新开发得了 , 我们只能说隔离数据库的变化,目的是为了跟换数据库的时候,把改动的幅度降到最低就达到目的了 ,不可能完全隔离





说得好!
与其说DAO层是为了隔离数据库的变化,还不如说是将对数据的操作抽出一层。
所有的设计模式和分层说到底就是为了在需求变化时,缩小改动的范围。
如果需求铁定不改,系统铁定不用维护,那么什么设计模式和分层都是白搭!
0 请登录后投票
   发表时间:2010-10-03  
    降低代码之间的耦合度,提高代码的重用性。
0 请登录后投票
   发表时间:2010-10-03  
为了管理。人也有等级,公司也有等级和分部门,等等。。。。太多了。项目也一样的理
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics