۱۳۹۰/۰۷/۱۸

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



يكي ديگر از روش‌هاي Refactoring ، معرفي كردن يك كلاس بجاي پارامترها است. عموما تعريف متدهايي با بيش از 5 پارامتر مذموم است:

using System;
using System.Collections.Generic;

namespace Refactoring.Day7.IntroduceParameterObject.Before
{
    public class Registration
    {
        public void Create(string name, DateTime date, DateTime validUntil,
                           IEnumerable<string> courses, decimal credits)
        {
            // do work
        }
    }
}

در اين حالت بجاي تعريف اين تعداد بالاي پارامترهاي مورد نياز، تمام آن‌ها را تبديل به يك كلاس كرده و استفاده مي‌كنند:

using System;
using System.Collections.Generic;

namespace Refactoring.Day7.IntroduceParameterObject.After
{
    public class RegistrationContext
    {
        public string Name {set;get;}
        public DateTime Date {set;get;}
        public DateTime ValidUntil {set;get;}
        public IEnumerable<string> Courses {set;get;}
        public decimal Credits { set; get; }
    }
}

namespace Refactoring.Day7.IntroduceParameterObject.After
{
    public class Registration
    {
        public void Create(RegistrationContext registrationContext)
        {
            // do work
        }
    }
}

يكي از مزاياي اين روش، منعطف شدن معرفي متدها است؛ به اين صورت كه اگر نياز به افزودن پارامتر ديگري باشد، تنها كافي است يك خاصيت جديد به كلاس RegistrationContext اضافه شود و امضاي متد Create،‌ ثابت باقي خواهد ماند.

روش ديگر تشخيص نياز به اين نوع Refactoring ، يافتن پارامترهايي هستند كه در يك گروه قرار مي‌گيرند. براي مثال:

public int GetIndex(int pageSize, int pageNumber, ...) { ...

همانطور كه ملاحظه مي‌كنيد تعدادي از پارامترها در اينجا با كلمه page شروع شده‌اند. بهتر است اين‌ پارامترهاي مرتبط را به يك كلاس مجزا به نام Page انتقال داد.