只有累積,沒有奇蹟

2019年1月24日 星期四

[.NET] 選擇性參數 (Optional parameters) 的另一種選擇 - OptionalAttribute

前言 
上一篇文章介紹 了具名引數 (named argument) 的用法,其中被呼叫的方法是使用 C# 4.0 的 optionnal argument 達到方法選擇性參數過去待過的公司 method 遇到選擇性參數時大多使用 optionnal argument 方式來解決,但其實有另外一種方式可以使用 optionAttribute,這篇就簡單介紹針對同樣需求兩者的寫法

使用方式
Optional Argument
相信很多人都使用過不再多做介紹,直接看 sample code 中 firstName、lastName 為選擇性參數如果使用端沒有傳參數時就以使用預設值,如下所示
public static class FullName
{
    public static string ParameterDefaults(string firstName, string lastName, string middleName = "", string title = "")
    {
        return (title == "") ? $"Hi, {firstName} {lastName}" : $"Hi,{firstName} {lastName}";
    }
}
呼叫端使用上很簡單,可以按照順序傳入參數 (postitional argument) 或是具名引數 (named argument) 的方式達到sample code 如下
// positional arguments
FullName.ParameterDefaults("marcus", "tung");
FullName.ParameterDefaults("marcus", "tung", "middle");
FullName.ParameterDefaults("marcus", "tung", "middle", "mr.");

// named arguments
FullName.ParameterDefaults(firstName: "Marcus", lastName: "tung");
FullName.ParameterDefaults(middleName: " test", firstName: "Marcus", lastName: "tung");
FullName.ParameterDefaults(title: "Mr.", firstName: "Marcus", lastName: "tung", middleName: " test");

OptionalAttribute
來到今天主題,可以使用 optionalAttribute,使用前須先 using System.Runtime.InteropServices,在參數前面加上 [option] 即可使用,範例 Code 如下
using System.Runtime.InteropServices;
public static string OptionalAttribute(string firstName, string lastName, [Optional] string middleName,
[Optional] string title)
{
    return (title == "") ? $"Hi, {firstName} {lastName}" : $"Hi,{firstName} {lastName}";
}

呼叫端使用 sample code 如下
// first + last
FullName.OptionalAttribute("Marcus", "tung");
// title + first + last
FullName.OptionalAttribute("Marcus", "tung", "Mr.");
// first + last + middle
FullName.OptionalAttribute(firstName: "Marcus", lastName: "tung", middleName: " test");
// title + first + last + middle
FullName.OptionalAttribute("Marcus", "tung", "middle", "mr");
murmur 
兩者在用法上都很簡單,但可以想一下當參數值越變越多時會有什麼後遺症,很有可能程式邏輯上會有很多 if ... else 判斷式分支產生,這時候程式碼就會出現壞味道。如果參數太多,可以考慮減少參數數量或是使用一個 model 來傳遞參數值,盡量降低代碼邏輯複雜化

參考
具名和選擇性引數
C# 4.0 Features

0 意見:

張貼留言

Copyright © m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com