机房重构总结(一)

1、【对七层的理解:】


上图就是我个人重构的整体架构。在代码实现的过程中才算是慢慢理解七层的各自功能。下面说一下自己的理解:

UI层:设计满足用户需求的界面,并进行必要的文字说明。声明所需变量,实例化实体、外观层并调用外观层的方法。

Façade层:更好的解耦UI层和BLL层。假如BLL层的方法改变某一部分的时候UI层不至于跟着一起变动,减少了工作量。

BLL层:是业务逻辑层。从数据访问层获取数据,显示在显示层,从显示层获取用户指令和数据,执行业务逻辑;从显示层获取用户指令和数据,通过数据访问层写入数据源。UI提出请求,收集数据传给业务逻辑层转向BLL再返回给UI

IDAL层:提供D层接口。直接与BLL联系。

DAL层:直接访问数据库,针对数据库的增,删,改,查。

Entity层:可以简单的理解为是一个描述业务实体的类,是数据传输的载体。为我们在关系数据库和对象之间架起了一座桥梁。

Factory+反射+配置文件:作数据连接。把东西写活了,在换数据库的时候就省事多了。

其实加设计模式就是为了更好地解耦,提高工作效率。

2、【功能实现流程】

①登录功能

②一般用户的查询功能

③修改密码

④操作员注册、充值、退卡;信息查询(组合查询)、学生信息管理

⑤管理员用户管理、基本数据设定

⑥结账、账单查看

⑦上下机

⑧整体代码优化改进

3、【注释:类头注释、类中注释】

注释的重要性:使得代码增加了可读性,使别人更容易读懂代码。

方法:首先找到Class.vb这个文件。我的再C:\Program Files(x86)\Microsoft\VisualStudio\10.0\Common7\IDE\ItemTemplatesCache\VisualBasic\Code\2052\Class.zip这个目录下进行设置。

编写完之后的效果如下:


4、【期间学到的新知识】

(1)SQLHelper类的应用

是什么?

SqlHelper是一个基于.NET Framework的数据库操作组件。组件中包含数据库操作方法,SqlHelper用于简化你重复的去写那些数据库连接(SqlConnection),SqlCommand,SqlDataReader等等。SqlHelper 封装过后通常是只需要给方法传入一些参数如数据库连接字符串,SQL参数等,就可以访问数据库了,很方便。

为什么?

在这个类里面可以定义数据库的连接、有无参数的增删改查。写到一个类里面到时候哪里用到了数据库操纵语句就可以从哪里调用一下。跟之前用的模块一样。把公有的东西写到一起,用的时候直接调用一下就可以啦。

代码实现:

Public Class SqlHelper
    '定义并连接数据库
    Dim strCon As String = ConfigurationManager.AppSettings("ConnString")
    '定义一个数据库连接对象
    Dim conn As SqlConnection = New SqlConnection(strCon)
    '定义一个命令对象
    Dim cmd As New SqlCommand
    '关闭连接
    Private Sub CloseConn(ByVal conn As SqlConnection)
        '如果没有关闭,则关闭连接
        If (conn.State <> ConnectionState.Closed) Then
            conn.Close()
            conn = Nothing
        End If
    End Sub
    '关闭命令
    Private Sub CloseCmd(ByVal cmd As SqlCommand)
        '如果没有关闭命令,则关闭命令
        If Not IsNothing(cmd) Then
            cmd.Dispose()  '处理
            cmd = Nothing
        End If
    End Sub
    '有参数的增删改
    Public Function ExecuteNoQuery(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlParams As SqlParameter()) As Integer
        '将传入的值,分别为cmd的属性赋值
        cmd.Parameters.AddRange(sqlParams)  '传入参数
        cmd.CommandType = cmdType
        cmd.Connection = conn    '设置连接
        cmd.CommandText = cmdText
        'cmd = New SqlCommand(cmdText, conn)
        Dim result As Integer
        '执行操作
        Try
            conn.Open()
            result = cmd.ExecuteNonQuery()  '执行增删改操作并返回受影响的行数
            cmd.Parameters.Clear()  '清除参数

        Catch ex As Exception
            MsgBox(ex.Message, , "数据库操作")
        Finally
            Call CloseConn(conn)  '关闭连接
            Call CloseCmd(cmd)  '关闭命令
        End Try
        Return result
    End Function
    '无参数的增删改
    Public Function ExecuteNoQuery(ByVal cmdText As String, ByVal cmdType As CommandType) As Integer
        '将传入的参数分别为cmd属性赋值
        cmd.CommandType = cmdType
        cmd.Connection = conn
        cmd.CommandText = cmdText '设置查询单 的语句
        'cmd = New SqlCommand(cmdText, conn)
        Dim res As Integer
        '执行操作
        Try
            conn.Open()
            res = cmd.ExecuteNonQuery() '执行增删改操作并返回收到影响的行数
            cmd.Parameters.Clear() '清除参数

        Catch ex As Exception
            MsgBox(ex.Message, , "数据库操作")
        Finally
            Call CloseConn(conn)
            Call CloseCmd(cmd)
        End Try
        Return res
    End Function
    '有参数查询
    Public Function ExecSelect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlParams As SqlParameter()) As DataTable

        Dim sqlAdapter As New SqlDataAdapter  '声明适配器
        Dim dt As New DataTable   '声明数据表
        Dim ds As New DataSet   '声明数据缓存

        cmd.CommandType = cmdType
        cmd.Connection = conn
        cmd.CommandText = cmdText   '设置查询语句
        '将传入的值分别赋给cmd的属性

        cmd.Parameters.AddRange(sqlParams)  '将参数传入


        'cmd = New SqlCommand(cmdText, conn)
        sqlAdapter = New SqlDataAdapter(cmd)  '实例化适配器

        '执行操作
        Try
            sqlAdapter.Fill(ds)  '用适配器对ds进行填充
            dt = ds.Tables(0)  '返回数据集的第一个表
            cmd.Parameters.Clear()  '清除参数

        Catch ex As Exception
            MsgBox("查询失败", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "警告")
        Finally
            Call CloseConn(conn)
            Call CloseCmd(cmd)
        End Try
        Return dt
    End Function
    '无参数查询
    Public Function ExecSelect(ByVal cmdText As String, ByVal cmdType As CommandType) As DataTable
        Dim sqlAdapter As SqlDataAdapter   '声明适配器
        Dim dt As New DataTable   '声明数据表
        Dim ds As New DataSet   '声明数据缓存

        '将传入的值分别给cmd属性赋值
        cmd.CommandType = cmdType   '设置一个值,解释cmdText
        cmd.Connection = conn
        cmd.CommandText = cmdText

        sqlAdapter = New SqlDataAdapter(cmd)  '实例化适配器
        '执行操作
        Try
            sqlAdapter.Fill(ds)  '用适配器对ds进行填充
            dt = ds.Tables(0)  '返回数据集的第一个表

        Catch ex As Exception
            MsgBox("查询失败", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "警告")
        Finally
            Call CloseConn(conn)
            Call CloseCmd(cmd)
        End Try
        Return dt
    End Function

