怎样才能开发出好的软件

22 篇文章 0 订阅

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

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

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

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

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

 

下面以添加用户为例:

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

  1. Imports Bll  
  2. Imports Entity  
  3. Public Class FrmAddUser  
  4.     '实例化B层添加用户类   
  5.     Private BAddUser As New BllAddUser  
  6.     '实例化用户信息实体   
  7.     Private EUserInfo As New UserInfo  
  8.     Private Sub btnOK_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles btnOK.Click  
  9.         '判断用户名文本框的输入是否为空   
  10.         If txtUserName.Text = "" Then  
  11.             MsgBox("用户名不能为空", vbOKOnly + vbExclamation, "警告")  
  12.             Exit Sub  
  13.         End If  
  14.         '判断密码文本框的输入是否为空   
  15.         If txtPwd.Text = "" Then  
  16.             MsgBox("密码不能为空", vbOKOnly + vbExclamation, "警告")  
  17.             Exit Sub  
  18.         End If  
  19.         '判断是否已经选择了用户级别   
  20.         If cmbLevel.Text = "" Then  
  21.             MsgBox("请选择用户级别", vbOKOnly + vbExclamation, "警告")  
  22.             Exit Sub  
  23.         End If  
  24.         '给实体的每个字段赋值   
  25.         EUserInfo.strUserName = txtUserName.Text.ToString  
  26.         EUserInfo.EuserPwd = txtPwd.Text  
  27.         EUserInfo.EuserLevel = cmbLevel.Text  
  28.         EUserInfo.EuserHead = FrmLogin.strUserName  
  29.         '执行添加用户   
  30.         Try  
  31.             If BAddUser.AddUser(EUserInfo) Then  
  32.                 MsgBox("添加成功")  
  33.             Else  
  34.                 MsgBox("未添加成功")  
  35.             End If  
  36.         Catch ex As Exception  
  37.             MsgBox(ex.Message)  
  38.         End Try  
  39.         '添加后清空文本框   
  40.         txtUserName.Text = ""  
  41.         txtPwd.Text = ""  
  42.         cmbLevel.Text = ""  
  43.     End Sub  

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

  1. Imports DAL  
  2. Imports Entity  
  3. Public Class BllAddUser  
  4.     '实例化用户信息实体   
  5.     Private EUserInfo As New UserInfo  
  6.     '实例化D层的操作用户信息   
  7.     Private DUserInfo As New DalUserInfo  
  8.     ''' <summary>   
  9.     ''' 添加用户   
  10.     ''' </summary>   
  11.     ''' <param name="EUserInfo"></param>   
  12.     ''' <returns></returns>   
  13.     ''' <remarks></remarks>   
  14.     Public Function AddUser(ByVal EUserInfo As UserInfo) As Boolean  
  15.         Dim x As Boolean = False  
  16.         If DUserInfo.Check(EUserInfo.strUserName) Then  
  17.             Throw New Exception("该用户已经存在")  
  18.         Else  
  19.             x = DUserInfo.Insert(EUserInfo)  
  20.             Return x  
  21.         End If  
  22. End Function  


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

  1. Imports System.Data.SqlClient  
  2. Imports Entity  
  3. ''' <summary>   
  4. ''' 对用户表的操作   
  5. ''' </summary>   
  6. ''' <remarks></remarks>   
  7.   
  8. Public Class DalUserInfo  
  9.   
  10. Private connStr As String = Configuration.ConfigurationSettings.AppSettings("connStr")  
  11.   
  12.     ''' <summary>   
  13.     ''' 检查用户是否存在   
  14.     ''' </summary>   
  15.     ''' <param name="strUserName"></param>   
  16.     ''' <returns></returns>   
  17.     ''' <remarks></remarks>   
  18.     Public Function Check(ByVal strUserName As StringAs Boolean  
  19.         Dim sql As String = "select * from user_Info where user_Name=@userName"  
  20.         Dim conn As New SqlConnection(connStr)  
  21.         Dim cmd As New SqlCommand(sql, conn)  
  22.         Dim sqlparam As New SqlParameter("@userName", SqlDbType.NChar)  
  23.         sqlparam.Value = strUserName  
  24.         cmd.Parameters.Add(sqlparam)  
  25.         Dim sdr As SqlDataReader = Nothing  
  26.         Try  
  27.             conn.Open()  
  28.             sdr = cmd.ExecuteReader()  
  29.             If sdr.Read Then  
  30.                 Return True  
  31.             Else  
  32.                 Return False  
  33.             End If  
  34.         Catch ex As Exception  
  35.             Return False  
  36.         Finally  
  37.             If Not IsNothing(conn) Then  
  38.                 conn.Close()  
  39.                 conn = Nothing  
  40.             End If  
  41.             If Not IsNothing(sdr) Then  
  42.                 sdr.Close()  
  43.                 sdr = Nothing  
  44.             End If  
  45.             If Not IsNothing(cmd) Then  
  46.                 cmd.Dispose()  
  47.                 cmd = Nothing  
  48.             End If  
  49.         End Try  
  50.     End Function  
  51.   
  52.   
  53.     ''' <summary>   
  54.     ''' 插入一条用户记录   
  55.     ''' </summary>   
  56.     ''' <param name="EUserInfo"></param>   
  57.     ''' <returns></returns>   
  58.     ''' <remarks></remarks>   
  59.     Public Function Insert(ByVal EUserInfo As UserInfo) As Boolean  
  60.         Dim sql As String = "insert into user_Info values (@userName,@userPwd,@userLevel,@userHead)"  
  61.         Dim conn As New SqlConnection(connStr)  
  62.         Dim cmd As New SqlCommand(sql, conn)  
  63.         Dim sqlparam1 As New SqlParameter("@userName", SqlDbType.NChar)  
  64.         sqlparam1.Value = EUserInfo.strUserName  
  65.         cmd.Parameters.Add(sqlparam1)  
  66.         Dim sqlparam2 As New SqlParameter("@userPwd", SqlDbType.NChar)  
  67.         sqlparam2.Value = EUserInfo.EuserPwd  
  68.         cmd.Parameters.Add(sqlparam2)  
  69.         Dim sqlparam3 As New SqlParameter("@userLevel", SqlDbType.NChar)  
  70.         sqlparam3.Value = EUserInfo.EuserLevel  
  71.         cmd.Parameters.Add(sqlparam3)  
  72.         Dim sqlparam4 As New SqlParameter("@userHead", SqlDbType.NChar)  
  73.         sqlparam4.Value = EUserInfo.EuserHead  
  74.         cmd.Parameters.Add(sqlparam4)  
  75.         Try  
  76.             conn.Open()  
  77.             Return cmd.ExecuteNonQuery  
  78.         Catch ex As Exception  
  79.             Return False  
  80.         Finally  
  81.             If Not IsNothing(conn) Then  
  82.                 conn.Close()  
  83.                 conn = Nothing  
  84.             End If  
  85.             If Not IsNothing(cmd) Then  
  86.                 cmd.Dispose()  
  87.                 cmd = Nothing  
  88.             End If  
  89.         End Try  
  90. End Function  
  91. End Class  


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

  1. ''' <summary>   
  2. ''' 用户表   
  3. ''' </summary>   
  4. ''' <remarks></remarks>   
  5. Public Class UserInfo  
  6.     Public strUserName As String  
  7.     Private strUserPwd As String  
  8.     Private strUserLevel As String  
  9.     Private strUserHead As String  
  10.       
  11.     Public Property EuserPwd As String  
  12.         Get  
  13.             Return strUserPwd  
  14.         End Get  
  15.         Set(ByVal value As String)  
  16.             strUserPwd = value  
  17.         End Set  
  18.     End Property  
  19.   
  20.     Public Property EuserLevel As String  
  21.         Get  
  22.             Return strUserLevel  
  23.         End Get  
  24.         Set(ByVal value As String)  
  25.             strUserLevel = value  
  26.         End Set  
  27.     End Property  
  28.   
  29.     Public Property EuserHead As String  
  30.         Get  
  31.             Return strUserHead  
  32.         End Get  
  33.         Set(ByVal value As String)  
  34.             strUserHead = value  
  35.         End Set  
  36.     End Property  
  37. End Class  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值