怎样才能开发出好的软件(二)

 

        系统架构就是系统的骨骼,如果骨骼没有设计好,做出来的软件也会是畸形,怎样的架构才是合理的,怎样的架构才能造就一个健康的软件,那么健康的软件是什么样的?首先要满足用户需求,其次要有可修改性、灵活性、可维护性,也就是当用户需求改变时,尽量少更改已经封装好的东西,而且还要达到目的,这样的要求传统的面向过程的编码方式是很难实现的,而MVC三层架构就能实现这一切,V代表界面层,C代表业务逻辑层,M代表数据访问层。这个三层架构只是宏观意义上的三层,其实根据系统架构的需要可以分为更多层。除了这三层外还有一层是实体层,实体层对应着数据库中的表,每一张表映射为一个实体,下面介绍一下三层架构具体是什么样的:

1.      界面层只负责与用户交互,用户输入信息,在界面进行基本验证(是否为空、是否是数字等)将数据传到业务逻辑层,经过业务逻辑层处理后返回给界面层信息,界面将信息显示给用户。

2.      业务逻辑层负责接受界面的数据,进行业务处理(包括一些逻辑判断,计算等),需要数据库中的数据就调用数据访问层的方法,业务处理后给界面返回数据。

3.      数据访问层主要是一些操作数据库的类,查出的数据返回到业务逻辑层。

4.      实体层中每一个实体对应着数据库中的每一张表,实体类作为参数在三层之间传递。

 

下面以添加用户为例:

界面层(UI):当用户按下添加按钮后,首先检查输入框中的数据是否合法,然后将数据赋值给用户实体中的每个字段,调用B层的添加用户方法,将用户实体作为参数传递。

Imports Bll
Imports Entity
Public Class FrmAddUser
    '实例化B层添加用户类
    Private BAddUser As New BllAddUser
    '实例化用户信息实体
    Private EUserInfo As New UserInfo
    Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
        '判断用户名文本框的输入是否为空
        If txtUserName.Text = "" Then
            MsgBox("用户名不能为空", vbOKOnly + vbExclamation, "警告")
            Exit Sub
        End If
        '判断密码文本框的输入是否为空
        If txtPwd.Text = "" Then
            MsgBox("密码不能为空", vbOKOnly + vbExclamation, "警告")
            Exit Sub
        End If
        '判断是否已经选择了用户级别
        If cmbLevel.Text = "" Then
            MsgBox("请选择用户级别", vbOKOnly + vbExclamation, "警告")
            Exit Sub
        End If
        '给实体的每个字段赋值
        EUserInfo.strUserName = txtUserName.Text.ToString
        EUserInfo.EuserPwd = txtPwd.Text
        EUserInfo.EuserLevel = cmbLevel.Text
        EUserInfo.EuserHead = FrmLogin.strUserName
        '执行添加用户
        Try
            If BAddUser.AddUser(EUserInfo) Then
                MsgBox("添加成功")
            Else
                MsgBox("未添加成功")
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        '添加后清空文本框
        txtUserName.Text = ""
        txtPwd.Text = ""
        cmbLevel.Text = ""
    End Sub

业务逻辑层(Bll):首先判断界面传进来的用户实体是否已经存在(调用D层操作用户表中的检查用户方法),如果已经存在则抛出异常,如果不存在则向用户表中插入该用户实体(调用D层的操作用户表中的插入方法)。

Imports DAL
Imports Entity
Public Class BllAddUser
    '实例化用户信息实体
    Private EUserInfo As New UserInfo
    '实例化D层的操作用户信息
    Private DUserInfo As New DalUserInfo
    ''' <summary>
    ''' 添加用户
    ''' </summary>
    ''' <param name="EUserInfo"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function AddUser(ByVal EUserInfo As UserInfo) As Boolean
        Dim x As Boolean = False
        If DUserInfo.Check(EUserInfo.strUserName) Then
            Throw New Exception("该用户已经存在")
        Else
            x = DUserInfo.Insert(EUserInfo)
            Return x
        End If
