简单干净的C#方法设计案例:MFCUI.CheckBoxLink(三)
原创
©著作权归作者所有:来自51CTO博客作者火星人陈勇的原创作品,请联系作者获取转载授权,否则将追究法律责任
接上篇。
第七步:需求变更外加挪地方
新函数叫这个名字:位于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. 哪个更好?更少的代码和更易读的代码?
被问了一百遍的问题了。答案是更少的代码,以后有机会解释:)
答案很简单,但解释太长,不是个简单的技术问题,涉及到团队结构、新手培养、师徒制度等。