有函數有太多的參數時,可以將這些參數包裝成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
修改, 再修改Publisher
的Publish
流程.
可讀性高, 可以從參數的類別名知道意思.
其實我們在開發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
}