試煉1 - 如何消滅 Magic strings

2022 鐵人賽文 搬回點部落

如何處理Magic strings

void Main()
{
    var now = DateTime.Now
    var nowDate = now.ToString("yyyy-MM-dd").Dump();
    var startDate = now.AddDays(-7).ToString("yyyy-MM-dd").Dump();
    var endDate = now.AddDays(-1).ToString("yyyy-MM-dd").Dump();
}

"yyyy-MM-dd" 就是 Magic strings
常見的修改像是

void Main()
{
    var dateformat = "yyyy-MM-dd"
    var now = DateTime.Now
    var nowDate = now.ToString(dateformat).Dump();
    var startDate = now.AddDays(-7).ToString(dateformat).Dump();
    var endDate = now.AddDays(-1).ToString(dateformat).Dump();
}

但是 一個系統之中 會用到顯示時間應該會有很多地方
每個方法內都有自己的dateformat很容易就不一致

void Main()
{
    var now = DateTime.Now;
    var nowDate = now.ToString(DateTimeFormatSetting.DateFormat).Dump();
    var startDate = now.AddDays(-7).ToString(DateTimeFormatSetting.DateFormat).Dump();
    var endDate = now.AddDays(-1).ToString(DateTimeFormatSetting.DateFormat).Dump();
}

public class DateTimeFormatSetting
{
    public static readonly string DateFormat = "yyyy/MM/dd";
    public static readonly string DateFormatWithoutYear = "MM/dd";
}

建立 DateTimeFormatSetting 物件 將相關的 Magic strings 放在一起
當有需求變更的時候 請改成 "yyyy-MM-dd" 就很好處理了

延伸試煉

Miniblog.Core 這個專案內可以看到大師是怎樣處理Magic strings
在拿取 appsettings.json 的資料時 時也用到相似的概念 更是優秀
(EX:Config.Blog.Name => "blog:name")
請務必前往觀摩大師的程式碼
https://github.com/madskristensen/Miniblog.Core/blob/master/src/Constants.cs

結束試煉

string 是很常用到感覺很簡單 但是卻又很深奧的 這次應該有不少篇幅會以string為主題
今天的試煉就到這邊 下個試煉見

程式碼都是用LINQPad 5寫的應該複製貼上就可以執行

參考
What is wrong with magic strings?

 

如果內容有誤請多鞭策謝謝