您的位置:首页 > 产品设计 > UI/UE

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

2013-01-06 12:59 411 查看
接上篇。

第七步:需求变更外加挪地方新函数叫这个名字:位于class MFCUI之下。[csharp] view plaincopypublic static MvcHtmlString CheckBoxLink(WebViewPage page, string title, string parameter, string value)
{
var span = new TagBuilder("span");
var isParameterEmpty = !String.IsNullOrEmpty(page.ParameterOf(parameter));
span.InnerHtml +=
ImageLink(title,
page.MergeParameter(parameter, isParameterEmpty ? value : null),
imgUrl: isParameterEmpty? "/Others/Checked16.png" : "/Others/UnChecked16.png").ToString();
return new MvcHtmlString(span.ToString());
}
它始终返回一个链接,而不是由displayAsText切换为文字,也没有原来的[取消]了。

最终结果:1. 这是修改后的三次调用的差异(由三个<br>分割),注意从第二个修改到第三个所需成本很低,很容易全文搜索找到:[csharp] view plaincopy@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")
<br/>
@MFCUI.CheckBoxLink(this, "突出显示故事板上的状态", "highlight", "OnBoard")
我因为第一次开发和使用这个功能,所以痛下杀手把它挪到MFCUI里边了。如果自己在做重构的时候,@this.MergeParameter已经被用了几百遍了,那么建议调用接口不动,但@this.MergeParameter的内部改为(和MFCUI.CheckBoxLink一样,titleToCancel被直接扔了):
[csharp] view plaincopypublic static MvcHtmlString MergeParameter(this WebViewPage page, string title, string titleToCancel, string parameter, string value)
{
var span = new TagBuilder("span");
var isParameterEmpty = String.IsNullOrEmpty(page.ParameterOf(parameter));
span.InnerHtml +=
ImageLink(title,
page.MergeParameter(parameter, isParameterEmpty ? value : null),
imgUrl: isParameterEmpty? "/Others/Checked16.png" : "/Others/UnChecked16.png").ToString();
return new MvcHtmlString(span.ToString());
}
这样,这几百个调用的地方一行代码都不用动。当然,这种情况下仍然推荐再重新写一个MFCUI.CheckBoxLink,日后都用新的,旧的如果没有自动回归测试就别动了。

后记

1. 日后做Ajax的想法如果日后我们改成Ajax,基本上还是这一行调用,最多多几个参数。为什么?因为要传输的信息没有太大变化。那js代码放在哪里?写在一个公共的地方,设置上参数,然后由C#的helper里的JS代码调用就好了,相信无数个这种控件其实差别都很小,就几个参数的差别。2. PartialView?用@RenderPage或@Html.RenderPartial也能解决这个问题,原理大同小异,弄不好从容易写JS的角度说还好一些。可能我习惯C#超过Html吧。2. 关于信息隐匿大约10多年前,有一个国外的报告说:“近来编程技术带来的变化,与其说是来自面向对象,不如说是信息隐匿。”其实,信息隐匿是根本目的,面向对象是个工具。若不能把握这一点,就会造成用C++写C代码的状态;如果是Java或C#,则会写出冗余的难以维护的代码,好像面向对象了,但却不能信息隐匿。3. 哪个更好?更少的代码和更易读的代码?被问了一百遍的问题了。答案是更少的代码,以后有机会解释:)答案很简单,但解释太长,不是个简单的技术问题,涉及到团队结构、新手培养、师徒制度等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: