分层

分层是为了减少层与层之间的依赖,添加程序的可读性,让整个系统结构清晰明白。还可大大减少维护成本,可是分层也有一定的缺点,有些能够直接訪问数据库的层,却要通过负责訪问数据库的层进行訪问。这样,在訪问数据库过程中就多出一个环节,添加了系统的开销,有时候要在表示层添加某个功能。为了减少耦合,就不得不自上而下,在每一层里面添加这个功能所需的服务类,这样就添加了开发成本

分层越多越好吗?答案是否定的,引用一句话“我们也要     时刻谨记:不能盲目分层,不应分层而分层不应模式而模式。

这是非常重要的。不然仅仅能添加开发的负担(在今后的实践中更好的体会)。”应该是说要依据实际的情况进行分层,毕竟不是绝对的,由于有些系统不分层比分层有点很多其它一些。

主要的分层主要用的是三层架构:

表示层(UI)

主要用于与用户的交互,负责传达用户的指令以及数据给BLL层。并把用户须要的数据显示出来,通俗的讲就是用户能见到的界面,如窗口程序。

业务逻辑层(BLL)

对数据的逻辑处理。比方把訪问数据库得到的数据,转换成用户向看到的数据,并提交给表示层进行显示。

数据訪问层(DAL)

对数据库进行訪问,提供增删改查等操作。

以下是我的包图,每一个包就是一个层,当中添加了实体层(Model)、接口层(IDAL)和工厂层(Factory)

实体层(Model)

实际上就是相应的数据库里面的每一张表。一个表就建一个类。一个类里面的属性则是相应表里面的字段,比方表BaseData_Info

在实体层中,就能够这样建立一个类:

Public Class BaseDataEntity
Inherits Entity Private FixedUserHalfHourCost As Single '固定用户半小时花费
Public Property FixdUserHalfHourCost_ As Single
Get
Return FixedUserHalfHourCost
End Get
Set(value As Single)
FixedUserHalfHourCost = value
End Set
End Property Private CasualUserAnHourCost As Single '暂时用户一小时花费
Public Property CasualUserAnHourCost_ As Single
Get
Return CasualUserAnHourCost End Get
Set(value As Single)
CasualUserAnHourCost = value
End Set
End Property Private IncreasingUnitTime As Single '单位递增时间
Public Property IncreasingUnitTime_ As Single
Get
Return IncreasingUnitTime
End Get
Set(value As Single)
IncreasingUnitTime = value
End Set
End Property Private AtleastOnlineTime As Single '最少在线时间
Public Property AtleastOnlineTime_ As Single
Get
Return AtleastOnlineTime
End Get
Set(value As Single)
AtleastOnlineTime = value
End Set
End Property Private ReadyTime As Single '准备时间
Public Property ReadyTime_ As Single
Get
Return ReadyTime
End Get
Set(value As Single)
ReadyTime = value
End Set
End Property Private AtleastMoney As Single '最少金额
Public Property AtleastMoney_ As Single
Get
Return AtleastMoney
End Get
Set(value As Single)
AtleastMoney = value
End Set
End Property End Class

有什么用呢?当你须要注冊一个用户时候,你得从表示层(UI)把数据传递给用于訪问数据库的数据訪问层(DAL),可是。你不可能把用户注冊的信息:学号。姓名,卡号,注冊日期,注冊时间,班级。。

。。。。等等把參数传递给函数。进行添加行操作吧?

    ’你该不会真的这么传值吧?被吓到了
AddUser(StudentID,StudentName,CardID,RegisterDate,RegisterTime,Class。 。。。 。。)
’而假设你把这些数据封装成一个类。如上述,你仅仅须要传递一个类即可了
AddUser(UserInfo)

数据库连接

对于数据库的訪问,基本上什么语言都离不开这么几步:

1.      连接数据库

2.      运行sql语句

3.      返回sql语句的运行结构

而连接数据库的字符串,大家能够參考数据库连接字符串大全

运行sql语句能够參考sql语句大全

以下是一个简单的数据库訪问样例:

ImportsSystem.Data.SqlClient   ’引用sqlclient
Public Class SelectDAL
Public Overloads Function SelectInfo(ByVal Table As String) '查询整张表
Dim DataS As New DataSet
Try
Dim SelectStr As String = "select * from " & Table '查询语句
Dim ConnectStr As String ="Data Source=server名/server地址;Initial Catalog=数据库名; UserID=sa;Password=123"'数据库连接字符串
Dim DBConnection As New SqlConnection(ConnectStr) '初始化数据库连接对象 DBConnection.Open() '连接数据库
'Dim DBCmd As New SqlCommand(SelectStr,DBConnection) '运行查询语句
Dim Adapter As New SqlDataAdapter(SelectStr,DBConnection) '把查询结果保存到缓存中 Adapter.Fill(DataS, Table) '把缓存中的表以Table为名保存到DataSet中 Catch ex As Exception
Throw New ArgumentOutOfRangeException(""& ex.Message)
End Try Return DataS End Function

