如何處理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" 就很好處理了
還有像是下面的範例
if(saleCount > 9){/* 某些邏輯 */}
那個 9 在開發當下 一定很熟知用法 但是過了半年一年或是其他同事來看的話
會必須要想一下吧 所以給個適合的變數名稱像是
var minDisplaySaleCount = 9;
if(saleCount > minDisplaySaleCount){/* 某些邏輯 */}
如果在很特殊的知識時 我會直接用中文 與其打一堆我後來還要翻譯的英文 還是打中文好
( 前些時候看保哥的直播討論用中文在程式碼內 發現我並不孤單 )
那 minDisplaySaleCount 會不會到處用到 就可以是看情況建立 class + static readonly 去使用
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?