接上篇《机房收费系统重构(一)》

二、概要设计

完成了用例图,并用结合用例图完善了一下需求分析说明书,忘记是第几次修订需求分析说明书。有了用例图,很自然就进入了概要设计阶段。我认为这一阶段就是结合包图解决系统的基本架构。在这里采用了三层架构(符合高内聚,低耦合的思想),并结合了一些设计模式。

下面看我的包图:

可以看到,这个包图,是从最经典的三层UI-BLL-DAL加入设计模式演化而来。

之所以采用抽象工厂模式是考虑到更换数据库的方便。

而应用外观模式,是为了解决UI层和BLL层耦合性过高的问题,UI层不必知道BLL层的存在,Facade(外观)知道BLL层的哪些类负责处理哪些请求,它将UI的请求代理给适当的BLL层的类。使外部调用更方便。

三、抽象各层的类

当我们确定了整个系统的架构,接下来要做的就是细化,这是一个从宏观到微观的过程。

1、抽象实体类

我认为,第一步要做的就是抽象实体层的类(Entity),因为信息系统是对数据的操作和处理,首先必须要有数据,这个时候,我们要返回需求,了解用户的数据要求,以此为依据进行数据库设计,数据库设计参见我的文章:

《数据库设计第三范式》

还有一篇转载《数据库设计经验谈》

数据库设计好了,我们要根据数据库中的表抽象实体类,在机房收费系统中,实体类基本上是跟表一一对应的,一个表映射出一个实体类,表的字段即为实体类的属性。

实体层并不属于三层中的任何一层,它是独立出来的一层,可以把他看做自定义变量的组合,供三层使用。

下面看看我抽象出的实体类:

见图:

从图中,看到有一个EN_PublicField类,这个类并不是由数据表映射而来,它是一个装载公共变量的类,在系统中,尽量不要在类之外建立变量.有全局用的东西,我们可以建一个实体类,把该全局变量作为它的属性。所以,实体类的数量可能多余表的数量.

2、数据访问层

搞定了实体层,再来看看数据访问层(DAL),这一层的主要任务是直接操作数据库,完成对数据的增删改查等。这里我们仍然根据数据表来抽象DAL层的类,基本上也是一个表对应一个类,这样当我们增加新的表,直接增加新的DAL层类就可以,很好地符合了“开闭原则”。

另外,因为DAL层的类是直接对数据库进行操作的类,所以这个类里封转大都有四种方法:增删改查。但根据实际情况会有不同的参数,不同的返回值。

这里加了一层接口,利用反射和抽象工厂,以防更换数据库。见下面的部分截图。

接口:

注:我们看到有一个接口叫ITime,这个接口是用来获取服务器时间,所以DAL层类的数量也可能多余表的数量。

DAL实现IDAL接口

抽象工厂模式+反射+配置文件

3、封装业务逻辑,构成BLL层的类

完成了数据访问层,我们算是打好了地基了,下面我们再看用例图,基本上一个用例封装了一个功能。BLL层的类,我们可以根据功能来分,把与该功能相关的操作集成到一个BLL层的类里,这里我们要把握好粒度,平衡就好。

尽量做到符合单一职责原则,一个类完成一个功能,即不要在BLL层出现类之间互相调用的情况,虽然可以减少代码量,但会增加系统的复杂性,造成模块与模块之间的强耦合。

举个例子:“结账”的时候我们需要查询充值记录表,“查询充值记录”的时候我们也需要查询充值记录表,我们应该在BLL层的结账类里设置查询方法,在查询充值记录类里也应设置查询方法。

如果情况比较特殊,需要交叉调用,例如一个操作需要不断的重复(超过三次),我们一般将它提取出来,供外部调用。这时候,我们应该把调用上移,即,不要在BLL类中调用BLL层类的方法,而是在BLL层的上一层,我们这里用到了外观模式,所以在BLL的上一层即Facade层(见上面的包图)完成对两个类的方法的调用。

举个例子:"上机"需要检查卡号是否存在,"下机"也需要检查卡号是否存在,"充值","退卡","注册卡"都需要检查。这时候我们可以把检查卡号这个操作提取出来。当我们调用的时候,不是在BLL层中直接调用,而是把它提升到Facade层来调用,即,调用上机之前,先调用"检查卡是否存在"。

下面看看我的BLL层

在BLL层用到了策略模式:

4、降低UIBLL的耦合,采用外观模式,加入外观(Facade)类

BLL层中有很多,很小的类,这就给UI层的调用带来了困难,外观类这一层为UI层提供了一个简单的接口,大大降低了UI层和BLL层的耦合度,也可以看做是一次粒度上的粗化。

见图:

