以面向对象建模为基础的开发模式

在今天的.NET世界中,微软所发布的那些经典例子Duwamish和Petshop所采取的那种N层的模式已经深入人心。其实不管这些例子采取多少层,基本上都可以归结为最基本的三层,也就是微软的三层架构,简单点就是下面的图:

UI layer

    ↓

Business layer

    ↓

DataAccess layer

    ↓

Database

网上关于此类东西的讨论的文章不在少数,成功的项目也不在少数。但这里我要说一说我自己觉得的几个问题(可能是因为我水平不高吧):

1) 采取此种做法,如果系统已经开发完成,但需要增加一些新功能,可能会觉得很难添加,因为可能会修改已有的表的字段。

2) 所谓的business layer,里面封装了很多只是起一个转发作用的代码。最明显的莫过于一些(new XXXAccess()).ReadAll(),然后转给了DataAccess执行。

3) 如果我们要对business layer做单元测试,会发现如果没有数据库或者数据库没数据我们需要写上一堆的mock对象。

4) 基本上对于每张数据库表就需要有一个DataAccess,然而有时候会有一些业务对象的处理要同时取好几张表的数据,这个时候就不知道这个方法我们应该放在哪。

这些问题时常让我觉得困惑,尽管在开发中使用一些模式能够解决掉一部分问题,但是总觉得并没有从根本上解决上面的一些问题。

-----------------

经过一段时间的探索以及对一些Java资料的参考,终于想明白解决上面问题的办法的一种方式是进行面向对象的建模。分层的思想同样是适用的,如果我们直接套用上面的那些名称的话,这种关系就变为(*)

 

UI layer
    ↓   
Business layer
    ↑
DataAccess layer

采取这种方式,那么上面的几个问题就迎刃而解了:

1) 我们为什么用OO?不就是为了适应变化吗?

2) business layer现在成为了整个系统的核心,虽然仍可能会有一些这样的代码,但是含义上却是不同的。

3) 这个时候可以脱离数据库进行单元测试,因为你开始根本不会取管DataAccess layer。

4) 这个问题现在归结到类的设计的问题。

 

(*)注:为了简单就直接这样表达了,其实真正想表达的东西来自《Domain Driven Design》的分层,有兴趣的朋友可以去翻翻。

----------------

当然,这种方法并不是银弹,它也有着自身存在的一些问题:

1) 繁琐。相对于非常直观的三层架构,这种方法需要更好的OO思想和经验,对开发人员的要求也更高。

2) Business layer和DataAccess layer会形成一个双向依赖,需要用依赖注入或者其他方法来解决这个问题。

3) .NET目前仍然缺乏足够好框架来支持对象的持久化。(或者可以等Linq?)

4) 依这种方法得到的数据库表会比较晦涩,不太适合做OLAP。

 

当然,写这篇文章的目的是起一个抛砖引玉的作用,让大家可以从一个不同的角度去思考问题,并不是说明下面的就一定比上面的要好。

 

PS:晚上跟一个很厉害的老外聊天说Hibernate对java来说也是个crap,会导致很多问题。我知道这里有做过java的朋友,能否指教一下是不是这样?

posted @ 2007-03-19 21:58 阅读(2810) 评论(9)  编辑 收藏 网摘 所属分类: OOA/OOD/OOP

  回复  引用    
#1楼 2007-03-19 23:00 | tony [未注册用户]
如果可以的话,我建议lz忘掉petshop,那仅仅是一个玩具。
请研究Martin Fowler的《企业设计模式》一书,然后看看下面这个联接:
http://www.javaeye.com/topic/11712

ps:hibernate已经足够好,并不会导致很多问题。你也可以关注一下apache的ibatis.net。
  回复  引用    
#2楼 2007-03-19 23:05 | tony [未注册用户]
http://ibatis.apache.org/
http://www.castleproject.org/

另外,这里有hibernate和spring的中文手册,你可以参考一下,不用介意里面的java语言,你应该可以看的懂的,这两个手册的内容基本上跟nhibernate和spring.net差别不大,看中文的应该理解更快些。
http://wiki.redsaga.com/confluence/display/RSTEAM/Home
  回复  引用  查看    
#3楼 2007-03-19 23:07 | idior      
你的箭头完全画反了。 A--->B 表示A依赖于B

而且从这些文字看,你仅仅是浅尝DDD而已,不要总是抱着抛砖引玉的思想,把文字发布到首页,先看看自己能带给别人什么,最好有一定的深度。
  回复  引用  查看    
#5楼 [楼主]2007-03-20 05:10 |       
@idior
确实是画反了,已改正。
没错,我确实是初学而已,很希望能有一些开源例子能够帮助验证一下,或许你能推荐一些?

@tony
谢谢你的链接,我会看看的。
  回复  引用    
#6楼 2007-03-20 09:33 | BlueMountain [未注册用户]
mark 这篇文章有很多链接
  回复  引用  查看    
#7楼 2007-03-20 11:37 | winzheng      
UI layer

Business layer

DataAccess layer

就是现在的MVP模式的核心模式
  回复  引用  查看    
#8楼 2007-03-21 08:34 | yunhuasheng      
studying during the discuss!!
  回复  引用    
#9楼 2007-03-22 16:56 | 平淡生活 [未注册用户]
支持楼上的楼上!
不过个人觉得MVP在UI的泛化让人感觉很不顺手啊!

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-03-20 05:05 编辑过
Google站内搜索
[推荐职位]上海盛大网络招聘架构师



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: