方案2
第一步:寫一個新的函數名在原來的代碼下面
第二步:把原來的代碼拷貝到下面兩步下來,
@this.MergeParameter( @MFCUI.ImageLink("反白故事板上的狀態", this.MergeParameter("highlight", "OnBoard"), displayAxTextUseCheckIcon: true, displayAsText: !String.IsNullOrEmpty(this.ParameterOf("highlight"))) if (!String.IsNullOrEmpty(this.ParameterOf("highlight"))) { @MFCUI.Link("[取消]", this.MergeParameter("highlight", null)) }
第三步:從函數括弧後面開始刪除不想暴露的資訊,能“活下來”的,就是真正的參數。刪除的結果:
@this.MergeParameter("反白故事板上的狀態", "[取消]", "highlight", "OnBoard")
其他的要麼總是一個值,要麼重複了。
問題來了:如果一個參數多數時候是某個值,而其他時候則是另外一個怎麼辦?用預設參數。比如我們的ImageLink居然只有Url而沒有ImageUrl,怎麼知道顯示什麼圖片呢?因為如果url是http://localhost:53979/Agile/StoryBoard/TeamStoryBoard?teamID=103&highlight=OnBoard,而且又沒有指定ImageUrl(是個預設參數),我們會嘗試使用http://localhost:53979/
Resources/Images/Agile/StoryBoard/TeamStoryBoard16.png,這樣如果能把表徵圖全部井井有條地放在目錄裡邊,每個串連都會自動去搜尋自己的表徵圖,除非刻意指定(我們只有10%情況需要指定)。這種做法就可以實現90%情況下的
資訊隱匿。
第四步:建立這個函數,並把三行代碼拷貝到裡邊
public static MvcHtmlString MergeParameter("反白故事板上的狀態", "[取消]", "highlight", "OnBoard") { @MFCUI.ImageLink("反白故事板上的狀態", this.MergeParameter("highlight", "OnBoard"), displayAxTextUseCheckIcon : true, displayAsText: !String.IsNullOrEmpty(this.ParameterOf("highlight"))) if (!String.IsNullOrEmpty(this.ParameterOf("highlight"))) { @MFCUI.Link("[取消]", this.MergeParameter("highlight", null)) } }
第五步:動手改造
public static MvcHtmlString MergeParameter(this WebViewPage page, string title, string titleToCancel, string parameter, string value) { var span = new TagBuilder("span"); span.InnerHtml += MFCUI.ImageLink(title, page.MergeParameter(parameter, value), displayAxTextUseCheckIcon: true, displayAsText: !String.IsNullOrEmpty(page.ParameterOf(parameter))).ToString(); if (!String.IsNullOrEmpty(page.ParameterOf(parameter))) { span.InnerHtml += MFCUI.Link(titleToCancel, page.MergeParameter(parameter, null)); } return new MvcHtmlString(span.ToString()); }
第六步:測試注意測試的時候保留原來的代碼,重新開一行:
@MFCUI.ImageLink("反白故事板上的狀態", this.MergeParameter("highlight", "OnBoard"), displayAxTextUseCheckIcon : true, displayAsText: !String.IsNullOrEmpty(this.ParameterOf("highlight"))) if (!String.IsNullOrEmpty(this.ParameterOf("highlight"))) { @MFCUI.Link("[取消]", this.MergeParameter("highlight", null)) } <br/> @this.MergeParameter("反白故事板上的狀態", "[取消]", "highlight", "OnBoard")
好處是隨時可以比照代碼看看有什麼問題。
整個1~6步過程花費了10分鐘,測試成功了,不過……我們發現當看到這個介面時,自己一點都不想點擊那個取消,而是想點擊那個Check表徵圖:所以,能不能改成去掉“取消”,直接點擊Check表徵圖?完了,需求變更,全泡湯了。另外:@this.MergeParameter(...)這個函數名字也不倫不類,誰猜得到要產生一個連結需要用this(WebViewPage)的函數呢?所以應該改一下位置。完了,設計重構,全泡湯了。
很可惜,這是開發的常態,就是需求總是在變化,設計總是在重構!關鍵在這時候,我們是想面對一行代碼,還是散裝的幾行代碼?(如果沒有ImageLink,會有更多代碼)何況裡邊還有很多重複的,可能需要改動和不需要改動的地方。
這就是資訊隱匿的目的:盡量把再次調用、需求變更、設計重構的時候,安全、高效地修改最少的地方、最少的文字。
怎樣修改,請看下篇。