استبدال استثناءات بالاختبارات (Replace Exception with Test)

من موسوعة حسوب
< Refactoring
مراجعة 09:27، 6 فبراير 2019 بواسطة Khaled-yassin (نقاش | مساهمات) (أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: استبدال استثناءات بالاختبارات (Replace Exception with Test)}}</noinclude> == المشكلة == إطلاق استث...')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

المشكلة

إطلاق استثناء حيث يمكن لاختبار بسيط أن يقوم بهذا.

الحل

يستعاض عن الاستثناء باختبار الحالة.

مثال

قبل إعادة التصميم

في لغة Java:

double getValueForPeriod(int periodNumber) {
  try {
    return values[periodNumber];
  } catch (ArrayIndexOutOfBoundsException e) {
    return 0;
  }
}

في لغة C#‎:

double GetValueForPeriod(int periodNumber) 
{
  try 
  {
    return values[periodNumber];
  } 
  catch (IndexOutOfRangeException e) 
  {
    return 0;
  }
}

في لغة PHP:

function getValueForPeriod($periodNumber) {
  try {
    return $this->values[$periodNumber];
  } catch (ArrayIndexOutOfBoundsException $e) {
    return 0;
  }
}

في لغة Python:

def getValueForPeriod(periodNumber):
    try:
        return values[periodNumber]
    except IndexError:
        return 0

بعد إعادة التصميم

في لغة Java:

double getValueForPeriod(int periodNumber) {
  if (periodNumber >= values.length) {
    return 0;
  }
  return values[periodNumber];
}

في لغة C#‎:

double GetValueForPeriod(int periodNumber) 
{
  if (periodNumber >= values.Length) 
  {
    return 0;
  }
  return values[periodNumber];
}

في لغة PHP:

function getValueForPeriod($periodNumber) {
  if ($periodNumber >= count($this->values)) {
    return 0;
  }
  return $this->values[$periodNumber];
}

في لغة Python:

def getValueForPeriod(self, periodNumber):
    if periodNumber >= len(self.values):
        return 0
    return self.values[periodNumber]

لم إعادة التصميم؟

يجب استخدام الاستثناءات لمعالجة السلوك غير الاعتيادي المتعلق بخطأ غير متوقع. ولا يجب أن تكون بديلًا للاختبارات. وإذا أمكن تجنب الاستثناء بمجرد التحقق من شرطٍ ما قبل التشغيل، فافعل ذلك. ويجب الاحتفاظ بالاستثناءات للأخطاء الحقيقية.

فعلى سبيل المثال، إذا دخلت حقل ألغام وأطلقت لغمًا هناك، مما أدى إلى إطلاق استثناء؛ وتم التعامل بنجاح مع الاستثناء وتم رفعك في الهواء إلى بر الأمان خارج حقل الألغام. لكن كان بإمكانك تجنب كل هذا بمجرد قراءة علامة التحذير أمام حقل الألغام.

فوائد تطبيق الحل

  • في بعض الأحيان، يمكن أن تكون شَرطية بسيطة أكثر وضوحًا من شيفرة معالجة الاستثناء.

آلية الحل

  1. إنشاء شرطية لحالة حدية ونقلها قبل كتلة try/catch.
  2. نقل الشيفرة من قسم catch داخل هذه الشرطية.
  3. في قسم catch، ضع الشيفرة لإطلاق استثناء غير مسمى عادي وشغِّل كل الاختبارات.
  4. وإذا لم تُطلق استثناءات خلال الاختبارات، تخلص من العامل try/catch.

انظر أيضًا

مصادر