接上篇。

第七步:需求变更外加挪地方

新函数叫这个名字:位于class MFCUI之下。

[csharp] 
​​view plain​​​
​​​copy​​
1. public static MvcHtmlString CheckBoxLink(WebViewPage page, string title, string parameter, string value)
2. {
3. new TagBuilder("span");
4. var isParameterEmpty = !String.IsNullOrEmpty(page.ParameterOf(parameter));
5. span.InnerHtml +=
6. ImageLink(title,
7. null),
8. "/Others/Checked16.png" : "/Others/UnChecked16.png").ToString();
9. return new MvcHtmlString(span.ToString());
10. }

它始终返回一个链接,而不是由displayAsText切换为文字,也没有原来的[取消]了。



最终结果:

1. 这是修改后的三次调用的差异(由三个<br>分割),注意从第二个修改到第三个所需成本很低,很容易全文搜索找到:

[csharp] 
​​view plain​​​
​​​copy​​
1. @MFCUI.ImageLink("突出显示故事板上的状态", this.MergeParameter("highlight", "OnBoard"), displayAxTextUseCheckIcon : true, displayAsText: !String.IsNullOrEmpty(this.ParameterOf("highlight")))
2. if (!String.IsNullOrEmpty(this.ParameterOf("highlight")))
3. {
4. "[取消]", this.MergeParameter("highlight", null))
5. }
6. <br/>
7. @this.MergeParameter("突出显示故事板上的状态", "[取消]", "highlight", "OnBoard")
8. <br/>
9. @MFCUI.CheckBoxLink(this, "突出显示故事板上的状态", "highlight", "OnBoard")


我因为第一次开发和使用这个功能,所以痛下杀手把它挪到MFCUI里边了。如果自己在做重构的时候,@this.MergeParameter已经被用了几百遍了,那么建议调用接口不动,但@this.MergeParameter的内部改为(和MFCUI.CheckBoxLink一样,titleToCancel被直接扔了):


[csharp] 
​​view plain​​​
​​​copy​​
1. public static MvcHtmlString MergeParameter(this WebViewPage page, string title, string titleToCancel, string parameter, string value)
2. {
3. new TagBuilder("span");
4. var isParameterEmpty = String.IsNullOrEmpty(page.ParameterOf(parameter));
5. span.InnerHtml +=
6. ImageLink(title,
7. null),
8. "/Others/Checked16.png" : "/Others/UnChecked16.png").ToString();
9. return new MvcHtmlString(span.ToString());
10. }

这样,这几百个调用的地方一行代码都不用动。



当然,这种情况下仍然推荐再重新写一个MFCUI.CheckBoxLink,日后都用新的,旧的如果没有自动回归测试就别动了。


后记


1. 日后做Ajax的想法


如果日后我们改成Ajax,基本上还是这一行调用,最多多几个参数。


为什么?因为要传输的信息没有太大变化。


那js代码放在哪里?写在一个公共的地方,设置上参数,然后由C#的helper里的JS代码调用就好了,相信无数个这种控件其实差别都很小,就几个参数的差别。


2. PartialView?


用@RenderPage或@Html.RenderPartial也能解决这个问题,原理大同小异,弄不好从容易写JS的角度说还好一些。可能我习惯C#超过Html吧。


2. 关于信息隐匿


大约10多年前,有一个国外的报告说:“近来编程技术带来的变化,与其说是来自面向对象,不如说是信息隐匿。”


其实,信息隐匿是根本目的,面向对象是个工具。若不能把握这一点,就会造成用C++写C代码的状态;如果是Java或C#,则会写出冗余的难以维护的代码,好像面向对象了,但却不能信息隐匿。


3. 哪个更好?更少的代码和更易读的代码?


被问了一百遍的问题了。答案是更少的代码,以后有机会解释:)


答案很简单,但解释太长,不是个简单的技术问题,涉及到团队结构、新手培养、师徒制度等。