سؤال

أنا مبرمج 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 فئات مختلفة (انظر أدناه). والسبب الرئيسي لذلك هو "فصل الاهتمامات" من حيث المبدأ، أي واجهة المستخدم الرسومية قلقة فقط مع الأشياء واجهة المستخدم الرسومية، وطبقة بيز المنطق هي المعنية فقط مع قواعد العمل، وطبقة الوصول إلى البيانات قلقة فقط مع تمثيل البيانات. هذا يسمح لكل طبقة إلى الإبقاء بشكل مستقل وإعادة استخدامها عبر تطبيقات:

'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 طالما)

strsql = "select * from tblCustomers حيث id =" & currentcustomerid set rec1 = globaldatabase.openrecordset (strsql) نتيجة = 1

إذا rec1.RecordCount> 0 ثم getCustomer = rec1 آخر getCustomer = false endif end وظيفة

  • إنشاء وظيفة منطق الأعمال:

وظيفة getCustomerDiscount (معرف العميل طويل)

العميل = getCustomer(معرف العميل)

res = 1 إذا كان العميل ثم العميل ("الفئة") = 1) ثم res = .9 Endif Endif

getcustomerdiscount = res

وظيفة النهاية

  • ثم قم بتغيير الزر:

sub cmdmultiplier_click () pricemultiplier = getCustomerDiscount (CurrentCustomerId) نهاية Sub

وعادة ما سيكون لديك كود UI عن الاستجابة للأحداث التي أثيرت من قبل المستخدم، في هذه الحالة انقر زر.

وبعد ذلك انها حقا يتوقف على كيفية تصميم البرنامج، وتصميم أبسط سيكون مرجع مثيل العملاء وسوف تحتوي على خاصية مضاعف. يتم تعبئة الكائن عميلك من البيانات في 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؟

إحدى طرق القيام بذلك للحفاظ على قاعدة التعليمات البرمجية الموجودة لديك هي ترميز طبقة البيانات وBR في VB.Net.ثم قم بكشف BR من خلال واجهة COM (هذا خيار خانة الاختيار في المشروع).يمكنك بعد ذلك استخدام BR الجديد من واجهتك الحالية.

بمجرد الانتهاء من جميع BR وDAL، ستكون على بعد خطوة واحدة من منصة جديدة كاملة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top