2014年6月4日 星期三

基本題 - C# 西元年轉換民國年,能直接使用 source.Year - 1911 嗎?

前面幾篇有講到西元年轉換民國年格式字串的內容,因為我是使用 TaiwanCalendar 類別之後, 然後年份的地分直接使用 taiwanCalendar.GetYear(source) 的方式來取得,但這個地方的處理不能直接使用 source.Year - 1911 嗎?

當然你可以這麼用,而且你要清楚知道這麼用的原因,而且要確保開發團隊的成員都知道這麼做的原因,甚至於你也要確保日後接手維護的開發人員也能夠知道,不然哪天出現一個天真純潔的開發人員看到這樣的程式,就會想說為何不用 source.AddYears(-1911) 來處理呢?程式不是更加簡潔、漂亮嗎?當出現這樣的狀況時,抓蟲、找問題又將會是一場令人惱怒的過程。

 


以下是兩種作法的處理方式:

image

看起來第二種作法是比較簡單一些,因為可以少打好幾個字,而且不需要特別去記得 TaiwanCalendar 類別以及怎麼用,但是如果有個剛接手維護程式的開發人員看到這樣的程式,或許會想用 AddYears() 的方式來做修改,那麼在閏年來到的時候就會出現問題,

image

 

如果你想要自訂輸出的字串格式的時候,如果是以單獨處理年份的方式,程式的寫法有可能會比使用 CultureInfo 加 TaiwanCalendar 的方式來得簡單,

image

上面的內容看起來是直接將西元年的年份減去 1911 的程式比較簡單,但是擴充性就不見得那麼好,以下是建立擴充方法的方式,然後使用 CultrueInfo 加 Taiwancalendar,而格式化的字串內容是可以讓使用者自己傳入,自己決定輸出的格式內容,如下:

image

 

其實兩種作法都可以,只要讓你的開發團隊成員甚至是後續接手維護的開發人員能夠清楚知道,無論那一種作法都是可行的;至於我的話,我還是會選擇使用 TaiwanCalendar 加 CultrueInfo 的作法,以一致性的作法來處理,避免例外以及錯誤、修改所衍生的問題。

 

以上

2 則留言:

  1. 這篇文章看似簡單沒什麼了不起,卻是非常實用的一篇。
    小弟最近剛好碰到要轉換民國的範例,腦子馬上就想到曾經看過這篇。
    只可惜 Google 搜尋此種文章,雖在第一頁顯示出來,但卻列在下面,希望可以往前推一點,讓更多人看見。

    謝謝你的範例,真的很實用。

    回覆刪除
    回覆
    1. 感謝你的回應,類似的文章已經有許多前輩在之前就已經寫過了,所以就排不到前面。

      刪除

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。