Frage

Ich bin ein Autodidakt VB6-Programmierer, der DAO verwendet. Unten ist ein Beispiel für ein typisches Stück Code, das ich Churn könnte:

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

Bitte vorgeben, dass die oben ist der gesamte Quellcode einer CRUD-Anwendung. Ich weiß, das Design ist schlecht, alles zusammen gemischt wird. Im Idealfall sollte es drei verschiedene Schichten, Benutzeroberfläche, Business-Logik  und Datenzugriff. Ich Art-of bekommen, warum dies wünschenswert ist, aber ich weiß nicht, wie es gemacht wird und ich vermute, deshalb habe ich nicht vollständig erhalten, warum eine solche Trennung ist gut. Ich denke, dass ich eine Menge würde weiter die Straße hinunter, wenn jemand die oben lächerlich Refactoring könnte triviales Beispiel in 3 Stufen.

War es hilfreich?

Lösung

ein triviales Beispiel, ja, aber mit allen grundlegenden Elemente - sie gehören nur in drei verschiedenen Klassen (siehe unten). Der Hauptgrund dafür ist das „Trennung von Bedenken“ -Prinzip, das heißt, die GUI ist nur mit GUI Dingen, die Biz Logikschicht mit den Geschäftsregeln nur besorgt, und die Datenzugriffsschicht ist nur mit Datendarstellungen handelt. Dies ermöglicht jede Schicht unabhängig und über Anwendungen wiederverwendet beibehalten werden:

'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

[a ‚echte‘ Anwendung würde den aktuellen Kunden-Cache, haben Konstanten oder gespeicherten Prozeduren für die Kundenanfrage, etc .; ignoriert der Kürze halber]

Kontrast dies mit Ihrem ursprünglichen alles-in-the-Button-Handler Beispiel (die erschreckend häufig in VB-Code ist, weil es so einfach ist es, so zu tun) - wenn Sie den Preis-Multiplikator Regel in einer anderen Anwendung benötigt, Sie müßten kopieren, einfügen und bearbeiten Sie den Code in die Button-Handler-Anwendung. Nun würde es zwei Orte, die gleiche Geschäftsregel zu halten und zwei Orte, an denen die gleiche Kunde Abfrage ausgeführt wurde.

Andere Tipps

Was ist der Zweck der Taste?

Meine erste Schritte seien:

  • extrahiert den Teil auf die Datenbank zugreifen. (Achtung: Luft Code voraus)

Funktion GetCustomer (CurrentCustomerID als Long)

strSQL = "select * from tblKunden wo ID =" & CurrentCustomerID set = REC1 GlobalDataBase.openrecordset (strSQL) Ergebnis = 1

Wenn rec1.recordcount> 0 then     GetCustomer = rec1 sonst     GetCustomer = false endif Ende Funktion

  • komponieren die Business-Logik-Funktion:

Funktion getCustomerDiscount (customerID als Long)

Kunde = GetCustomer (customerID)

res = 1 wenn der Kunde dann     wenn Kunden ( "Kategorie") = 1), dann         res = 0,9     endif endif

getcustomerdiscount = res

end function

  • Ändern Sie dann auf die Schaltfläche:

Unter cmdMultiplier_Click ()     pricemultiplier = getcustomerdiscount (currentcustomerid) end sub

Normalerweise werden Sie Ihren UI-Code müssen die Ereignisse durch den Benutzer angehoben reagiert, in diesem Fall auf die Schaltfläche klicken.

Danach ist es hängt wirklich davon ab, wie Sie Ihr Programm ist, das grundlegende Design wäre eine Kunde Instanz zu verweisen, und es wäre eine Multiplikator Eigenschaft enthalten. Ihr Kunde Objekt wird aus Daten in Ihrem DAL ausgefüllt.

Validierung für UI in UI-Ebene gehen würde, könnten Unternehmen Prüfregeln Ihr Business-Objekt gehen, und dann DAL ist Ihre Persistenz-Schicht.

Hier ist ein sehr einfaches Pseudo-Code-Beispiel:

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

Zu wissen, wie Refactoring ist eine gute Sache. Ab sofort werden Sie wissen, wie Schichten zu trennen.
Aber ich denke, Ihre Zeit besser verbringen werden die Werkzeuge, die Sie verwenden zur gleichen Zeit zu aktualisieren. Haben Sie halten es mit VB.Net zu tun?

Ein Weg, es zu tun, das Beibehalten der bestehende Code-Basis ist die Datenschicht und BR in VB.Net zu codieren. Dann die BR über COM-Schnittstelle zu belichten (dies ist ein Kontrollkästchen Option im Projekt). Anschließend können Sie die neue BR von der aktuellen Schnittstelle verwenden.

Wenn alle BR und DAL getan, werden Sie einen Schritt entfernt, um eine völlig neue Plattform sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top