說明:本人不是.net/Html/Ajax/Jquery....高手,所以經常用C#做一些這些技術能做的事情!本文僅用來說明如何簡化設計之用。如果出現具體技術問題,請大家按自己的實際情況理解。
問題
假設想在螢幕上做這樣一個功能(而且有很多這樣的需要):
在當前頁面http://localhost:53979/Agile/StoryBoard/TeamStoryBoard?teamID=103中有一個連結:
連結通往http://localhost:53979/Agile/StoryBoard/TeamStoryBoard?teamID=103&highlight=OnBoard
點一下前往此頁面,而連結外觀變成:
前面的表徵圖、文字發生變化,而後面的[取消]的url變成:http://localhost:53979/Agile/StoryBoard/TeamStoryBoard?teamID=103
這個參數的差異,將產生若干顯示上的變化,具體不說了,估計大家也遇到過這種情況。
一種簡單的做法是用JQuery直接調整顯示,不過我們還有一些特殊的需要,需要重新組織Model,所以現在是用Url實現的。
下面看看如何用一行代碼實現這個功能。
注意實際需求五花八門,我們未來也會換技術方案比如Jquery,這裡僅僅作為例子說明。但無論用什麼技術,這裡仍然是1行代碼,等等說明為什麼可以這麼確定。
方案1先看看最開始的實現,是基於我們現在已經有的一些函數做的,實現如下:
@MFCUI.ImageLink("反白故事板上的狀態", this.MergeParameter("highlight", "OnBoard"), displayAsText: !String.IsNullOrEmpty(this.ParameterOf("highlight")) , displayAxTextUseCheckIcon : true) if (!String.IsNullOrEmpty(this.ParameterOf("highlight"))) { @MFCUI.Link("[取消]", this.MergeParameter("highlight", null)) } MFCUI.ImageLink和Link是我們之前做的通用連結函數,調用中的參數表明文字是“反白……”,連結是this.MergeParameter(...),使用“url中是否有highlight這個參數了"將其切換為普通文字或Url,且使用預設的Check和UnCheck表徵圖。
this是WebViewPage,給它做了2個helper,一個ParameterOf,問某個參數等於幾的;另外一個MergeParameter,設定或消除(取值null)某個參數的。
另:實際上WebViewPage.Request[]能做類似這個,開始我們不知道,自己做了一個。後來發現我們做的那個能處理Ajax返回的頁面(和我們的業務需要有關,涉及到Request.UrlReferrer),所以就沒改回來。用這個[]也是三行代碼。具體裡邊的做法不在本文討論之列,總之這樣就算功能實現了,不過,這算是3行代碼,不是一行。分析怎麼知道自己編碼編多了?三行代碼未必少,十行代碼未必多,但要有個標準。我們現在在用的標準大致如下:
1. 某些代碼常常以一種組合被拷貝來拷貝去比如上面這三行,如果有十個這種切換控制項,就有10×3行,就是多。
2. 在這些代碼中,還有重複的地方,每次拷貝或修改,都要心存謹慎比如上面三行中,"highlight"出現過3次,每次都要寫成一樣的;this.ParameterOf也有兩次
3. 拷來拷去,有些地方其實不用修改,但卻“能修改”(因此危險)比如前面這三行代碼,displayAsTextUseCheckIcon永遠是true,後面那個null也永遠是null。一旦不小心被修改了,不容易看出來,測試的時候也未必每次都有人好心點一下(其實,需要測試才能發現問題,本身就是個問題!)。怎麼辦?
要找最簡資訊集,就是每次調用實際所需的資訊有哪些,哪些是冗餘的。做了這麼多年,我自己也不太能第一次合著眼寫出來一個最簡的介面,發現若先把複雜的寫出來(比如上面的三行)再簡化,就容易得多。下面用方案2來看整個過程(待續)