المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : الدرس الثاني عشر : بعض مبادئ الإختبار والتحسين - دورة CSharp 2005


khaledbelal
03-22-2010, 04:15 PM
الدرس الثاني عشر

تحسين وظائف التطبيق
من البديهايات في البرمجة أن يحتوي أي تطبيق على شوائب bugs
تحد من إداء التطبيق مهامة على أكمل وجه
والشوائب هي الأخطاء البسيطة في البرنامج التي تنتج في ظروف محددة
والمبرمج عادة لا يكتشف هذه الأخطاء أثناء العمل في التطبيق , وإنما يكشفها إختبار التطبيق
وعملية إختبار التطبيق تعتبر من أهم مراحل تطوير البرمجيات وربما أكثر تعقيداً وإستهلاكاً للوقت والجهد
ولكن لحسن الحظ هذه العملية لا تحتاج إلى مبرمجين ليقوموا بها , وإنما دورهم هنا هو التعديل في كود التطبيق
الذي يقوم بهذه العملية هم المستخدمون أنفسهم , من خلال توزيع التطبيق بنسخ تجريبية Beta
وعادة ما تكون هذه النسخ مجانية , لأن مطور التطبيق هو المستفيد من إكتشاف الأخطاء
حيث يطلب من مستخدمي النسخ التجريبة أرسال أي أخطاء قد تواجههم إلى المطور
وبهذا يوفر المطور على نفسه الكثير من المجهود والوقت في إختبار التطبيق
والشوائب عادة ما تكون إحدى ثلاثة:

1-أخطاء الشوائب برمجية
وهي الشوائب التي تحدث بسبب خطأ في شفرة التطبيق , وتنتج هذه الأخطاء لأسباب كثيرة
وتسبب خلل في عمل البرنامج , كأن يتوقف البرنامج فجأة أو يقوم بعمليات غير منطقية

وكمثال على هذه الشوائب :
إفتح تطبيق الدرس السابق و أختر مجموعة ملفات من النافذة الأساسية
ثم إفتح نافذة الألبومات وأختر أحد الألبومات , ثم أختر إلغاء الأمر من نافذة الألبومات
المفروض بما أنك ألغيت الأمر أن لا يتغير شيئ في قائمة التشغيل في النافذة الرئيسية
ولكن القائمة تغيرة رغم أنك إخترت "إلغاء الأمر"
هذا الخطأ يعتبر من الشوائب البرمجية , وعلى المطور أن يبحث عن مكان الخطأ ويصححة
مكان الخطأ هنا هو إجراء النقر على زر "التحكم بالأبومات"
إفتح تصميم النافذة الرئيسية وانقر مزدوجاً على زر "التحكم بالألبومات" لتنتقل إلى الشفرة
ستجد هذا الكود :

try
{
albumes frm = new albumes();
frm.albume = albume;
frm.ShowDialog();
albume = frm.albume;
FillList();
LoadFile(albume[0]);
SetTrackBar();
PlayFile();
}
catch
{
MessageBox.Show("حدث خطأ أثناء محاولة تشغيل الملف المحدد");
}

لاحظ السطر الخامس تعليمة إظهار نافذة الألبومات , بعدها تماما تعليمات التغيير في قائمة التشغيل
وهنا الخطأ , المفترض أن نختبر نتيجة نافذة الألبومات , فإذا كانت "موافق" ينفذ كود تغيير قائمة التشغير
وبالتالي يجب أن نضيف للكود السابق عبارة if لإختبار ناتج النافذة قبل تنفيذ تعليمات التغيير في قائمة التشغيل
هناك خطأ آخر هنا في السطر الرابع :

frm.albume = albume;

هذه التعليمة تساوي بين القائمة albume في كلا النافذتين , بحيث إذا تغير شيئ في قائمة albume في هذه النافذة
سيتغير نفس الشيئ في قائمة albume في النافذة الألبومات والعكس صحيح أيضاً
وهذا يعتبر خطأ لأنه من المفترض أن تكون كل قائمة مستقلة عن الأخرى , والمفروض أن لا نعمل مساواة بين القائمتين
وإنما نسخ عناصر القائمة في هذه النافذة إلى القائمة في النافذة الآخرى , والنسخ غير المساواة
المساواة تعني أن كلا النافذتين تحمل نفس القيمة دائماً
فإذا ساويت بين قائمتين ثم عدلت في أي منهما فإن الأخرى بالضرورة ستتعدل تلقائيا
أما النسخ فإذا نسخت قائمة من أخرى وعدلت في أي منها فإن الأخرى لا تتأثر لأنهما مستقلتان عن بعض
وهذا ما نحتاجه هنا , و النسخ في القوائم يتم عبر الإجراء AddRange كما شرحناه سابقاً
وبالتالي فالمفروض إستبدال السطر الرابع بهذا السطر :

