1

私は、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 つの異なるレイヤーが必要です。これが望ましい理由はなんとなくわかりますが、それがどのように行われるのかはわかりません。そのため、そのような分離が良い理由を完全には理解していないのではないかと思います. 誰かが上記のばかばかしいほど些細な例を 3 層にリファクタリングできれば、私はずっと先のことになると思います。

4

4 に答える 4

3

些細な例ですが、すべての基本要素を備えています。それらは 3 つの異なるクラスに属しています (以下を参照)。これの主な理由は、「関心の分離」の原則です。つまり、GUI は GUI の事柄のみに関係し、ビジネス ロジック レイヤーはビジネス ルールにのみ関係し、データ アクセス レイヤーはデータ表現にのみ関係します。これにより、各レイヤーを独立して維持し、アプリケーション間で再利用できます。

'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 コードでは非常に簡単に実行できるため、ひどく一般的です) と比較してください。別のアプリケーションで価格乗数ルールが必要な場合は、次のようにします。そのアプリケーションのボタン ハンドラにコードをコピー、貼り付け、編集する必要があります。これで、同じビジネス ルールを維持する 2 つの場所と、同じ顧客クエリが実行された 2 つの場所ができます。

于 2008-10-23T02:36:43.980 に答える
1

通常、UIコードは、ユーザーが発生したイベント(この場合はボタンクリック)に応答します。

その後は、プログラムの設計方法によって異なります。最も基本的な設計は、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
于 2008-10-23T00:48:58.580 に答える
1

リファクタリングの方法を知っていることは良いことです。これから、レイヤーを分離する方法を学びます。
ただし、同時に使用しているツールをアップグレードするために時間を費やす方がよいと思います。VB.Net でそれを行うことを検討していますか?

それを行う方法は、VB.Net でデータ層と BR をコーディングすることです。次に、COM インターフェイスを介して BR を公開します (これは、プロジェクトのチェック ボックス オプションです)。その後、現在のインターフェースから新しい BR を使用できます。

すべての BR と DAL が完了すると、完全な新しいプラットフォームに一歩近づきます。

于 2008-10-23T03:33:57.563 に答える
1

ボタンの目的は何ですか?

私の最初のステップは次のとおりです。

  • データベースにアクセスしている部分を抽出します。(警告: 航空コードが先です)
function getCustomer(CurrentCustomerID as Long)

strSQL = "select * from tblCustomers where ID = " & CurrentCustomerID
set rec1 = GlobalDataBase.openrecordset(strSQL)
result = 1

if rec1.recordcount >0 then
    getCustomer = rec1
else
    getCustomer = false
endif
end function
  • ビジネス ロジック関数を構成します。
function getCustomerDiscount(customerID as Long)

customer = getCustomer(customerID)

res = 1
if customer then
    if customer("category")=1) then
        res = .9
    endif
endif

getcustomerdiscount = res

end function
  • 次に、ボタンを変更します。
Sub cmdMultiplier_Click() 
    pricemultiplier = getcustomerdiscount(currentcustomerid)
end sub
于 2008-10-22T22:29:29.110 に答える