我是一名使用DAO的自学vb6程序员。下面是我可以制作的典型代码示例:
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层。
答案 0 :(得分: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代码中非常常见,因为这样做很容易) - 如果你需要另一个应用程序中的价格乘数规则,您必须将代码复制,粘贴和编辑到该应用程序的按钮处理程序中。现在有两个地方可以维护相同的业务规则,还有两个地方可以执行相同的客户查询。
答案 1 :(得分:1)
按钮的用途是什么?
我的第一步是:
function getCustomer(CurrentCustomerID as Long)
strSQL =“select * from tblCustomers where ID =”&amp; CurrentCustomerID set rec1 = GlobalDataBase.openrecordset(strSQL) 结果= 1
如果rec1.recordcount&gt; 0则 getCustomer = rec1 其他 getCustomer = false 万一 结束功能
function getCustomerDiscount(customerID as Long)
customer = getCustomer(customerID)
res = 1 如果顾客那么 如果客户(“类别”)= 1)那么 res = .9 万一 ENDIF
getcustomerdiscount = res
结束功能
Sub cmdMultiplier_Click() pricemultiplier = getcustomerdiscount(currentcustomerid) 结束子
答案 2 :(得分:1)
通常,您的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
答案 3 :(得分:1)
知道如何重构是一件好事。从现在开始,您将了解如何分层 但是,我认为您花费更多时间来升级您正在使用的工具。您是否考虑过使用VB.Net进行此操作?
一种方法是保留现有的代码库,即在VB.Net中编写数据层和BR的代码。然后通过COM接口公开BR(这是项目中的复选框选项)。然后,您可以使用当前界面中的新BR。
完成所有BR和DAL之后,您将进入一个完整的新平台。