End Class

(2)泛型集合

什么是泛型集合?

泛型是指具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其方法的参数类型出现。

为什么要用泛型集合?

通常情况下,都建议使用泛型集合,因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员。此外,如果集合元素为值类型,泛型集合类型的性能通常优于对应的非泛型集合类型。总的来说,使用泛型集合,可以更快捷的得到所需要的数据,相当于走了一条捷径。

代码实现:

 Public Shared Function converToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)
            '(Of T as {New})中的New是用来约束T的,必须有
            '定义并实例化泛型集合
            Dim myList As New List(Of T)
            '得到实体类的类型名
            Dim myType As Type = GetType(T)   '此声明不知道如何使用,后边也没有用到
            Dim dr As DataRow   '定义行集
            Dim tempName As String = String.Empty  '定义一个临时变量
            ' 便利DataTable的所有数据行
            For Each dr In dt.Rows
                Dim myT As New T
                Dim propertys() As PropertyInfo = myT.GetType().GetProperties() '定义属性集合
                Dim pr As PropertyInfo
                '遍历对象的所有属性
                For Each pr In propertys
                    tempName = pr.Name '将属性名称赋值给临时变量
                    '检查DataTable是否包含此列
                    If (dt.Columns.Contains(tempName)) Then   '将此属性与datatable里的列明比较,查看datatable是否包含此属性  
                        '判断此属性是否有Setter
                        If (pr.CanWrite = False) Then  '判断属性是否可写,如果不能则跳出循环
                            Continue For
                        End If
                        Dim value As Object = dr(tempName) '定义一个对象型的变量类保存变量
                        If (value.ToString <> DBNull.Value.ToString) Then '如果非空,则赋给对象属性
                            pr.SetValue(myT, value, Nothing)  '在运行期间,通过反射,动态的访问一个对象的属性
                        End If
                    End If

                Next
                myList.Add(myT) '添加到集合

            Next
            Return myList '返回实体集合
        End Function

(3)存储过程

是什么?

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

为什么?

存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度;当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用;存储过程可以重复使用,可减少数据库开发人员的工作量。所以说,为了减轻DAL层的负担,可以使用存储过程,把数据控制语句写到数据库中。查询的时候直接调用存储过程,方便快捷。

举例说明:


(4)其他设计模式的应用

在弄组合查询的时候,因为有三个窗体界面设计基本一致。如果单一进行设计的话要做三次,在这里可以应用模板模式,这样的话可以减少代码量也可以减少代码设计的时间消耗,使用继承的窗体就可以把问题完全解决喽。除此之外还有好多地方可以用到设计模式,比如说,上下机可以用到策略模式定义一系列算法;登录时用单例模式设置权限等等。


当然,在重构的过程中学到的知识远不止这些,也还有好多东西需要进一步探索:触发器、视图等。一个多月的重构历程让我回味无穷。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 36
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值