当中连接数据库要用到的对象是SqlConnection。运行查询语句以及返回结果用的是SqlDataAdapter对象。

数据库的连接有非常多种方式,如本地、远程等。

仅仅要參考參考数据库连接字符串,根据自身情况进行选择使用就能够达到目的。

反射+工厂、接口

对于反射,一開始我非常的茫然,在设计模式里面敲了样例之后。查了非常多资料。也不知道怎么应用到收费系统中。确实笨到家了。

只是,后来看到了高人的博客。才会了。

看下图:

假如说你有BLL和DAL2个层,你希望在BLL里面的一个类A使用DAL里面的BalanceDAL类,你能够通过引用DAL从而达到目的,可是,据说为了降低BLL与DAL的耦合性。所以在BLL和DAL之间加了个接口层叫IDAL。

例如以下图

可以看到框中的是上面DAL里面BalanceDAL的接口。这个接口里面包括了详细类(BalanceDAL)的全部方法。所以我们仅仅要调用接口。就相当于调用了详细类(BalanceDAL),可是,前提是你必须把接口和详细类接通。就好比电视机和遥控器,遥控器是电视机接口,要想遥控器能控制接口。电视机里面应该要有一个可以接收并处理红外线新号的装置,当你使用遥控器的时候。遥控器跟电视机是联通的,他们之间通过了红外线联通。

其实,接口与详细类之间的关系,仅仅是两者之间创建了一条管道。接口中没有详细的功能,但却有那个详细类使用的一个方法(就像遥控器上的按键),假设遥控器跟电视机之间没有联通,那么你按一下遥控器,是不会实现开机或者调频等功能的。所以,要使用接口,必须让接口与详细实现的类进行联通,这里有两步走。第一步是引用,第二步是创建实例。看下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXNkMTk5MjAxMjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

在DAL的引用里把IDAL打上勾即可了也就相当于在这两个层之间架起了桥梁。接下来。我们让DAL来实现这个接口,也就是在DAL里面创建详细类之后。写上keyword+你要实现的接口,然后回车。它就会自己主动列出你在接口里写的方法,然后再方法里。你去详细的实现吧。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXNkMTk5MjAxMjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

然后,我们须要在桥梁上面加管道,加了管道,就是把接口的方法和详细类的方法连接起来。使得我在BLL层里面调用接口的方法。就相当于调用了详细类的方法,可是我BLL并不知道详细类究竟是怎么实现的,据说。这就是减少了BLL层与DAL层之间的耦合,由于我仅仅关心接口IDAL即可了。例如以下代码,看BLL里是怎样使用接口

Imports System.Reflection           ’反射的引用
Public ClassBalanceBLL
FunctionBalanceQuery(ByVal CardID AsString)
IfCardID = "" Then
ThrowNewArgumentOutOfRangeException("","请输入卡号:")
EndIf DimIBalance As IDAL.IBalance '剩余金额接口
IBalance = CType(Assembly.Load("DAL").CreateInstance("DAL.BalanceDAL"),IDAL.IBalance) '得到剩余金额类
DimDS As NewDataSet
Try DS = IBalance.SelectBalanceInfo(CardID) '查询并返回数据集结果
IfDS.Tables(0).Rows.Count < 1 Then
Throw NewArgumentOutOfRangeException("","没有这个卡号的剩余金额记录")
EndIf
Catchex As Exception
ThrowNewArgumentOutOfRangeException("",ex.Message)
EndTry
ReturnDS
EndFunction

这里,我们首先引用了反射,然后创建接口(IBalance),再然后就是通过反射。把DAL层里的BalanceDAL详细类的实例反射过来给接口。这样,我们就相当于在接口和详细类之间连接了管道,然后我们就能够使用详细类的方法了:IBalance.SelectBalanceInfo(CardID)'查询并返回数据集结果

后来发现。把DAL层里面的类反射到BLL层里面。也就相当于在BLL层里面生产了DAL层的类,然后反射得到详细类的那些代码。我便抽象出了一个层,名曰Factory层。仅仅要BLL引用工厂,便能够通过工厂返回详细类了。

这也就是反射+工厂的应用吧。

好像写的有点长。本来还有重载、配置文件、异常处理、存储过程等比較有用点的技术要写的。算了,放到下一篇吧。希望对大家有帮助。

虽说面向对象比較复杂。可是整体的感觉,它就是把非常多复杂的东西分类、分块、分层、分......然后用线把他们窜起来,你不必全然的记住全部的分块,但你能够顺着那些图纸毫不保留的了解到细节。仅仅要去习惯这种思维方式。相信也不太难的。