End Function


数据访问层(Dal):对数据库的操作,与数据库的连接字符串放在app.configer文件中,方便更换。其中的两个方法分别是检查数据库中是否存在某个用户,想数据库中用户表中插入一条记录。

Imports System.Data.SqlClient
Imports Entity
''' <summary>
''' 对用户表的操作
''' </summary>
''' <remarks></remarks>

Public Class DalUserInfo

Private connStr As String = Configuration.ConfigurationSettings.AppSettings("connStr")

    ''' <summary>
    ''' 检查用户是否存在
    ''' </summary>
    ''' <param name="strUserName"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Check(ByVal strUserName As String) As Boolean
        Dim sql As String = "select * from user_Info where user_Name=@userName"
        Dim conn As New SqlConnection(connStr)
        Dim cmd As New SqlCommand(sql, conn)
        Dim sqlparam As New SqlParameter("@userName", SqlDbType.NChar)
        sqlparam.Value = strUserName
        cmd.Parameters.Add(sqlparam)
        Dim sdr As SqlDataReader = Nothing
        Try
            conn.Open()
            sdr = cmd.ExecuteReader()
            If sdr.Read Then
                Return True
            Else
                Return False
            End If
        Catch ex As Exception
            Return False
        Finally
            If Not IsNothing(conn) Then
                conn.Close()
                conn = Nothing
            End If
            If Not IsNothing(sdr) Then
                sdr.Close()
                sdr = Nothing
            End If
            If Not IsNothing(cmd) Then
                cmd.Dispose()
                cmd = Nothing
            End If
        End Try
    End Function


    ''' <summary>
    ''' 插入一条用户记录
    ''' </summary>
    ''' <param name="EUserInfo"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Insert(ByVal EUserInfo As UserInfo) As Boolean
        Dim sql As String = "insert into user_Info values (@userName,@userPwd,@userLevel,@userHead)"
        Dim conn As New SqlConnection(connStr)
        Dim cmd As New SqlCommand(sql, conn)
        Dim sqlparam1 As New SqlParameter("@userName", SqlDbType.NChar)
        sqlparam1.Value = EUserInfo.strUserName
        cmd.Parameters.Add(sqlparam1)
        Dim sqlparam2 As New SqlParameter("@userPwd", SqlDbType.NChar)
        sqlparam2.Value = EUserInfo.EuserPwd
        cmd.Parameters.Add(sqlparam2)
        Dim sqlparam3 As New SqlParameter("@userLevel", SqlDbType.NChar)
        sqlparam3.Value = EUserInfo.EuserLevel
        cmd.Parameters.Add(sqlparam3)
        Dim sqlparam4 As New SqlParameter("@userHead", SqlDbType.NChar)
        sqlparam4.Value = EUserInfo.EuserHead
        cmd.Parameters.Add(sqlparam4)
        Try
            conn.Open()
            Return cmd.ExecuteNonQuery
        Catch ex As Exception
            Return False
        Finally
            If Not IsNothing(conn) Then
                conn.Close()
                conn = Nothing
            End If
            If Not IsNothing(cmd) Then
                cmd.Dispose()
                cmd = Nothing
            End If
        End Try
End Function
End Class


实体层:表中的字段都是私有的属性,他们的值的读写是通过属性过程来完成的。

''' <summary>
''' 用户表
''' </summary>
''' <remarks></remarks>
Public Class UserInfo
    Public strUserName As String
    Private strUserPwd As String
    Private strUserLevel As String
    Private strUserHead As String
    
    Public Property EuserPwd As String
        Get
            Return strUserPwd
        End Get
        Set(ByVal value As String)
            strUserPwd = value
        End Set
    End Property

    Public Property EuserLevel As String
        Get
            Return strUserLevel
        End Get
        Set(ByVal value As String)
            strUserLevel = value
        End Set
    End Property

    Public Property EuserHead As String
        Get
            Return strUserHead
        End Get
        Set(ByVal value As String)
            strUserHead = value
        End Set
    End Property
End Class



  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 39
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值