frm.albume.AddRange(albume);

وبإضافة عبارة فحص نتيجة النافذة يصبح كود النقر على زر "التحكم بالألبومات" هكذا :

try
{
albumes frm = new albumes();
frm.albume.AddRange(albume);
frm.ShowDialog();
if (frm.DialogResult == DialogResult.OK)
{
albume = frm.albume;
FillList();
LoadFile(albume[0]);
SetTrackBar();
PlayFile();
}
}
catch
{
MessageBox.Show("حدث خطأ أثناء محاولة تشغيل الملف المحدد");
}

لا حظ داخل حاصرتي if أنا ساوينا بين قائمتين , وهنا المساواة هي المطلوبة وليس النسخ
لأن ناتج النافذة هي الموافقة وبالتالي نريد مساواة بين قائمة نافذة الألبومات التي قمنا بالتعديلات عليها والقائمة في النافذة الرئيسية
وكمثال آخر على هذا النوع من الأخطاء شغل التطبيق وانقر على زر ملئ الشاشة دون تشغيل ملف صوتي
ستظهر رسالة خطأ ويتوقف البرنامج عنم العمل , لأنه لا يوجد فيديو حتى يجعله ملئ الشاشة
ولحل هذه المشكلة أذهب إلى كود زر ملئ الشاشة , وأضف جملة try :

try
{
vp.Fullscreen = true;
}
catch
{
MessageBox.Show("لا يوجد ملف فيديو ");
}

2-إخطاء نقص في الوظائف
وهي الأخطاء التي لا تنتج عن خطأ في الكود وإنما تنتج عن نقص في وظائف التطبيق
أي أن التطبيق لا يحقق جميع الوظائف المطلوبة من المستخدم , ويتم حل هذه المشكلة بالتحديث Updating
وهذه التحديثات عادة ما تتكرر من إصدار لآخر في التطبيق
كمثال على هذه الأخطاء في تطبيقنا :
المستخدم عادة ما يفضل طريقة لإختيار سريع للألبوم الذي يريد تشغيلة
وفي تطبيقنا لا يمكن إختيار الألبوم إلى بفتح نافذة الألبومات , وهذا يعد نقصاً في متطلبات المستخدم
لذلك يجب التعديل في البرنامج لعمل قائمة منسدلة لإختيار الألبوم في نافذة التطبيق الرئيسية
نحتاج لذلك إلى كائن من نوع XmlDocument ولذلك يجب إضافة عبارة using كما فعلنا في نافذة الألبومات

http://absba7.absba.org/teamwork8/455943/95.jpg

ثم نعرف متغير عام إسمه doc من نوع XmlDocument تحت تعريف القائمة albume كما فعلنا في نافذة الألبومات
إفتح تصميم النافذة الرئيسية , ومن صندوق الأدوات إسحب كائن القائمة المنسدلة إلى النافذة الرئيسية فوق قائمة التشغيل

http://absba7.absba.org/teamwork8/455943/96.jpg

وقم بتغيير الخاصية Name إلى ac و الخاصية Text إلى "إختر الألبوم"
يجب تحميل أسماء الألبومات بمجرد فتح البرنامج , لذلك سنكتب شفرة تحميل أسماء الألبومات في حدث تحميل النافذة كما فعلنا في نافذة الألبومات
افتح تصميم النافذة الرئيسية و انقر مزدوجاً على مكان فارغ في النافذة لتذهب إلى كو تحميل النافذة MainForm_Load أو Form1_Load
إنسخ هذا الكود بين الحاصرتين :

doc.Load(Application.StartupPath + "//albumes.xml");
XmlNode albumesnd = doc["albumes"];
XmlNode alnd = albumesnd.FirstChild;
while (alnd != null)
{
ac.Items.Add(alnd.Name);
alnd = alnd.NextSibling;
}

الكود السابق هو نفسه الكود في إجراء تحميل نافذة الألبومات
نحتاج لقراءة ملفات الألبوم المحدد إلى إجراء ReadAlbume الموجود في نافذة الألبومات
إنسخ كود الإجراء ReadAlbume إلى شفرة النافذة الرئيسية وتأكد من أنه خارج أي إجراء آخر :

void ReadAlbume(string albumename)
{
try
{
doc.Load(Application.StartupPath + "//albumes.xml");
XmlNode filend = doc["albumes"][albumename].FirstChild;
albume.Clear();
while (filend != null)
{
albume.Add(filend.InnerText);
filend = filend.NextSibling;
}
FillList();
}
catch
{
MessageBox.Show("حدث خطأ أثناء محاولة إسترجاع بيانات الألبومات");
}
}

كما نحتاج إيضاً لإضافة كود إستدعاء الإجراء ReadAlbume في حدث التغيير في القائمة المنسدلة
إذهب إلى تصميم النافذة الرئيسية وانقر مزدوجاً على كائن القائمة المنسدلة ac لتذهب إلى الشفرة
واكتب بين الحاصرتين كود إستدعاء إجراء قراة ملفات الألبوم :

