-
03-07-2019 - |
题
我是一名自学的 vb6 程序员,使用 DAO。下面是我可以编写的一段典型代码的示例:
Sub cmdMultiplier_Click() 'Button on form, user interface '
dim Rec1 as recordset
dim strSQL as string
strSQL = "select * from tblCustomers where ID = " & CurrentCustomerID 'inline SQL '
set rec1 = GlobalDataBase.openrecordset(strSQL) ' Data access '
if rec1.bof <> true or rec1.eof <> true then
if rec1.fields("Category").value = 1 then
PriceMultiplier = 0.9 ' Business Logic '
else
priceMultiplier = 1
end if
end if
End Sub
请假装上面是一个 CRUD 应用程序的完整源代码。我知道这个设计很糟糕,所有东西都混在一起了。理想情况下,它应该具有三个不同的层,用户界面,业务逻辑和数据访问。我有点明白了为什么这是可取的,但我不知道它是如何完成的,我怀疑这就是为什么我不完全了解为什么这样的分离是好的。我认为,如果有人可以将上述荒谬的琐碎例子重构为3层,我会走得更远。
解决方案
一个简单的例子,是的,但是有了所有的基本元素 - 它们只属于3个不同的类(见下文)。其主要原因是“关注点分离”。原则,即GUI仅涉及GUI事物,Biz Logic层仅涉及业务规则,而数据访问层仅涉及数据表示。这允许每个层独立维护并跨应用程序重用:
'in Form class - button handler
Sub cmdMultiplier_Click()
PriceMultiplier = ComputePriceMultiplier(CurrentCustomerId)
End Sub
'in Biz Logic class
Function ComputePriceMultiplier(custId as Integer) as Double
Dim cust as Customer = GetCustomer(custId)
if cust.Category = 1 then 'please ignore magic number, real code uses enums
return 0.9
end if
return 1
End Function
'in Data Access Layer class
Function GetCustomer(custId as Integer) as Customer
Dim cust as Customer = New Customer 'all fields/properties to default values
Dim strSQL as String = "select * from tblCustomers where ID = " & custId
set rec1 = GlobalDataBase.openrecordset(strSQL) ' Data access '
if rec1.bof <> true or rec1.eof <> true then
cust.SetPropertiesFromRecord(rec1)
end if
return cust
End Function
['真正的'应用程序将缓存当前客户,具有客户查询的常量或存储过程等;为简洁而忽略]
将这与你原来的一切按钮处理程序示例(这在VB代码中非常常见,因为它很容易这样做)对比 - 如果你需要另一个应用程序中的价格乘数规则,您必须将代码复制,粘贴和编辑到该应用程序的按钮处理程序中。现在有两个地方可以维护相同的业务规则,还有两个地方可以执行相同的客户查询。
其他提示
该按钮的用途是什么?
我的第一步是:
- 提取访问数据库的部分。(警告:前面有航空代码)
函数 getCustomer(CurrentCustomerID as Long)
strsql =“从tblcustomers中选择 * id =”&CurrentCustomerId Set rec1 = globalDatabase.openrecordset(strsql)结果= 1
如果rec1.recordCount> 0,则getCustomer = rec1 else getCustomer = false Endif Endif End函数
- 编写业务逻辑函数:
函数 getCustomerDiscount(customerID as Long)
客户 = getCustomer(客户ID)
res = 1如果客户,则如果客户(“类别”)= 1),然后res = .9 endif endif
获取客户折扣 = res
结束函数
- 然后,更改按钮:
sub cmdmultipliper_click()pricemultipliper = getCustomerDiscount(currentCustomerId)end sub sub
通常,您的UI代码会响应用户引发的事件,在本例中为Button Click。
之后,它实际上取决于程序的设计方式,最基本的设计是引用Customer实例,它将包含乘数属性。 您的客户对象将从DAL中的数据填充。
UI的验证将进入UI层,业务验证规则可以进入您的业务对象,然后您的DAL就是您的持久层。
这是一个非常基本的伪代码示例:
btnClick
Dim Cust as New Customer(ID)
multplr = Cust.DiscountMultiplier
End Click
Class Customer
Sub New(ID)
Data = DAL.GetCustomerData(ID)
Me.Name = Data("Name")
Me.Address = Data("Address")
Me.DiscountMultiplier = Data("DiscountMultiplier")
End Sub
Property ID
Property Name
Property Address
Property DiscountMultiplier
Return _discountMultiplier
End
End Class
Class DAL
Function GetCustomerData(ID)
SQL = "Paramaterized SQL"
Return Data
End Function
End Class
知道如何重构是一件好事。从现在开始,您将了解如何分层。
但是,我认为您花费更多时间来升级您正在使用的工具。您是否考虑过使用VB.Net进行此操作?
一种方法是保留现有的代码库,即在VB.Net中编写数据层和BR的代码。然后通过COM接口公开BR(这是项目中的复选框选项)。然后,您可以使用当前界面中的新BR。
完成所有BR和DAL之后,您将进入一个完整的新平台。