محتويات الدورة

C# / الأساسي: البرامج ذات الأنواع وعقود الكائنات / الدرس 3

تدفق التحكم وعقود الطرق

استخدم الفروع والحلقات والطرق لكشف القرارات وإثبات تقدم محدود دون آثار خفية.

وقت القراءة التقريبي: 5 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تتبع القرارات المنطقية وحدود الحلقات.
  • شرح أدوار المعاملات العادية وref وout.
  • صياغة الشروط والنتائج وحالة الفشل.

الفروع تصوغ سياسة مرتبة

يجب أن يكون شرط if منطقيا. تصف المقارنة الحد وتختصر && و تحديد المجال قبل الفرع يمنع اختلاط بيانات غير صالحة بفئة عادية؛ هذه مسؤولية لا يحلها default تلقائيا.

التقييم فتحميان عملية لاحقة. تضبط الأقواس التجميع ولا تبرر حشر تغييرات مستقلة في تعبير ذكي. اجعل التحقق والتعديل واضحين. يمكن مراجعة الفروع بجدول يربط المجالات المتجاورة بنتائجها، بدلا من تخمين السلوك من أمثلة وسطية فقط.

تختار else-if أول تطابق، فرتب العتبات المتداخلة عمدا. تعبر switch أوتعبيرها عن البدائل والأنماط، لكن يلزم تحديد غير الصالح وغير المطابق. الفرع الافتراضي سياسة لا إذن لتجاهل المتطلبات.

اختبار القيم المجاورة للعتبة

يصنف المثال درجة معروفة بعد فحص مجالها ويختبر الأعلى أولا. مع74 يفشل high وينجح pass. ينبغي لقارئ الإدخال تغذية دالة المجال بدلا من خلط التحليل الطرفي بكل فرع. يجب أن يقع رفض الدرجة غير الصالحة قبل اختيار التصنيف حتى لا تصبح درجة هائلة نتيجة ممتازة ظاهريا.

اختبر تحت العتبة وعندها وفوقها مباشرة. يخفى الفرق بين >= و> مع قيم وسطية فقط. افصل رفض خارج صفر حتى مئة عن تصنيف retry كيلا يصبح غير الصالح فئة عادية. تغذية دالة المجال بمدخل محلل مسبقا تجعل الاختبارات مستقلة عن حوار الطرفية وتبقي كل مسؤولية واضحة.

csharp سياسة درجات مرتبة
using System;

int score = 74;
if (score < 0 || score > 100)
{
    Console.WriteLine("invalid");
}
else if (score >= 85)
{
    Console.WriteLine("high");
}
else if (score >= 60)
{
    Console.WriteLine("pass");
}
else
{
    Console.WriteLine("retry");
}
الناتج المتوقع
pass

تنتمي الدرجة الصالحة74 لمجال pass من60 إلى84.

الحلقة تحتاج بداية صالحة وتقدما

حدد قبل كل دورة العمل المكتمل. في جمع الواحد حتى الخمسة يمثل total أولا المجموع الفارغ. وقبل i يحوي السابق وإضافة i تحفظ الادعاء للتالي. توصل الزيادة لشرط كاذب. يبدأ برهان الثابت قبل الدورة الأولى، ثم يبين أن الجسم والتحديث يحفظانه حتى يصبح شرط التوقف كاذبا.

استخدم مجالا نصف مفتوح للفهرسة من صفر حتى Count ناقص واحد. تختلف صياغة for وwhile وforeach لكن تلزم الحدود والحالة والانتهاء. تغير break وcontinue المسار فأدرجهما مع موارد الدورة والعدادات. إذا خرجت الحلقة مبكرا، فراجع ما اكتمل وما بقي ومصير الموارد؛ ليست صحة المسار المعتاد كافية.

تمرير القيم والإبلاغ الصريح عن النجاح

