我是一名自学的 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之后,您将进入一个完整的新平台。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top