۱۳۹۰/۰۷/۱۶

آشنايي با Refactoring - قسمت 5


يكي ديگر از تكنيك‌هاي Refactoring بسيار متداول، «حذف كدهاي تكراري» است. كدهاي تكراري هم عموما حاصل بي‌حوصلگي يا تنبلي هستند و برنامه نويس نياز دارد در زماني كوتاه، حجم قابل توجهي كد توليد كند؛ كه نتيجه‌اش مثلا به صورت زير خواهد شد:

using System;

namespace Refactoring.Day4.RemoveDuplication.Before
{
    public class PersonalRecord
    {
        public DateTime DateArchived { get; private set; }
        public bool Archived { get; private set; }

        public void ArchiveRecord()
        {
            Archived = true;
            DateArchived = DateTime.Now;
        }

        public void CloseRecord()
        {
            Archived = true;
            DateArchived = DateTime.Now;
        }
    }
}

Refactoring ما هم در اينجا عموما به انتقال كدهاي تكراري به يك متد مشترك خلاصه مي‌شود:

using System;

namespace Refactoring.Day4.RemoveDuplication.After
{
    public class PersonalRecord
    {
        public DateTime DateArchived { get; private set; }
        public bool Archived { get; private set; }

        public void ArchiveRecord()
        {
            switchToArchived();
        }

        public void CloseRecord()
        {
            switchToArchived();
        }

        private void switchToArchived()
        {
            Archived = true;
            DateArchived = DateTime.Now;
        }
    }
}


اهميت حذف كدهاي تكراري:
- اگر باگي در اين كدهاي تكراري يافت شود، همه را در سراسر برنامه بايد اصلاح كنيد (زيرا هم اكنون همانند يك ويروس به سراسر برنامه سرايت كرده‌است) و احتمال فراموشي يك قسمت هم ممكن است وجود داشته باشد.
- اگر نياز به بهبود يا تغييري در اين قسمت‌هاي تكراري وجود داشت، باز هم كار برنامه نويس به شدت زياد خواهد بود.

ابزارهاي كمكي:
واقعيت اين است كه در قطعه كد كوتاه فوق، يافتن قسمت‌هاي تكراري بسيار ساده بوده و با يك نگاه قابل تشخيص است؛ اما در برنامه‌هاي بزرگ خير. به همين منظور تعداد قابل توجهي برنامه‌ي كمكي جهت تشخيص كدهاي تكراري پروژه‌ها تابحال توليد شده‌اند؛ مانند CopyPasteKiller، Clone detective و غيره.

علاوه بر اين‌ها نگارش بعدي ويژوال استوديو (نگارش 11) حاوي ابزار Code Clone Detection توكاري است (+) و همچنين يك ليست قابل توجه ديگر را در اين زمينه در اين پرسش و پاسخ مي‌توانيد بيابيد: (+)