iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0

Introduce Parameter Object

簡介

有函數有太多的參數時,可以將這些參數包裝成parameter object.

重構前範例

假設有個出版商類別, 有個函數是出版書籍, 需要以下的參數:

public class Publisher
{
    public Book Publish(string bookName, string authorName, int pageNumber, DateTime publishDate, string ISBN)
    {
        // ...
    }
}

重構後範例

試想未來要多更多參數時, 這個Publish函數的宣告會越來越大, 到時維護會很難懂.
因此, 將這些參數包裝成一個新record: PublishRequest

public record PublishRequest
{
    public string bookName { get; set; } 
    public string authorName { get; set; } 
    public int pageNumber { get; set; }
    public DateTime publishDate { get; set; }
    public string ISBN { get; set; }
}

public class Publisher
{
    public Book Publish(PublishRequest request)
    {
        // ...
    }
}

經過這種重構, 未來參數異動時, 先從PublishRequest修改, 再修改PublisherPublish流程.

為何要重構

可讀性高, 可以從參數的類別名知道意思.

Open source範例

其實我們在開發ASP.NET, 很常用parameter object處理網頁的輸入/輸出.
以知名的eCommerce專案nopCommerce,
它的一項BlogController, 有很多public函數, 其中這函數public virtual async Task<IActionResult> List(BlogPagingFilteringModel command)
引用的BlogPagingFilteringModel如下, 所需要的參數都在此.

public partial record BlogPagingFilteringModel : BasePageableModel
{
    #region Methods

    public virtual DateTime? GetParsedMonth()
    {
        //...
    }
    public virtual DateTime? GetFromMonth()
    {
         //...
    }
    public virtual DateTime? GetToMonth()
    {
         //...
    }
    #endregion

    #region Properties

    public string Month { get; set; }

    public string Tag { get; set; }

    #endregion
}

上一篇
Removing Shotgun Surgery 的重構
下一篇
Combinatorial explosion 的重構
系列文
程式淨化計畫:痛苦是重構的起源!31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言