5、界面层(UI

界面层的类,就是我们的窗体类,有多少个窗体,UI层就有多少个类。

见图:

三、设计模式

上面提到的设计模式有:抽象工厂模式,外观模式,策略模式。在BLL层考虑使用模板方法模式。在UI层,将使用观察者模式,实现状态栏的动态变化。如果使用外部报表控件,很可能用到适配器模式。

总结:上述设计只是个人观点,有待在编码过程中验证,欢迎拍砖。

转载于:https://www.cnblogs.com/spring5/archive/2011/10/15/2485292.html

重构机房收费系统(二)相关推荐

  1. 重构机房收费系统总结1之配置文件+反射+抽象工厂

    在重构机房收费系统之前就一直听说这次重构要用反射+配置文件.深远的作用不知道,可是在这次重构用到,目的还是挺明白的:就是为了更换数据时方便,遵循开放-封闭原则.攻克了可维护和可扩展的问题. 以下就以机 ...

  2. 重构机房收费系统(一)

    从10月1号开始重构学校机房收费系统,没想到这次重构,推翻,再重构--用了两周时间. 这次整体架构采用三层,并融入了一些设计模式. 下面介绍这次重构的过程: 一.从UML用例图开始 对于机房收费系统的 ...

  3. 重构机房收费系统你要用的——异常处理和抛出异常(try catch finally)——(vb.net)...

    你能保证你的程序不会出问题吗? 不能 当你的程序执行到某个地方发生了你不想要的结果.你是否想让它一错再错? 不想 你是否想让你的程序占着茅坑不拉屎? 不想 你是否想知道你的程序出错的原因? 想 看了了 ...

  4. 重构机房VB.NET机房收费系统个人重构版你都学会了什么(之一)

    每日一贴,今天的内容关键字为重构机房 在VB.NET机房收费系统个人重构版时你都学会了什么?在开始第二遍的机房收费系统个人重构时,我发明不知不觉竟接触了很多很多之前不晓得的货色,也学到了很多新知识.下 ...

  5. 机房收费系统重构(五)—登陆窗口完整版

         在上上篇.<机房收费系统重构(3)>.中主要是介绍了自己关于DAL层,工厂层.以及接口层,还有实体层的理解.可是好多读者再问我.你的代码呢,我在这解释一下.就是我仅仅是写出关于那 ...

  6. vb.net机房收费系统重构——存储过程的使用

    在敲写七层登陆过程中,接触了存储过程的概念,但当时还没使用.在正式的重构过程中,一点点添加,将存储过程也添加到了重构中.才正式了解了存储过程. 首先 [存储过程的概念] 存储过程Procedure是一 ...

  7. 机房收费系统重构之存储过程的使用

    从一开始对于机房收费系统的无从下手,到现在已经接近尾声,像冬天的迷雾一样,随着时间散开了去,对于其也是越来越清晰,想一想,这种学习的过程还真是美妙. 当然只学习不去总结是没有意义的.今天我就来把存储过 ...

  8. 机房收费系统合作版(二):透过显示上机人数品味如何做到全心全意为人民服务

    [前言] 尘封半年之久的机房合作再次被鹅大组长提上日程,为了积极响应组长的号召最近两日在噼里啪啦的弄机房!逐渐追回了开始合作时信誓旦旦的宣言(详情点击<机房收费系统合作版:开始团队合作之旅> ...

  9. 机房收费系统个人重构版:暮然回首,灯火阑珊

    [背景]   在蹒跚中自己的机房收费系统个人重构版已完结:回望这一路征程,感慨颇多:快乐过,痛苦过:紧张过,放松过!真可谓:酸甜苦辣,五味杂陈. [比一比] VB.Net版个人重构版比VB版机房收费系 ...

最新文章

  1. JS闭包的理解及常见应用场景
  2. C# 打印多页tif
  3. webpack的入口起点(EntryPoints)
  4. __VA_ARGS__宏
  5. Android 性能优化——绘制优化
  6. 替换对象所有字段_JVM字段访问优化
  7. 用递归将嵌套的JSON对象遍历出来,转为二维数组
  8. OSPF——路由聚合【(汇总)含配置命令】||地址汇总计算方法——详解
  9. 索尼Xperia 5 II官方高清渲染图曝光:还是那个熟悉的小屏旗舰
  10. 阿里腾讯极其看重的数据中台,我用大白话给你解释清楚了
  11. oracle matlab函数返回值,如何实现在Oracle中应用存储过程调用MatLab函数(2)
  12. Origin 2022b | 更新及安装 | 中英文切换
  13. 应用回归分析(知识点整理)(五)——多重共线性与自变量的选择
  14. 微信应用(小程序)开发最全整理
  15. server多笔记录拼接字符串 sql_第四章、SQL Server数据库查询大全(单表查询、多表连接查询、嵌套查询、关联子查询、拼sql字符串的查询、交叉查询)...
  16. 单应用下RabbitMQ如何保证线程安全,及多应用下抢数据问题
  17. allrgro17.2转AD19方法,实测
  18. java——记录一次条形码、二维码、订单自动生成的制作
  19. 点击劫持漏洞修复(前端、后端)
  20. 指尖江湖李忘生鸿蒙初开,剑网3指尖江湖李忘生怎么玩 使用攻略

热门文章

  1. 通过 dhcp-agent 访问 Metadata - 每天5分钟玩转 OpenStack(168)
  2. 鹤峰:美丽的茶乡—— 山水篇
  3. 单片机小白学步系列(六) 单片机最小系统——麻雀虽小,五脏俱全
  4. eclipse 全屏插件
  5. NB-IoT SNR RSRQ RSRP等信号参数解释
  6. linux 查找文件夹_用python打造一个基于socket的文件(夹)传输系统
  7. mysql编写函数 求1 n 偶数之和,编写求1 2 3 - n的函数.在main函数中调用该函数
  8. opengles 顶点数组 android,OpenGLES顶点属性、顶点数组和缓冲区对象
  9. php自动运维,运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(五)
  10. 【caffe-Windows】基于Python多标签方法——VOC2012数据集