إعادة البناء إلى الطبقة n
-
03-07-2019 - |
سؤال
أنا مبرمج 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، ستكون على بعد خطوة واحدة من منصة جديدة كاملة.