现在的位置: 首页 > 综合 > 正文

简单干净的C#方法设计案例:MFCUI.CheckBoxLink(三)

2013年09月16日 ⁄ 综合 ⁄ 共 2464字 ⁄ 字号 评论关闭
接上篇。

第七步:需求变更外加挪地方
新函数叫这个名字:位于class MFCUI之下。
[csharp] view plaincopy
  1. public static MvcHtmlString CheckBoxLink(WebViewPage page, string title, string parameter, string value)  
  2. {  
  3.     var span = new TagBuilder("span");  
  4.     var isParameterEmpty = !String.IsNullOrEmpty(page.ParameterOf(parameter));  
  5.     span.InnerHtml +=  
  6.         ImageLink(title,  
  7.                   page.MergeParameter(parameter, isParameterEmpty ? value : null),  
  8.                   imgUrl: isParameterEmpty? "/Others/Checked16.png" : "/Others/UnChecked16.png").ToString();  
  9.     return new MvcHtmlString(span.ToString());  
  10. }  

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

最终结果:
1. 这是修改后的三次调用的差异(由三个<br>分割),注意从第二个修改到第三个所需成本很低,很容易全文搜索找到:
[csharp] view plaincopy
  1. @MFCUI.ImageLink("突出显示故事板上的状态"this.MergeParameter("highlight""OnBoard"), displayAxTextUseCheckIcon : true, displayAsText: !String.IsNullOrEmpty(this.ParameterOf("highlight")))   
  2. if (!String.IsNullOrEmpty(this.ParameterOf("highlight")))  
  3. {  
  4.     @MFCUI.Link("[取消]"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 plaincopy
  1. public static MvcHtmlString MergeParameter(this WebViewPage page, string title, string titleToCancel, string parameter, string value)  
  2. {  
  3.     var span = new TagBuilder("span");  
  4.     var isParameterEmpty = String.IsNullOrEmpty(page.ParameterOf(parameter));  
  5.     span.InnerHtml +=  
  6.         ImageLink(title,  
  7.                   page.MergeParameter(parameter, isParameterEmpty ? value : null),  
  8.                   imgUrl: isParameterEmpty? "/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. 哪个更好?更少的代码和更易读的代码?
被问了一百遍的问题了。答案是更少的代码,以后有机会解释:)
答案很简单,但解释太长,不是个简单的技术问题,涉及到团队结构、新手培养、师徒制度等。

抱歉!评论已关闭.