无锡外贸网站开发,黑龙江最新消息今天,简易软件下载,广州企业网接上篇《机房收费系统重构#xff08;一#xff09;》 二、概要设计 完成了用例图#xff0c;并用结合用例图完善了一下需求分析说明书#xff0c;忘记是第几次修订需求分析说明书。有了用例图#xff0c;很自然就进入了概要设计阶段。我认为这一阶段就是结合包图解决系统… 接上篇《机房收费系统重构一》 二、概要设计 完成了用例图并用结合用例图完善了一下需求分析说明书忘记是第几次修订需求分析说明书。有了用例图很自然就进入了概要设计阶段。我认为这一阶段就是结合包图解决系统的基本架构。在这里采用了三层架构符合高内聚低耦合的思想并结合了一些设计模式。 下面看我的包图 可以看到这个包图是从最经典的三层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、降低UI和BLL的耦合采用外观模式加入外观Facade类 BLL层中有很多很小的类这就给UI层的调用带来了困难外观类这一层为UI层提供了一个简单的接口大大降低了UI层和BLL层的耦合度也可以看做是一次粒度上的粗化。 见图 5、界面层UI 界面层的类就是我们的窗体类有多少个窗体UI层就有多少个类。 见图 三、设计模式 上面提到的设计模式有抽象工厂模式外观模式策略模式。在BLL层考虑使用模板方法模式。在UI层将使用观察者模式实现状态栏的动态变化。如果使用外部报表控件很可能用到适配器模式。 总结上述设计只是个人观点有待在编码过程中验证欢迎拍砖。 转载于:https://www.cnblogs.com/spring5/archive/2011/10/15/2485292.html