استبدال شيفرات الأخطاء باستثناءات (Replace Error Code with Exception)

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

المشكلة

يعيد التابع قيمة خاصة تشير إلى خطأ.

الحل

إطلاق استثناء بدلًا من ذلك.

مثال

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

في لغة Java:

int withdraw(int amount) {
  if (amount > _balance) {
    return -1;
  }
  else {
    balance -= amount;
    return 0;
  }
}

في لغة C#‎:

int Withdraw(int amount) 
{
  if (amount > _balance) 
  {
    return -1;
  }
  else 
  {
    balance -= amount;
    return 0;
  }
}

في لغة PHP:

function withdraw($amount) {
  if ($amount > $this->balance) {
    return -1;
  } else {
    $this->balance -= $amount;
    return 0;
  }
}

في لغة Python:

def withdraw(self, amount):
    if amount > self.balance:
        return -1
    else:
        self.balance -= amount
    return 0

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

في لغة Java:

void withdraw(int amount) throws BalanceException {
  if (amount > _balance) {
    throw new BalanceException();
  }
  balance -= amount;
}

في لغة C#‎:

///<exception cref="BalanceException">Thrown when amount > _balance</exception>
void Withdraw(int amount)
{
  if (amount > _balance) 
  {
    throw new BalanceException();
  }
  balance -= amount;
}

في لغة PHP:

function withdraw($amount) {
  if ($amount > $this->balance) {
    throw new BalanceException;
  }
  $this->balance -= $amount;
}

في لغة Python:

def withdraw(self, amount):
    if amount > self.balance:
        raize BalanceException()
    self.balance -= amount

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

إعادة شيفرة الخطأ هو ميراث عفا عليه الزمن من البرمجة الإجرائية. في البرمجة الحديثة، يكون التعامل مع الأخطاء من قبل أصناف خاصة، والتي تسمى الاستثناءات. إذا حدثت مشكلة، "يُطلِق" خطأً، والذي "يُلتقط" من قِبل أحد معالجات الاستثناءات. وتُفعَّل شيفرة معالجة الخطأ الخاصة، والتي تُتجاهل في الظروف العادية، كي تستجيب.

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

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

مساوئ تطبيق الحل

  • يمكن أن يتحول معالج الاستثناء إلى عكاز يشبه جملة goto. تجنب هذا! لا تستخدم الاستثناءات لإدارة تنفيذ الشيفرة. لا ينبغي إطلاق الاستثناءات إلا للإبلاغ عن خطأ أو حالة حرجة فقط.

آلية الحل

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

  1. ابحث عن كافة الاستدعاءات إلى تابعٍٍٍٍٍٍٍٍٍٍٍٍٍٍ إعادة شيفرات الخطأ، وبدلًا من التحقق من وجود شيفرة خطأ، غلفها في كُتَل try/catch.
  2. أطلِق استثناءً داخل التابع، بدلًا من إعادة شيفرة الأخطاء.
  3. غير توقيع التابع بحيث يحتوي معلومات حول الاستثناء التي يجري إلقاءه (قسم ‎@throws).

مصادر