try
{
ReadAlbume(ac.Text);
FillList();
LoadFile(albume[0]);
SetTrackBar();
PlayFile();
}
catch
{
MessageBox.Show("حدث خطأ أثناء محاولة تشغيل الملف المحدد");
}

السطر الثالث يستدعي الإجراء ReadAlbume ليتم تحميل ملفات الملف المحدد إلى القائمة albume
والسطر الرابع يقوم بإستدعاء الإجراء FillList لتحميل عناصر albume إلى قائمة التشغيل
والسطر الخامس يقوم بتحميل أول عنصر من عناصر القائمة
والسادس يضبط شريك التنقل و السابع يشغل الملف ..

3- أخطاء في الواجهات
وهي الأخطاء التي لا تؤثر على عمل البرنامج ولكن تؤثر على الواجهات الصورية للنوافذ
وهذه الأخطاء عادة ما يتم حلها بواسطة التحديثات Updating

كمثال على هذه الأخطاء من تطبيقنا :
إفتح التطبيق , وانقر على زر تكبير النافذة في شريط العنوان
ستلاحظ أن جميع كائنات النافذة محصورة في الزاوية العليا اليسرى من النافذة
حيث أن تكبير النافذة لم يقم بتعديل حجم و أماكن الكائنات
ولحل هذه المشكلة سنستخدم خاصية واحدة في جميع الكائنات : Anchor
معنى الكلمة "المرساه" ومن معناها يتبين لنا وظيفتها
حيث تقوم بربط الكائن بأحد جوانب النافذة أو بعدة جوانب
فمثلاً لو ربطت كائن قائمة التشغيل بيمين النافذة , وقمت بتكبير النافذة فستلاحظ أن مكانها تغير وإنزاح نحو يمين النافذة
أما إذا ربطت أي كائن بجانبين متعاكسين , كأن تربط شريط التنقل بيمين ويسار النافذة
وقمت بتكبير النافذة ستلاحظ أن حجم شريط التنقل قد تغير لأنه مرتبط بإتجاهين متعاكسين وهذا يؤدي إلى "مط" الكائن
إذهب إلى تصميم النافذة الرئيسية , وإختر الكائن الحاضن للفيديو "شاشة الفيديو"
وغير خاصية Anchor إلى Top, Bottom, Left, Right

http://absba7.absba.org/teamwork8/455943/97.jpg

لاحظ أنا ربطنا كائن الشاشة بجميع جوانب النافذة وبالتالي فحجمها سيتمدد في جميع الجهات
ولكن المسافة بين نهاية الكائن وطرف النافذة من الأربع الجهات لن يتغير
إختر صندوق "طريقة التشغيل" وغير الخاصية anchor إلى : Bottom, Right
زر التحكم بالألبومات : Bottom, Right
القائمة المنسدلة لإختيار الألبوم : Top, Right
قائمة التشغيل : Top, Bottom, Right
شريط التنقل : Bottom, Left, Right
أزرار التشغيل : Bottom, Left
الآن شغل التطبيق , وجرب تغيير حجم النافذة ستلاحظ أن الكائنات تغير من حجمها و مكانها بحسب حجم النافذة
أيضاً كمثال على هذه الأخطاء , شكل شريط التنقل الكبير , والمشوه
لحل مشكلة شكلة الكبير سنلجأ إلى خدعة صغيرة : سنقوم بتغطية جزء كبير منه فوق وتحت شريط الوسط
وذلك بإستخدام كائن النص الثابت Label , إفتح تصميم النافذة الرئيسية ومن صندوق الأدوات إسحب كائن Label مرتين
وقم بتغيير الخاصية BackColor في كليهما إلى Transparent من تبويب Web وإحذف أي كلمة أمام خاصية Text
ثم قم بتغطية الأجزاء الزائدة من شريط التنقل ولا تنسى أن تغير الخاصية Anchor فيهما كما هي في شريط التنقل
أيضاً يمكن أن تغير أيقونه التطبيق بإختيار النافذة الرئيسية وتغيير الخاصية Icon
لتضيف لمسة إحترافية على التطبيق قم بتغيير الصور على الأزرار من خلال الخاصية Image
وتغيير خلفية النافذة من خلال الخاصية BackGroundImage
ملاحظة : هناك خطأ برمجي في بيئة تطوير ميكروسوفت وهو أن خلفية النافذة لا تظهر إذا كانت الخاصية RightToLeft تساوي True

سيبدو شكل التطبيق بعد هذه التعديلات هكذا :

http://absba7.absba.org/teamwork8/455943/98.jpg

الواجب
إختبر التطبيق وصحح أي أخطاء برمجية أخرى
.نهاية الدرس الثاني عشر.