السلام عليكم
الأعضاء الكرام تحية لكم في منتداكم الرائع فعلا .. فقد اعجبت كثيرا بهذا المنتدى لما يقدمة من فائدة علمية قيمة لكل مهتم بالاكسس و البرمجة بشكل عام.
بالنسبة لموضوع اليوم فلحسن الحظ وقع في يدي ملحق كتاب يتحدث عن القواعد التي يجب ان يتقيد بها فريق العمل قبل البدء بمشروع جديد لهذا وجدت انها فرصة للبدء بتكوين عادات برمجية جيدة حتى تصبح برامجنا مكتوبة بطريقة المحترفين.
حاولت تلخيص الملحق بطريقتي المتواضعة فاعذرونا على التقصير...
يقصد بالقواعد هنا الطريقة التي سيستخدمها المبرمجون في تسمية عناصر البرنامج. مثلا طريقة تسمية الجداول و الحقول و الدوال و المتغيرات و غيرها. كذلك يقصد بها شروط كتابة الشفرة.
تذكر: أفضل المبرمجون هم المتحمسون و الملتزمون بالقواعد
فقبل عمل اي برنامج يجب على فريق العمل الاتفاق على قواعد معينة ليتم الالتزام بها في كتابة البرنامج. فإذا كان كل مبرمج كتب شفرته بطريقته الخاصة فسيؤدي ذلك الي صعوبة فهم الشفرة بين أعضاء الفريق و ربما ادى الي ضياع الكثير من الوقت لفهم مقطع معين من الشفرة . اذا انه حتى اختلاف تسمية الجداول يسبب ارباكا لكثير من المبرمجين. اخبرني كيف ستتعامل مع قاعدة بيانات تحتوي على جدول ذات لاحقة tbl و اخرى بدون لاحقة. و زد على ذلك اذا سميت جداول أخرى باللغة العربية.
لا يعني هذا انه محرم كسر القواعد فأذا كان لديك سبب مقنع فلما لا كن مبدعا. المهم يجب ان تقنع نفسك على الاقل بكسر القاعدة. لهذا اجب على السؤال التالي كلما فكرت بكسر قاعدة ما : لماذا يجب على فعل ذلك؟؟؟
المهم ياشباب دعونا نبدا بالقواعد العامة اولا
1 - القواعد العامة General Rules
===================
1-1 : تقيد بالتسمية من البداية: استخدم البوادئ prefixes الواضحة و الفراغات spaces لجعل حقول البيانات و caption و عناوين رؤس التقرير و اسماء المتغيرات واضحة من اول نظرة. القي نظرة على المثال التالي:
Good: Field name: CustomerFirstName (table name prefix) Field caption: First Name (space added for clarity) Report column header: First Name Code variable: strFirstName (data type prefix, no spaces) Bad: Field name: CustFName Field caption: Christian Name Report column header: Given Name Code variable: strFNm
1-2 : يجب استخدام امر Exit مرة واحدة فقط في اي دالة او اجراء. لان استخدام اكثر من عبارة Exit يؤدي الي الارباك و تعقيد صيانة الشفرة.
Good: Function CodeToName( strCategory as string) as string Dim strReturn as string IF strCategory = “MAN” Then strReturn = “Manchester” Elseif strCategory = “LHR” Then strReturn = “London Heathrow” Else strReturn = “Unknown” End If CodeToName = strReturn End Function (Error handling code not shown) Bad: Function CodeToName( strCategory as string) as string IF strCategory = “MAN” Then CodeToName = “Manchester” Exit Function Elseif strCategory = “LHR” Then CodeToName = “London Heathrow” Exit Function Else CodeToName = “Unknown” Exit Function End If End Function
ملاحظة:
--------
كن منتبها لطريقة استخدام الامر Exit عند معالجة الاخطاء error handling code. في شفرة الاجراء او الدالة. لاحظ الطريقة الجيدة و الطريقة السيئة في كتابة الشفرة في الكود التالي:
Good:
Private Sub txtFilmYearReleased_Exit(Cancel As Integer)
On Error GoTo ErrorHandler
Me.lblHelp.Caption = ""
CleanUpAndExit:
Exit Sub
ErrorHandler:
Call MsgBox("An error was encountered" & vbCrLf & _
vbCrLf & _
"Description: " & Err.Description & vbCrLf & _
"Error Number: " & Err.Number, , "Error")
Resume CleanUpAndExit
End Sub
Bad:
Private Sub txtFilmYearReleased_Exit(Cancel As Integer)
On Error GoTo ErrorHandler
Me.lblHelp.Caption = ""
Exit Sub
ErrorHandler:
Call MsgBox("An error was encountered" & vbCrLf & _
vbCrLf & _
"Description: " & Err.Description & vbCrLf & _
"Error Number: " & Err.Number, , "Error")
End Sub1-3 : سمي الاجراءات و الدوال و المتغيرات و الحقول و اسماء الكائنات Objects و عناصرالتحكم بكلمات مختلطة وبدون فراغات او تسطير Underscores. و لاتنسى تكبير الحرف الاول لكل كلمة.
الحكمة من عدم استخدام التسطير Underscores في اسماء الاجراءات و الدوال هو لتسهيل التفريق بين الاجراءات و الدوال العادية و بين الاحداث Events
اما الغرض من عدم استخدام التسطير Underscores في اسماء المتغيرات و ذلك لتفريق بين المتغيرات و الثوابت Constants
Good: strCompanyPostCode txtCompanyPostCode GetCompanyPostCode() Bad: strCompany_Post_Code txtcompanypostcode GetCompanypostcode()
1-4: سمي المتغيرات بصيغة الاسم او بصيغة الاسم مع الفعل
امثلة بصيغة الاسم
strCustomerFirstName strCustomerLastName strCustomerPostCode
ملاحظة:
المتغيرات المنطقية Boolean غالبا ماتستخدم الاسم و الفعل معا. انظر للامثلة ادناه:
Good: blnCustomerIsValid, blnCustomerHasCar Bad: blnIsValidCustomer, blnHasCarCustomer
1-5: سمي الاجراءات و الدوال بالانجليزية المحكية The Spoken English Word
هذه القاعدة تجعل الدوال و الاجراءات قريبة منا و تسهل فهم الغرض منها.
Good: AddCustomer DeleteCustomer CalculateMovingAverage GetCustomerByPrimaryKey Bad: CustomerAdd CustomerDelete MovingAverageCalculate CustomerGetByPrimaryKey
1-6: لا تستخدم الاختصارات abbreviations على الإطلاق عند تسمية أي عنصر ينتمي لقاعدة البيانات مثل اسماء الجداول و الحقول و المتغيرات و الدوال و غيرها.
Good: strCustomerFirstName Bad: strCustFNm, strCstmFName
1-7: اعطي دائما اسماء بصيغة المفرد in the singular تجنب استخدام صيغة الجمع.
على سبيل المثال الدالة GetCompanyType( lngCompanyType) نعيد صفرا او واحد او اكثر من السجلات التي تحدد نوع الشركة. بدون هذه القاعدة سيتوجب على المبرمج ان يخمن هل يجب عليه استخدام الدالة GetCompanyType() (اي بصيغة المفرد) او يستخدم الدالة GetCompanyTypes() (أي بصيغة الجمع)
Good: Table name: Customer Bad: Table name: Customers
1-8: لا تستخدم الارقام المجردة في شفرتك و لكن استخدم الثوابت Constants عوضا عن ذلك:
Good: GetCompany( WAL_NORTH_WEST_AREA_ONLY ) Bad: GetCompany( 23 )
1-9: حدد نوع بيانات data type لكل وسطاء parameters الدالة و الاجراء.
Good: Function GetCustomer( lngCustomerID as Long ) Bad: Function GetCustomer( lngCustom)
1-10: صرح عن وسطاء parameters الدوال و الاجراءات ب ByVal ما لم يكن لديك سبب وجيه لاستخدام ByRef
Good: Function GetCustomer( ByVal lngCustomerID as Long ) Bad: Function GetCustomer( lngCustomerID) Function GetCustomer( ByRef lngCustomerID)
-11: لا تستخدم متغيرات من نوع global globally scoped variables.
اذا ان تطبيق هذه القاعدة يؤدي الي عدم خرق احد مفاهيم البرمجة الكائنية المنحي OOP الا وهو التغليف encapsulation
ملاحظة:
هذه القاعدة لا تطبق على الثوابت العامة global constants.
1-12: لا تستخدمة المعامل + مع النصوص Strings ولكن استخدم المعامل & عوضا عن ذلك.
ملاحضة: استخدم المعمل + مع العمليات الرياضية فقط.
1-13: تجنب استخدام الامر Exit For و كذلك الامر Exit Do
والغرض من هذه القاعدة هو نفس غرض القاعدة رقم 1-2 اي لتجنب ارباك المبرمج
1-14: استخدم الامر Call عند استدعاء الدوال و الاجراءات.
والغرض من ذلك هو لجعل قراءة الكود اكثر وضوحا
لاحظ الفرق في الاتي
Without the Call statement strCustomerName = GetCustomerName( lngCustomerID) DeleteCustomer lngCustomerID MsgBox “You have successfully deleted customer: “ & strCustomerName With the Call statement strCustomerName = GetCustomerName( lngCustomerID) Call DeleteCustomer( lngCustomerID) Call MsgBox( “you have successfully deleted customer: “ & strCustomerName )
1-15: لا تستخدم الخواص الافتراضية default properties التابعة للكائن.
على سبيل المثال الخاصية الافتراضية لمربع النص Text Box هي Value فاذا استخدمت اسم مربع النص بدون الاشارة اي اي خاصية فان الخاصية Value سيتم اعتمادها وذلك لانها الخاصية الافتراضية لمربع النص.
Good: txtCustomerFirstName.Value = “John” Bad: txtCustomerFirstName = “John”
بهذا نكون قد انهينا القواعد العامة
تحياتي
ًWhale

