التأكيدات في التعليمات البرمجية المدارة
ينطبق هذا الموضوع على:
النسخة |
Visual Basic |
C# |
C++ |
مطور الويب |
---|---|---|---|---|
Express |
||||
pro ، Premium و Ultimate |
التأكيد أو العبارة Assert تختبر الشرط الذي تحدده كوسيطة إلى العبارة Assert, و إذا تم تقييم الشرط إلى صواب فإنه لا يحدث أي إجراء, أما إذا تم تقييم الشرط إلى خطأ فإن التأكيد يفشل, و إذا كنت تقوم بالتشغيل مع بناء التصحيح فإن برنامجك يدخل في وضع التوقف المؤقت.
في #Visual Basicو Visual C يمكنك استخدام الأسلوب Assert إما من Debug أو من Trace التي تتواجد في مساحة الاسم System.Diagnostics, و إن أساليب الفئة Debug غير مضمنة في إصدار منتج من برنامجك لذلك لا يمكنهم زيادة الحجم أو تقليل السرعة للتعليمات البرمجية للمنتج الخاص بك.
لا يقوم ++C بدعم أساليب الفئة Debug حيث يمكنك تحقيق نفس التأثير عن طريق استخدام الفئة Trace مع الترجمة الشرطية مثل #ifdef DEBUG, #endif.
الأسلوب Debug.Assert
قم باستخدام الأسلوب Debug.Assert بحرية لاختبار الشروط التي يجب أن يتم تقييد الصواب في حالة صحة التعليمات البرمجية الخاصة بك, فعلى سبيل المثال، افترض أنك قمت بكتابة دالة قسمة عدد صحيح, و من قواعد الرياضيات أنه لا يمكن أبداً القسمة على صفر, فقد تختبر هذا باستخدام تأكيد:
[Visual Basic]
Function IntegerDivide(ByVal dividend As Integer, ByVal divisor As Integer) As Integer
Debug.Assert(divisor <> 0)
Return CInt(dividend / divisor)
End Function
[#C]
int IntegerDivide ( int dividend , int divisor )
{ Debug.Assert ( divisor != 0 );
return ( dividend / divisor ); }
عندما تقوم بتشغيل التعليمات البرمجية ضمن المصحح فإنه يتم تقييم عبارة التأكيد و لكن في إصدار المنتج لا تتم المقارنة لذلك لا يوجد أية نفقات إضافية.
و فيما يلي مثال آخر حيث لديك فئة تطبق على حساب التحقق كما يلي:
[Visual Basic]
Dim amount, balance As Double
balance = savingsAccount.balance
Debug.Assert(amount <= balance)
SavingsAccount.Withdraw(amount)
[#C]
float balance = savingsAccount.Balance;
Debug.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );
قبل سحب المال من الحساب عليك أولاً التأكد من أن موازنة الحساب كافية لتغطي مقدار المال الذي تريد سحبه, فقد تقوم بكتابة التأكيد للتحقق من الموازنة:
[Visual Basic]
Dim amount, balance As Double
balance = savingsAccount.balance
Trace.Assert(amount <= balance)
SavingsAccount.Withdraw(amount)
[#C]
float balance = savingsAccount.Balance;
Trace.Assert ( amount <= balance );
savingsAccount.Withdraw ( amount );
لاحظ أن الاستدعاءات إلى الأسلوب Debug.Assert تختفي عند إنشاء إصدار منتج للتعليمات البرمجية الخاصة بك, و هذا يعني أن الاستدعاء الذي يتحقق من الموازنة يختفي في الإصدار المنتج, فلحل هذه المشكلة عليك استبدال Debug.Assert مع Trace.Assert الذي لا يختفي في الإصدار المنتج:
الاستدعاءات لإضافة Trace.Assert الزائد عن الحد للإصدار المنتج الخاص بك بعكس الاستدعاءات لـ Debug.Assert.
التأثيرات الجانبية لـ Debug.Assert
عندما تقوم باستخدام Debug.Assert تأكد من أن أي رمز داخل Assert لا يغير نتائج البرنامج إذا تمت إزالة Assert, و إلا قد تقصد إدخال الأخطاء التي تظهر فقط في الإصدار المنتج للبرنامج الخاص بك, فكن حذراً و لا سيما نحو التأكيد الذي يحتوي على دالة أو إجراء المكالمات، كما في المثال التالي:
[Visual Basic]
' unsafe code
Debug.Assert (meas(i) <> 0 )
[#C]
// unsafe code
Debug.Assert (meas(i) != 0 );
قد يبدو هذا الاستخدام Debug.Assert آمن للوهلة الأولى و لكن افترض قيام الدالة meas بتحديث عداد كلما تم استدعاؤه, فعندما تقوم ببناء الإصدار المنتج يتم إزالة هذا الاستدعاء لـ meas لذلك لا يحصل العداد على تحديث, بحيث يعتبر هذا مثال لدالة مع تأثير جانبي, فإزالة استدعاء دالة لها آثار جانبية قد تؤدي إلى الأخطاء التي تظهر فقط في الإصدار المنتج, و لتجنب هذه المشاكل لا تضع استدعاءات دوال في عبارة Debug.Assert و قم باستخدام متغير مؤقت بدلاً من ذلك:
[Visual Basic]
temp = meas( i )
Debug.Assert (temp <> 0)
[#C]
temp = meas( i );
Debug.Assert ( temp != 0 );
حتى عندما تستخدم Trace.Assert قد يتطلب الأمر أيضًا تجنب وضع استدعاءات الدوال داخل عبارة Assert حيث يجب أن تكون مثل هذه الاستدعاءات بمأمن لأن العبارات Trace.Assert لم يتم إزالتها في بنية منتج, و مع ذلك يمكنك تجنب البنيات المماثلة كـ مسألة تعوّد حيث لديك احتمالاً أقل لعمل خطأ عندما تستخدم Debug.Assert.
متطلبات التتبع و التصحيح
إذا قمت بإنشاء مشروعك باستخدام المعالجات Visual Studio فإنه يتم تعريف رمز TRACE افتراضياً في تكوينات التصحيح و الإنتاج, و يتم تعريف رمز DEBUG بشكل افتراضي فقط في بنية التصحيح.
و إلا يجب أن يحتوي برنامجك على أحد الخيارات التالية في الجزء العلوي من ملف المصدر حتى تعمل الأساليب Trace.
#Const TRACE = True في Visual Basic
#define TRACE في #Visual C و ++C
أو يجب بناء برنامجك مع الخيار TRACE:
/d:TRACE=True في Visual Basic
/d:TRACE في #Visual C و ++C
إذا كنت بحاجة لاستخدام أساليب التصحيح في لـ #C أو بنية المنتج لـ Visual Basic فيجب عليك تعريف الرمز DEBUG في التكوين الذي يطرح المنتج.
لا يقوم ++C بدعم أساليب الفئة Debug حيث يمكنك تحقيق نفس التأثير عن طريق استخدام الفئة Trace مع الترجمة الشرطية مثل #ifdef DEBUG, #endif. و يمكنك تعريف هذه الرموز في مربع الحوار <مشروع>صفحات الخاصية. لمزيد من المعلومات, راجع تغيير إعدادات المشروع لتكوين التصحيح لـ Visual Basic أو تغيير إعدادات المشروع لـ C أو تكوين التصحيح لـ ++C.
تأكيد الوسائط
إن Trace.Assert و Debug.Assert يأخذ أكثر من ثلاث وسائط, فأول وسيطة هي الشرط الذي تريد التحقق منه حيث تعتبر إلزامية, و إذا قمت باستدعاء Trace.Assert(Boolean) أو Debug.Assert(Boolean) مع وسيطة واحدة فقط فإن الأسلوب Assert يتحقق من الشرط فإذا كان الناتج خطأ سيتم إخراج محتويات مكدس الاستدعاء للنافذة إخراج, يظهر المثال التالي Trace.Assert(Boolean) و Debug.Assert(Boolean):
[Visual Basic]
Debug.Assert(stacksize > 0)
Trace.Assert(stacksize > 0)
[#C]
Debug.Assert ( stacksize > 0 );
Trace.Assert ( stacksize > 0 );
إذا تواجدت الوسائط الثانية والثالثة فيجب أن تكون عبارة عن سلاسل, و في حالة استدعاء Trace.Assert أو Debug.Assert مع وسيطتين أو ثلاثة فإن الوسيطة الأولى عبارة عن شرط, و يقوم الأسلوب بالتحقق من الشرط فإذا كانت النتيجة "خطأ" سيتم إخراج السلسلة الثانية و الثالثة حيث يظهر المثال التالي Debug.Assert(Boolean, String) و Trace.Assert(Boolean, String) المستخدمة مع وسيطتين:
[Visual Basic]
Debug.Assert(stacksize > 0, "Out of stack space")
Trace.Assert(stacksize > 0, "Out of stack space")
[#C]
Debug.Assert ( stacksize > 0, "Out of stack space" );
Trace.Assert ( stacksize > 0, "Out of stack space" );
يظهر المثال التالي Assert و Assert:
[Visual Basic]
Debug.Assert(stacksize > 0, "Out of stack space. Bytes left:" , Format(size, "G"))
Trace.Assert(stacksize > 0, "Out of stack space. Bytes left:" , Format(size, "G"))
Trace.Assert(stacksize > 0, "Out of stack space. Bytes left:", "inctemp failed on third call" )
[#C]
Debug.Assert ( stacksize > 100, "Out of stack space" , "Failed in inctemp" );
Trace.Assert ( stacksize > 0, "Out of stack space", "Failed in inctemp" );
تخصيص سلوك التأكيد
إذا قمت بتشغيل التطبيق الخاص بك في وضع واجهة المستخدم فإن الأسلوب Assert يعرض مربع الحوار فشل في التأكيد عند فشل الشرط, و الإجراءات التي تحدث عند فشل التأكيد يتم التحكم بها بواسطة الخاصية Listeners أو Listeners.
يمكنك تخصيص سلوك الإخراج عن طريق إضافة كائن TraceListener من المجموعة Listeners عن طريق إزالة TraceListener من المحموعة Listeners أو تجاوز الأسلوب TraceListener.Fail لـ TraceListener لجعلها تسلك سلوك مختلف.
على سبيل المثال، قد يمنع الأسلوب TraceListener.Fail الكتابة إلى سجل الأحداث بدلاً من عرض مربع الحوار فشل في التأكيد.
لتخصيص الإخراج بهذه الطريقة يجب أن يحتوي برنامجك على وحدة إصغاء و يجب أن ترث من TraceListener و تجاوز الأسلوب الخاص به TraceListener.Fail.
لمزيد من المعلومات، راجع تتبع Listeners.
إعداد التأكيدات في ملفات التكوين
يمكنك تعيين التأكيدات في ملف التكوين لبرنامجك كما في التعليمات البرمجية الخاصة بك. لمزيد من المعلومات، راجع Trace.Assert أو Debug.Assert.
راجع أيضًا:
المهام
كيفية: تجميع تتبع و Debug المشروطة