تتلقى المعاملات العادية قيما منسوخة. يتيح نسخ مرجع الوصول للكائن نفسه ولا يعيد إسناد المرجع المحلي متغير المستدعي. تشير ref صراحة لمتغيره وتلزم out بالإسناد قبل العودة العادية. هذه عقود مختلفة لا افتراضي تمرير مرجعي عام. ينسخ المعامل العادي قيمة المرجع أيضا؛ لهذا يختلف تعديل الهدف عن إعادة ربط متغير المستدعي نفسه.

ينفذ المثال الثاني مساعد Try بـout لمعاملين غير سالبين ومجموع يلائم int. يسند الخرج بكل مسار ويفحص قبل الجمع ويعيد false عند الفشل. لا تعد out ببقاء الخرج عند الفشل؛ فيلزم فحص المنطقية. على المستدعي تجاهل العدد عند false؛ فالخرج المعين لذلك المسار ليس نتيجة حساب ناجحة لمجرد أنه عدد صالح نوعيا.

csharp حساب محدود بأسلوب Try
using System;

if (TryAddNonnegative(12, 8, out int result))
{
    Console.WriteLine($"result={result}");
}

static bool TryAddNonnegative(int a, int b, out int result)
{
    result = 0;
    if (a < 0 || b < 0 || a > int.MaxValue - b) return false;
    result = a + b;
    return true;
}
الناتج المتوقع
result=20

يسمح الحارس بـ12 زائد8 وتقدم out عشرين في الاستدعاء الناجح.

إظهار الاعتمادات والنطاق

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

يحتاج العود أساسا وتقدما ولا يضمن التنفيذ مكدسا غير محدود. للعمل الكبير أوالخارجي قد يسهل تبرير تكرار محدود. تفيد الطرق القصيرة لتوضيح المسؤولية لا تشتيت ثابت بين تغييرات خفية. يجب أن يقاس التقسيم بوضوح الثابت والمسؤولية، لا بعدد الطرق القصيرة التي ينتجها.

الأخطاء الشائعة وإصلاحها

تدخل العتبة الفرع الخطأ.

لماذا يحدث؟
لا تطابق المقارنة أوالترتيب المجالات.
كيف تصلحه؟
اكتب مجالات منفصلة واختبر المجاور.
كيف تتجنب تكراره؟
احفظ جدول الحدود مع العقد.

يستخدم المستدعي out بعد false.

لماذا يحدث؟
اعتُبرت بيانات الفشل نجاحا.
كيف تصلحه؟
افحص المنطقية قبل الاستخدام.
كيف تتجنب تكراره؟
وثق خرج فشل Try.

يفشل مساعد عودي مع الكبير.

لماذا يحدث؟
العمق غير محدود رغم انتهاء التعريف الرياضي.
كيف تصلحه؟
استخدم تكرارا محدودا أوتحقق من العمق.
كيف تتجنب تكراره؟
أدرج حدود المكدس والعمل.

اختبر فهمك

1. صنف59 و60 و84 و85 وحدد اختبارا غير صالح.

اعرض الحل المشروح

النتائج retry وpass وpass وhigh. تدخل الحدود الفئة الأعلى لاستخدام >=. يجب رفض السالب أو101 قبل التصنيف. ميز غير الصالح من الدرجة المنخفضة الصالحة لا مجرد طبع تسمية.

2. لماذا يفحص الجمع a > int.MaxValue - b قبل a + b؟

اعرض الحل المشروح

يكون int.MaxValue - b قابلا للتمثيل لـb غير السالب. يثبت رفض a فوق الباقي ملاءمة الجمع. الفحص بعد التجاوز متأخر والحارس الأحادي صحيح ضمن المجال غير السالب فقط. للإشارات العامة صمم الحدين أواستخدم checked بسياسة فشل.

أهم ما تعلمته

  • تصوغ الفروع المجالات وتستحق اختبارات حدود.
  • تنسخ المعاملات القيم إلا بعقد ref/out صريح.
  • تحتاج كل حلقة ثابتا وحدودا وحجة تقدم.

المراجع الرسمية