بازسازی کد: جایگزینی متد با شیء (Replace method with method object)
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: سه دقیقه

زیبایی متدهای کوچک، در قابل درک بودن آنها نهفته است. هدف نهایی بیشتر روش‌های بازسازی کد، تغییر تکه کدی بزرگ و در هم تنیده، به تکه‌های کوچک قابل درک‌تر است. مهمترین مانع در شکستن تکه کدهای طولانی، وجود متغیرهای موقتی در آن است. چند روش بازسازی کد مطرح شده به طور خاص به این موضوع توجه دارند. 
زمانیکه متد طولانی ای در کد وجود داشته باشد که نتوان (به راحتی) آن را به چند متد کوچکتر تقسیم کرد، معمولا از این روش بازسازی کد استفاده می‌شود. 
در این روش می‌توان کلاسی را تعریف کرد و متد مربوطه را به آن کلاس منتقل کرد. در نتیجه متغیرهای حاضر در متد را می‌توان در کلاس، به فیلدهای اطلاعاتی تبدیل کرد. پس از این تغییر حتی می‌توان فراتر رفت و متد ابتدایی را به راحتی به چند متد معنی دار در کلاس مقصد تبدیل کرد. 
فرض کنید در کلاس زیر متدی نسبتا طولانی برای محاسبه قیمت سفارش وجود دارد.  
public class Order { 
    public decimal Price() { 
        var primaryBasePrice = 10000; 
        var branchDiscountBasePrice = 9000; 
        var taxPercentage = 9; 
        // calculate price 
    } 
}
متدی مانند متد Price معمولا پیچیده‌تر از موردی است که در این مثال آورده شده است. علارغم این، متد ذکر شده با توجه به متغیرهای محلی موقتی ای که دارد و روالی که در آن نیاز به پیاده سازی است، ممکن است به اندازه‌ای به متغیرهای مربوطه وابسته باشد که نتوان آن را به متدهای کوچکتر در همین کلاس تقسیم کرد و یا تقسیم کردن آن در همین کلاس کمک چندانی به ما نکند. در چنین شرایطی بازسازی کد مورد نظر این نوشتار انجام می‌شود و کد، شکلی شبیه به تکه کد زیر را به خود می‌گیرد. 
public class Order 
{ 
    public decimal Price() { 
        return new PriceCalculator(this).Compute(); 
    } 
} 
public class PriceCalculator 
{ 
    private Order orderInstance ;
    public PriceCalculator(Order order) 
    { 
        orderInstance = order;
    } 
    public decimal Compute() 
    { 
        var primaryBasePrice = 10000; 
        var branchDiscountBasePrice = 9000; 
        var taxPercentage = 9; 
        // calculate price 
    } 
}

در بازسازی ذکر شده، کلاسی با نام PriceCalculator برای روال محاسبه قیمت ایجاد شده و متدی با نام Compute در آن ساخته شده است که محاسبه قیمت را انجام می‌دهد. به دلیل این که ممکن است در کد مربوط به محاسبه قیمت، از خصوصیات موجود در کلاس Order استفاده شود، شیء مربوطه نیز به صورت پارامتر به کلاس محاسبه قیمت پاس داده می‌شود. 
همانطور که در ابتدای مطلب ذکر شد، بعد از این بازسازی کد می‌توان متغیرهای محلی موقتی را به صورت فیلدهای کلاس PriceCalculator تغییر داد و حتی متد را با سادگی بیشتری به چند متد تقسیم کرد. به طور مثال همچنین می‌توان روالهایی مانند محاسبه تخفیف و مالیات را نیز با استفاده از الگوی طراحی decorator در PriceCalculator پیاده سازی نمود.  

مراحل انجام این بازسازی کد  

  1. کلاس جدیدی بسازید و نام آن را بر اساس نام متد مورد نظر خود انتخاب نمایید. 
  2. به کلاس ساخته شده فیلدی برای نگه داری شیء کلاس مرجع (در مثال ما Order) متد اصلی ایجاد کنید.
  3. به کلاس جدید سازنده‌ای برای پاس دادن شیء کلاس مرجع (در مثال ما Order) ایجاد کنید. 
  4. در کلاس جدید متدی با نام مناسب (در مثال ما Compute) ایجاد کنید. 
  5. بدنه متد مورد نظر را به بدنه متد ایجاد شده در کلاس جدید کپی کنید و تمامی رفرنسها به اعضای کلاس مرجع را با رفرنس به شیء موجود آن تغییر دهید. 
  6. کد را کامپایل کنید. 
  7. فراخوانی متد اصلی را با فراخوانی متد شیء کلاس جدید ایجاد شده تغییر دهید.  
یکی از فواید مهم این بازسازی کد، جداسازی منطقی از کد که به صورت متد بوده و تبدیل آن به کلاس است. زمانیکه روالی به کلاس مستقلی تبدیل می‌شود، می‌توان از الگوهای طراحی دیگری برای بهبود بیشتر آن استفاده نمود. همچنین انتقال و استفاده دوباره آن نیز بسیار آسان‌تر خواهد شد.