الفرق بين المراجعتين ل"Refactoring/replace exception with test"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: استبدال استثناءات بالاختبارات (Replace Exception with Test)}}</noinclude> == المشكلة == إطلاق استث...')
 
ط
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE: استبدال استثناءات بالاختبارات (Replace Exception with Test)}}</noinclude>  
+
<noinclude>{{DISPLAYTITLE: استبدال الاستثناءات بالاختبارات (Replace Exception with Test)}}</noinclude>  
 
== المشكلة ==
 
== المشكلة ==
 
إطلاق استثناء حيث يمكن لاختبار بسيط أن يقوم بهذا.
 
إطلاق استثناء حيث يمكن لاختبار بسيط أن يقوم بهذا.
سطر 94: سطر 94:
  
 
== مصادر ==
 
== مصادر ==
* [https://refactoring.guru/replace-exception-with-test صفحة توثيق تقديم التوكيد في موقع refactoring.guru].
+
* [https://refactoring.guru/replace-exception-with-test صفحة توثيق استبدال الاستثناءات بالاختبارات في موقع refactoring.guru].
 
[[تصنيف:Refactoring]]
 
[[تصنيف:Refactoring]]
 
[[تصنيف:Refactoring Techniques]]
 
[[تصنيف:Refactoring Techniques]]
 
[[تصنيف:Simplifying Method Calls]]
 
[[تصنيف:Simplifying Method Calls]]

مراجعة 09:28، 6 فبراير 2019

المشكلة

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

الحل

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

مثال

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

في لغة 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.

انظر أيضًا

مصادر