三层架构包图对应的程序集中的项目
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/12/81122846502.jpg" />
这时,我的理解仅仅停留在:具有UI、BLL、DAL层的系统就是使用了三层架构思想;当然三层架构系统中还可以加设计模式、SqlHelper等层,这时使系统具有多层;也稍微了解每层应实现什么功能。
这里我犯了几点错误,从图中可以看出
1) 命名不规范,当时我以为此系统是"机房收费系统",所以就在UI、BLL、DAL等前面加上了字母"JF",对于实体因为我看了一个视频中某老师使用的是Model,我也跟着写成了Model,没去问为什么。
2) 根本不理解三层之间真正的调用关系。没分清哪一层调用哪一层的方法,没明白谁向谁传参数。
3)理论上明白分层的目的,实际操作时却丢了分层的目的。我把设计模式"工厂方法"放到了D层,本来要使B层和D层分开的,我的做法恰恰不让他们分开;虽然程序可以实现,但是我违背了解耦的原则。
3.豁然开朗:经过师哥师姐指正,重新建模
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/12/37122846849.jpg" />
通过师哥师姐帮我分析,前后对比,我明白了分层的真正目的,也明白了自己上图的做法并没有解耦。
犯错了,领悟了,才了解为什么这么做是正确的…
三.建模之路,我的收获
经过"机房收费系统"这个建模过程,我得到了几点系统建模经验,写出来与大家分享……
经验1.真正理解三层的意义,包之间的引用关系
所谓三层开发,就是关于表现层、业务逻辑层和数据访问层的开发。这其实只是大方向的分层,每个层中都有可能再分为多个层次和结构。三层架构中,上层包向下层包传递参数,上层包调用下层包的方法,下层包向上层包传回返回值。
经验2.既然用设计模式,就要明白设计模式的真正意义
这里我用到了工厂方法模式,工厂方法模式到底是干嘛的?工厂是用来创建对象的,实际上这里的工厂是为了生产DAL。使用工厂方法是为了使BLL层与DAL层解耦,另一个作用是为了使数据库更换方便。
注意:这个三层架构中使用了工厂+反射,若只使用工厂而不使用反射,又怎么建模呢?
经验3.架构图要与程序集代码完全对应
软件设计完,编写代码过程要完全按照图来进行,图和文档是我们编写代码的依据。这里所说的对应不仅仅指包图名称与程序集中项目名称对应,而且要使包中的引用关系与程序集中的引用相对应。
注意:程序集中的引用项与包图之间的引用关系是一个意思。
经验4.程序集中的项目引用项,不能添加多的引用,也不可少引用某层
看下图
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/12/B9122846716.jpg" />
这个图添加的引用是正确的,有的人在调试程序时出错,就在引用项中加入了"DAL"。看下面的错误图,比较与上图的区别:
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/12/25122846881.jpg" />
在UI层引用"DAL"就错了,因为编写好的程序打包后DAL不是仅仅打包成一个.DLL文件,而是将DAL.DLL文件打包到UI中了,这样做,更换 DAL时,系统就会报错。为了解决这一问题,需要使用深层路径,只是将DAL的路径打包到UI中,也就是使引用中不含有DAL 而 debug项中含有DAL相关项,这样打包完依然是解耦状态,这时更换DAL,只要路径对了,就不会报错了。
还有一点,有的人将SqlHel