يكي ديگر از تكنيكهاي 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 توكاري است (+) و همچنين يك ليست قابل توجه ديگر را در اين زمينه در اين پرسش و پاسخ ميتوانيد بيابيد: (+)