重构版机房收费系统之分层、接口、数据库连接、反射+工厂(vb.net)的更多相关文章

  1. VB.NET版机房收费系统---七仙女之系统登录

    VB.NET第一版机房收费系统,告一段落,验收的时候.问题也是大大的存在,没实用上设计模式,什么触发器.存储过程,都没实用上.看看其她小伙伴的,七层实现登录?那是什么东东,相比較我的三层而言,多了两倍 ...

  2. VB.NET版机房收费系统---导出Excel表格

    datagridview,翻译成中文的意思是数据表格显示,使用DataGridView控件,能够显示和编辑来自不同类型的数据源的表格,将数据绑定到DataGridView控件很easy和直观,大多数情 ...

  3. VB.NET版机房收费系统---报表

    报表,即报告情况的表格,简单的说:报表就是用表格.图表等格式来动态显示数据,可以用公式表示为:"报表 = 多样的格式 + 动态的数据". 在没有计算机以前,人们利用纸和笔来记录数据 ...

  4. VB.NET版机房收费系统---异常处理

    异常处理,英文名为Exceptional Handling, 那时年少,还记得那年一起学习过的VB6.0的时候,常常使用ONError的错误语句.与传统VB6.0中的OnError语句相比.NET平台 ...

  5. VB.net版机房收费系统——结账功能实现(调错与优化)

    调错部分 上一篇博客<VB.net版机房收费系统--结账功能实现(代码部分>说的是结账功能的实现,亮出了代码.是在为这篇博客做铺垫.尽管结账功能代码是借鉴的巨人的博客.可是自己比着葫芦画瓢 ...

  6. VB.NET版机房收费系统---外观层如何写

    外观设计模式,<大话设计模式>第103页详细讲解,不记得这块知识的小伙伴可以翻阅翻阅,看过设计模式,敲过书上的例子,只是学习的第一步,接着,如果在我们的项目中灵活应用,把设计模式用出花儿来 ...

  7. VB.NET版机房收费系统---组合查询

    查询的意思就是查找,寻找,指在某一个或几个地方找出自己所要的信息,假如我想搜索一下我自己写的博客,名字叫做初雪之恋,我在百度的搜索框中输入丁国华三个字,会有怎样的惊喜等着我? 啊哦,这个信息并不是我想 ...

  8. VB.NET版机房收费系统---外观层怎样写

    外观设计模式.<大话设计模式>第103页具体解说,不记得这块知识的小伙伴能够翻阅翻阅,看过设计模式,敲过书上的样例,仅仅是学习的第一步,接着,假设在我们的项目中灵活应用,把设计模式用出花儿 ...

  9. VB.NET版机房收费系统—数据库设计

    之前第一遍机房收费的时候,用的数据库是别人的.认知也仅仅能建立在别人的基础上,等自考中<数据库系统原理>这本书学完了之后,再去看曾经的数据库,发现数据库真的还须要进一步的优化.以下是我设计 ...

随机推荐

  1. Scrapy中的核心工作流程以及POST请求

    五大核心组件工作流程 post请求发送 递归爬取 五大核心组件工作流程 引擎(Scrapy)用来处理整个系统的数据流处理, 触发事务(框架核心) 调度器(Scheduler)用来接受引擎发过来的请求, ...

  2. Hadoop MapReduce编程 API入门系列之join(二十六)(未完)

    不多说,直接上代码. 天气记录数据库 Station ID Timestamp Temperature 气象站数据库 Station ID Station Name 气象站和天气记录合并之后的示意图如 ...

  3. C#关于VSHOST.EXE停止工作的解决办法,VS2008

    主要原因就是电脑系统系统32位和64位的问题在项目属性中修改下即可. 方法: 右击项目 - 属性 - 生成 - 目标平台 - Any CPU[改为x86] 虽然简单,但如不知原因却恼火的紧,贴出来如有 ...

  4. 转载:关于 python ImportError: No module named 的问题

    关于 python ImportError: No module named 的问题 今天在 centos 下安装 python setup.py install 时报错:ImportError: N ...

  5. ML二:python批量修改文件名-测试KDTree

    (1):#批量修改文件名 import os import numpy as np import string import shutil prefix =''#单引号,前缀! sufix ='txt ...

  6. 杭电 2035 人见人爱A^B【同余】

    #include<stdio.h> int main() { int a,b; int s; int i; while(scanf("%d %d",&a,&am ...

  7. 06--C语言数学函数

    在使用C语言数学函数时候,应该在该源文件中使用以下命令行: #include <math.h> 或 #include "math.h",这里的<>跟&quo ...

  8. C语言break/continue/exit/return的功能区别

    break是跳出整个循环而执行循环体之外的下一条语句: continue只是跳出本次循环继续判断下一次循环条件是否满足. exit() 结束当前进程/当前程式/,在整个程式中,只要调用 exit ,就 ...

  9. 资深程序员总结:彻底理解Spring容器和应用上下文

    点关注,不迷路:持续更新Java架构相关技术及资讯热文!!! 有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期.业务代码只需要按照业务本身的流程,走啊走啊,走到哪 ...

  10. 【转】【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)

    原文地址:http://www.cnblogs.com/baiboy/p/orc3.html 阅读目录 目录 RAC 工作原理和相关组件 ClusterWare 架构 RAC 软件结构 集群注册(OC ...