2008-10-22 75 views
1

我是一位使用DAO的自學vb6程序員。下面是一個代碼典型件,我可以生產出的示例:重構爲n層

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層架構比一般的混雜代碼更簡單。 – workmad3 2008-10-22 22:30:22

+0

我知道你的意思,但我想看看它是如何完成的。考慮到這一點,我認爲分層可能會使數據庫規範化。在表面層面上,它似乎會增加複雜性而沒有任何獎勵 – kjack 2008-10-23 09:52:08

+0

是的,正常化數據庫是不合理的。喬治我認爲他有它(tm)! – 2008-10-23 15:56:48

回答

3

一個簡單的例子,是的,但所有的基本要素 - 他們只是屬於3個不同類別(見下文)。其主要原因是「關注點分離」原則,即GUI只涉及GUI事物,Biz邏輯層僅關注業務規則,而數據訪問層只涉及數據表示。這允許每個層被獨立地維護和跨應用程序重用:

'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

該按鈕的用途是什麼?

我的第一個步驟是:

  • 提取部分訪問數據庫。 (警告:空氣向前代碼)

功能GETCUSTOMER(CurrentCustomerID如龍)

STRSQL = & CurrentCustomerID 組REC1 = GlobalDataBase.openrecordset(STRSQL) 結果 「從tblCustomers其中ID =選擇*」= 1

如果rec1.recordcount> 0,那麼 GETCUSTOMER = REC1 否則 GETCUSTOMER =假 ENDIF 端功能

  • 構成業務邏輯函數:

功能getCustomerDiscount(CustomerID作爲龍)

顧客= GETCUSTOMER(的customerID)

RES = 1 如果顧客然後 如果客戶(」類別「)= 1)然後 res = .9 endif endif

getcustomerdiscount = RES

端功能

  • 然後,更改按鈕:

子cmdMultiplier_Click() pricemultiplier = getcustomerdiscount(currentcustomerid) 端子

+0

我忘了堅持按鈕的目的。也許在標籤上顯示乘數。謝謝你的回答,Stephen A. Lowe的回答更加豐富了一些,這對我來說更容易理解。 – kjack 2008-10-23 08:57:59

1

通常您讓你的UI代碼響應用戶提出的事件,在這種情況下,按鈕點擊。

之後,它真的取決於你的程序是如何設計的,最基本的設計是引用一個Customer實例,它將包含一個乘數屬性。 您的客戶對象由DAL中的數據填充。

用戶界面的驗證將進入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 
1

知道如何重構是件好事。從現在開始,您將知道如何分層。
但是,我認爲你的時間花在升級同時使用的工具上會更好。你有沒有考慮用VB.Net做到這一點?

一種方法可以保留你現有的代碼庫,在VB.Net中編寫數據層和BR代碼。然後通過COM接口公開BR(這是項目中的複選框選項)。然後,您可以使用當前界面中的新BR。

一旦所有的BR和DAL都完成了,您將離開一個完整的新平臺。