یکی دیگر از روشهای 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 انتقال داد.