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

本文详细解析了MVC架构的概念及其在软件开发中的应用,包括界面层、业务逻辑层、数据访问层的具体职责及工作流程,并以添加用户为例展示了三层架构的实际运用,确保软件满足用户需求的同时具备高可维护性和可扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

下面以添加用户为例:

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

  1. ImportsBll
  2. ImportsEntity
  3. PublicClassFrmAddUser
  4. '实例化B层添加用户类
  5. PrivateBAddUserAsNewBllAddUser
  6. '实例化用户信息实体
  7. PrivateEUserInfoAsNewUserInfo
  8. PrivateSubbtnOK_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnOK.Click
  9. '判断用户名文本框的输入是否为空
  10. IftxtUserName.Text=""Then
  11. MsgBox("用户名不能为空",vbOKOnly+vbExclamation,"警告")
  12. ExitSub
  13. EndIf
  14. '判断密码文本框的输入是否为空
  15. IftxtPwd.Text=""Then
  16. MsgBox("密码不能为空",vbOKOnly+vbExclamation,"警告")
  17. ExitSub
  18. EndIf
  19. '判断是否已经选择了用户级别
  20. IfcmbLevel.Text=""Then
  21. MsgBox("请选择用户级别",vbOKOnly+vbExclamation,"警告")
  22. ExitSub
  23. EndIf
  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. IfBAddUser.AddUser(EUserInfo)Then
  32. MsgBox("添加成功")
  33. Else
  34. MsgBox("未添加成功")
  35. EndIf
  36. CatchexAsException
  37. MsgBox(ex.Message)
  38. EndTry
  39. '添加后清空文本框
  40. txtUserName.Text=""
  41. txtPwd.Text=""
  42. cmbLevel.Text=""
  43. EndSub

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

ImportsDAL

  1. ImportsEntity
  2. PublicClassBllAddUser
  3. '实例化用户信息实体
  4. PrivateEUserInfoAsNewUserInfo
  5. '实例化D层的操作用户信息
  6. PrivateDUserInfoAsNewDalUserInfo
  7. '''<summary>
  8. '''添加用户
  9. '''</summary>
  10. '''<paramname="EUserInfo"></param>
  11. '''<returns></returns>
  12. '''<remarks></remarks>
  13. PublicFunctionAddUser(ByValEUserInfoAsUserInfo)AsBoolean
  14. DimxAsBoolean=False
  15. IfDUserInfo.Check(EUserInfo.strUserName)Then
  16. ThrowNewException("该用户已经存在")
  17. Else
  18. x=DUserInfo.Insert(EUserInfo)
  19. Returnx
  20. EndIf
  21. EndFunction


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

  1. ImportsSystem.Data.SqlClient
  2. ImportsEntity
  3. '''<summary>
  4. '''对用户表的操作
  5. '''</summary>
  6. '''<remarks></remarks>
  7. PublicClassDalUserInfo
  8. PrivateconnStrAsString=Configuration.ConfigurationSettings.AppSettings("connStr")
  9. '''<summary>
  10. '''检查用户是否存在
  11. '''</summary>
  12. '''<paramname="strUserName"></param>
  13. '''<returns></returns>
  14. '''<remarks></remarks>
  15. PublicFunctionCheck(ByValstrUserNameAsString)AsBoolean
  16. DimsqlAsString="select*fromuser_Infowhereuser_Name=@userName"
  17. DimconnAsNewSqlConnection(connStr)
  18. DimcmdAsNewSqlCommand(sql,conn)
  19. DimsqlparamAsNewSqlParameter("@userName",SqlDbType.NChar)
  20. sqlparam.Value=strUserName
  21. cmd.Parameters.Add(sqlparam)
  22. DimsdrAsSqlDataReader=Nothing
  23. Try
  24. conn.Open()
  25. sdr=cmd.ExecuteReader()
  26. Ifsdr.ReadThen
  27. ReturnTrue
  28. Else
  29. ReturnFalse
  30. EndIf
  31. CatchexAsException
  32. ReturnFalse
  33. Finally
  34. IfNotIsNothing(conn)Then
  35. conn.Close()
  36. conn=Nothing
  37. EndIf
  38. IfNotIsNothing(sdr)Then
  39. sdr.Close()
  40. sdr=Nothing
  41. EndIf
  42. IfNotIsNothing(cmd)Then
  43. cmd.Dispose()
  44. cmd=Nothing
  45. EndIf
  46. EndTry
  47. EndFunction
  48. '''<summary>
  49. '''插入一条用户记录
  50. '''</summary>
  51. '''<paramname="EUserInfo"></param>
  52. '''<returns></returns>
  53. '''<remarks></remarks>
  54. PublicFunctionInsert(ByValEUserInfoAsUserInfo)AsBoolean
  55. DimsqlAsString="insertintouser_Infovalues(@userName,@userPwd,@userLevel,@userHead)"
  56. DimconnAsNewSqlConnection(connStr)
  57. DimcmdAsNewSqlCommand(sql,conn)
  58. Dimsqlparam1AsNewSqlParameter("@userName",SqlDbType.NChar)
  59. sqlparam1.Value=EUserInfo.strUserName
  60. cmd.Parameters.Add(sqlparam1)
  61. Dimsqlparam2AsNewSqlParameter("@userPwd",SqlDbType.NChar)
  62. sqlparam2.Value=EUserInfo.EuserPwd
  63. cmd.Parameters.Add(sqlparam2)
  64. Dimsqlparam3AsNewSqlParameter("@userLevel",SqlDbType.NChar)
  65. sqlparam3.Value=EUserInfo.EuserLevel
  66. cmd.Parameters.Add(sqlparam3)
  67. Dimsqlparam4AsNewSqlParameter("@userHead",SqlDbType.NChar)
  68. sqlparam4.Value=EUserInfo.EuserHead
  69. cmd.Parameters.Add(sqlparam4)
  70. Try
  71. conn.Open()
  72. Returncmd.ExecuteNonQuery
  73. CatchexAsException
  74. ReturnFalse
  75. Finally
  76. IfNotIsNothing(conn)Then
  77. conn.Close()
  78. conn=Nothing
  79. EndIf
  80. IfNotIsNothing(cmd)Then
  81. cmd.Dispose()
  82. cmd=Nothing
  83. EndIf
  84. EndTry
  85. EndFunction
  86. EndClass


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

  1. '''<summary>
  2. '''用户表
  3. '''</summary>
  4. '''<remarks></remarks>
  5. PublicClassUserInfo
  6. PublicstrUserNameAsString
  7. PrivatestrUserPwdAsString
  8. PrivatestrUserLevelAsString
  9. PrivatestrUserHeadAsString
  10. PublicPropertyEuserPwdAsString
  11. Get
  12. ReturnstrUserPwd
  13. EndGet
  14. Set(ByValvalueAsString)
  15. strUserPwd=value
  16. EndSet
  17. EndProperty
  18. PublicPropertyEuserLevelAsString
  19. Get
  20. ReturnstrUserLevel
  21. EndGet
  22. Set(ByValvalueAsString)
  23. strUserLevel=value
  24. EndSet
  25. EndProperty
  26. PublicPropertyEuserHeadAsString
  27. Get
  28. ReturnstrUserHead
  29. EndGet
  30. Set(ByValvalueAsString)
  31. strUserHead=value
  32. EndSet
  33. EndProperty
  34. EndClass


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值