理解分层真的花费了很长的时间,不过现在看来,对分层还是有了一些初步的理解,暂时贴出来见见光光,里面可能有很多不足到之处,希望大家能及时指出来,感激不尽,在此谢过了,小菜虫迫切需要您的指教。
一、首先说说为什么要分层?
背景:2011年,廊坊师范学院,信息技术作品展。
事件:我们七个同学一起合作用VB做了一个小程序名叫《宝宝乐园》,其中,有人做英语部分,有人做算术部分,有人做电子琴,有人做涂鸦,还有人做动画界面,还有人收集材料,总之,最后通过加载窗体的方式攒出来了一个程序。我们美名曰这个过程叫做团队合作开发~
初步学习了三层之后才晓得这只是把一个人的工作分给了多个人来干,团队合作效率非常差,而且程序运行非常不和谐,就好像一件上衣,两个人做袖子,一个人做领子,还有一个人做中间部分,最后缝到一起。当袖子出了问题,就得把线拆掉,然后重新做袖子,做袖子的人还要一段段的找袖子的哪部分出了问题,做好之后,还要继续缝到上衣中。至于最后上衣的样子就不用说了。而且程序部分都是各做各的,没有任何规范可言。
那么,我们初步认识一下三层: 如果把项目暂且分成三层,UI层、DAL层、BLL层,如下图的三者的联系:
1、表示层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。
当然下图中也有一个Entity实体类,他在三层中并不是作为一层而存在的,而是作为一个类库,起到封装的作用,带着参数像血液一样流走与三层之间,谁需要就给谁,这是我的理解。
到底为什么要分层呢?因为分层具备的优点:
1、分工就明确多了,各人只需要关注自己的那一层,这样就可以根据工作人员各自的优势来分工,有助于提高效率。
2、代码就规范多了,各人根据UML图或者文档提供的资料,进行统一的规范。
3、层次清晰,利于维护。
4、高内聚,低耦合。
........
二、那么下面我贴出一个简单的登录系统的代码,通过三层和Vb.net实现
'实体类,映射数据库
Public Class UserInfo
#Region "定义数据表中各个属性变量"
Private strUserName As String
Private strPassword As String
#End Region
#Region "定义数据表中各个属性"
''' <summary>
''' 用户名
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks>2012年1月10日 08:57 by JYH</remarks>
Public Property userName() As String
Get
Return strUserName
End Get
Set(ByVal value As String)
strUserName = value
End Set
End Property
''' <summary>
''' 密码
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks>2012年1月10日 09:01 by JYH</remarks>
Public Property password() As String
Get
Return strPassword
End Get
Set(ByVal value As String)
strPassword = value
End Set
End Property
#End Region
End Class
'数据访问层
Imports System.Data.SqlClient
Imports Entity.UserInfo
Public Class da_UserInfo
'连接数据库的语句:
Private connStr As String = "server=192.168.24.222;database=charge3_sys;uid = sa;pwd=123456"
'获得一条数据
Public Function GetDataRow(ByVal EntityUserInfo As Entity.UserInfo) As Entity.UserInfo
Dim sql As String = "select * from UserInfo where UserName='" & EntityUserInfo.userName & "'"
Dim conn As SqlConnection = New SqlConnection(connStr)
Dim cmd As SqlCommand = New SqlCommand(sql, conn)
Dim sdr As SqlDataReader = Nothing
Dim UserDataTable As DataTable = New DataTable()
Dim ds As New DataSet
Dim dap As SqlDataAdapter = New SqlDataAdapter(cmd)
Dim EntityUserInfo1 As New Entity.UserInfo
Try
conn.Open()
dap.Fill(ds)
Dim dr As DataRow = ds.Tables(0).Rows(0)
EntityUserInfo1.userName = dr("UserName")
EntityUserInfo1.password = dr("Password")
Return EntityUserInfo1
Catch ex As Exception
EntityUserInfo1.password = ""
Return EntityUserInfo1
Finally
If Not IsNothing(conn) Then
conn.Close()
End If
End Try
End Function
End Class
'业务逻辑层
Imports Entity
Imports DAL.da_UserInfo
Public Class b_userInfo
'判断密码是否正确
Public Function Check(ByVal EntityUserInfo As Entity.UserInfo) As Boolean
Dim DALUserInfo As New DAL.da_UserInfo
Dim EntityUserInfo2 As New Entity.UserInfo
EntityUserInfo2.userName = EntityUserInfo.userName
EntityUserInfo2 = DALUserInfo.GetDataRow(EntityUserInfo2)
If Trim(EntityUserInfo2.password) = Trim(EntityUserInfo.password) Then
Return True
Else
Return False
End If
End Function
End Class
'UI层,窗体代码
Imports Entity
Imports BLL
Public Class frmLogin
Public LoginOk As Boolean = False
Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
Me.Close()
End Sub
Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
If Trim(txtUserName.Text) = "" Or Trim(txtPassword.Text) = "" Then
MsgBox("请填写完整信息!")
Exit Sub
End If
Dim EntityUserInfo As New Entity.UserInfo
Dim BLLUserInfo As New BLL.b_userInfo
EntityUserInfo.userName = txtUserName.Text
EntityUserInfo.password = txtPassword.Text
If BLLUserInfo.Check(EntityUserInfo) Then
MsgBox("登录成功")
gbLoginOk = True
Me.Close()
Else
MsgBox("输入错误,请重新输入!")
Exit Sub
End If
End Sub
Private Sub frmTest_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
Charg.frmMain.Show()
If LoginOk = False Then End
End Sub
End Class