灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3538回复:0

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

楼主#
更多 发布于:2011-12-30 17:58
系统架构就是系统的骨骼,如果骨骼没有设计好,做出来的软件也会是畸形,怎样的架构才是合理的,怎样的架构才能造就一个健康的软件,那么健康的软件是什么样的?首先要满足用户需求,其次要有可修改性、灵活性、可维护性,也就是当用户需求改变时,尽量少更改已经封装好的东西,而且还要达到目的,这样的要求传统的面向过程的编码方式是很难实现的,而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  


喜欢0 评分0
游客

返回顶部