重构为n层

时间:2008-10-22 22:16:57

标签: database vb6 n-tier-architecture dao

我是一名使用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层。

4 个答案:

答案 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之后,您将进入一个完整的新平台。