Refactoring یا ریفکتورینگ به معنی بازآرایی ساختار داخلی کد بدون تغییر رفتار قابل مشاهده آن است. هدف آن خوانایی، کاهش پیچیدگی، تست‌پذیری و آسان‌تر شدن تغییرات بعدی است. افزودن ویژگی جدید یا رفع باگ ممکن است همراه ریفکتورینگ باشد، اما خود ریفکتورینگ نباید قرارداد خارجی را ناخواسته تغییر دهد.

مثال PHP: حذف شرط‌های تکراری

// Before: repeated branching
if ($role === 'admin') { $discount = 20; }
elseif ($role === 'vip') { $discount = 10; }
else { $discount = 0; }

// After: one source of truth
$discounts = ['admin' => 20, 'vip' => 10];
$discount = $discounts[$role] ?? 0;

نسخه دوم نگهداری نرخ‌ها را آسان‌تر کرده و شاخه‌های شرطی را کاهش می‌دهد. قبل از جایگزینی باید با تست ثابت کنیم رفتار کلیدهای تعریف‌نشده و نوع role تغییر نکرده است.

مثال Python: استخراج تابع

# Before
def checkout(items):
    total = sum(item['price'] * item['qty'] for item in items)
    return round(total * 1.1)

# After
def subtotal(items):
    return sum(item['price'] * item['qty'] for item in items)

def checkout(items):
    return round(subtotal(items) * 1.1)

تابع subtotal قابلیت استفاده مجدد و آزمون مستقل پیدا کرده است. منطق محاسبه و ترتیب عملیات تغییری نکرده، ولی نام‌ها قصد برنامه را واضح‌تر می‌کنند.

مثال Go: کاهش تو در تویی

// Before
func validOrder(o *Order) bool {
    if o != nil {
        if o.Total > 0 { return true }
    }
    return false
}
// After
func validOrder(o *Order) bool {
    return o != nil && o.Total > 0
}

مثال C#: استفاده از Guard Clause

// Before
if (order != null) {
    if (order.Total > 0) { Process(order); }
}
// After
if (order is null || order.Total <= 0) return;
Process(order);

ریسک‌ها و مراحل پیشنهادی

  • ابتدا برای رفتار فعلی تست بنویسید.
  • یک تغییر کوچک انجام دهید و تست‌ها را اجرا کنید.
  • عملکرد و نحوه ارتباط با سیستم بیرونی را کنترل کنید.
  • تغییرات را در یک کامیت محدود و قابل بررسی ثبت کنید.

نکته فنی

هر کوتاه کردن کدی ریفکتورینگ خوب نیست. اگر تغییر با حذف حالت‌های معتبر یا جابه‌جایی ترتیب محاسبات همراه باشد، می‌تواند رفتار برنامه را تغییر دهد.

اصطلاحات مرتبط: کلین کد، بازبینی کد، بدهی فنی، اصول سالید، یونیت تست، گیت.

درباره رابطه ریفکتورینگ با خوانایی، خلاصه کتاب کلین کد در باورژن را ببینید.