实战项目分析

实战项目分析

ID:78023780

大小:73.54 KB

页数:5页

时间:2022-01-30

实战项目分析_第1页
实战项目分析_第2页
实战项目分析_第3页
实战项目分析_第4页
实战项目分析_第5页
资源描述:

《实战项目分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、实战项目分析最近接到一个临时任务:帮外国某知名公司分析一个项目架构。这个项目是两年前开发的,并且经过了几次升级。主要功能是管理客户、合作伙伴资料,提供在线业务等等,具体细节不用多说。据客户说,他们在使用本系统的过程中发现了很多的问题,觉得已经不再满足他们的需求,希望我们能帮助他们评估一下当前的系统有哪些架构上的问题,并帮助他们发现未来可能发生的问题,从而决定是否需要开发新的系统客户提供了很详细的文档,包括业务说明,系统架构,技术要点,部署方案等等。看完文档,对系统和客户期望有了一定的了解之后,开始干活儿!系统是采用.Net技术构建的,基于.NetFramework,使

2、用了,WinForm,WebService等技术,并使用了EnterpriseLibrary中的DataAccess,Cache,Log等功能。我本人负责的是架构的分析。结合文档和源代码,没用1个小时,系统架构就很清晰了。其中发现了一些很普遍的问题,在这里跟大家分享一下:1.分层架构分层架构是绝大部分企业软件都普遍采用的方案,但由于架构师水平的参差不齐,导致很简单的一个分层,出现了很大的差异。大家都知道“3层架构”或者“多层架构”。有点理论里分3层,有点理论里分5层,还有分7层的。其实,在我看来分几层不重要,重要的是分层的目的。分层是为了什么的?简单的说就一句话:为了

3、便于维护。大家都知道,软件开发中“变化”才是永恒的。开发周期是死的(尽管可以一拖再拖,但总有一个发布的截至日期吧!),但后期的维护却是很不变得。不管是发布补丁也好,更新版本也好,其实都是为了能适应软件发布之后面临的各种各样的“变化”。好,我们回到分层上来。分层,就是为了使系统结构更清晰,系统耦合性变小,使修改一处代码时,对其它的部分影响最小,这样就能以最小的代价应对变化带来的麻烦!所以,分层的第一要素,就是各层之间屏蔽细节,降低依赖,使各层具体实现变得透明(这也是SOA勺其中一个重要思想)。我们可以通过各种办法来达到这个目的,面向接口编程,设计模式,架构模式等等,都可

4、以帮助我们。而我在此项目中看到的第一个重要的问题就是,系统分层不清楚。下面是分层的简图:由上图可见,系统共分了三层。但有一个问题,业务对象竟然贯穿了三层,这严重违反了分层的初衷。由于业务对象对数据存取层和展现层都可见,导致如果我们的业务对象发生了变化,就要修改从数据存取、业务逻辑到展现层,这三个层次的所有相关代码。而且这个方案违反了分层的两个设计原则:a.下层对上层隐藏细节,只暴露接口。再此,本应属于业务逻辑层的业务对象被暴露到了展现层。b.上层对下层不可见。即下层不知道上层的存在,只提供接口。这里业务逻辑层的业务对象被数据存取层操作,会导致两个层之间纠缠不清,以至于

5、会出现改动业务逻辑会影响数据存取方式的荒谬现象。另外,强类型DataSet也有同样的问题(本应是属于数据存取层的,却被传递到业务逻辑层,甚至是展现层)软件设计中有一个很重要的原则就是:依赖倒置原则(DIP)依赖倒置的意思是:调用者依赖被调用者的接口,而不是实现。具体到此处就是:业务逻辑层应该依赖数据存取层的接口,而不是具体实现(强类型DataSet)。由于被调用者编程了抽象,而调用者变成了“实现”,所以与普通的面向对象的观念来说,依赖关系被倒置了,因此被称作依赖倒置原则。依赖倒置在分层结构中是很重要的原则。希望每一个设计者都时刻把它记在心间吧,呵呵。1.面向接口编程其

6、实这跟上一个问题有密切联系。面向接口编程,是“依赖于抽象,而不是实现”的具体手段。不管是模块内部,还是个层次之间,面向接口是消除依赖的基础。举一个简单的例子:本系统中业务逻辑层会调用数据存取层的方法,得到一些数据。比如调用一个PartnerAccess类的GetPartner的方法。PartnerAccess是数据存取层的一个具体类,负责Patrner表的所有增删改查操作。而业务逻辑层到处充斥着这样的语法:PartnerAccesspartnerac=newPartnerAccess();();这就是一个典型的依赖于具体实现的方案。这样的后果是,业务逻辑层知道每一个数

7、据表的数据结构,甚至是无需知道的细节,并且对数据层的每一个方法都了如指掌,到处都在使用。当我们开始修改PartnerAccess的其中一个方法的时候(比如增加一个参数)都要修改业务逻辑层的相关代码,但谁知道那些代码都在哪呢?只好重新编译吧,让编译器告诉我们。而面向接口编程可以使我们避免这种问题。我们不再依赖于千千万万个PartnerAccess或者什么别的Access类,而是依赖一个IDataAccess的接口。这样,所有的数据存取都被标准化,我们的调用代码便的更简单,不会依赖任何数据库的结构,甚至不需要知道表的名字,有多少个字段等等。当我们增加一个

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。