架构,改善程序复用性的设计~第四讲 方法的重载真的用不到吗?

在第三讲中我们主要关注了代码重构的思想,从方法重构到类重构再到项目重构,这是一个过程,一种思想上的升华,今天将继续我们“程序复用性设计”的旅程,说一下方法重载的重要性。

细心的朋友一定会非常关注net frameworks的源代码,即使只能看到它内部方法的定义,也足够了,在System.Web.Mvc这个命名空间下定义了很多关于MVC架构的东西,我们就以它为例来说一下方法重载吧!

重载的好处:

1 对方法调用的程序员来说,它是友好的(程序员只关心自己调用的方法签名即可,不用管参数为NULL怎么办这些逻辑)

2 对于代码维护量来说,它是容易的(核心代码只放在参数签名最多的方法中)

3 对于代码扩展来说,它是直接的(只要修改核心方法代码即可,而不用一个方法一个方法的去COPY)

以下是InputExtensions类下的几个方法:

 1        public static MvcHtmlString CheckBox(this HtmlHelper htmlHelper, string name)
 2         {
 3             return htmlHelper.CheckBox(name, null);
 4         }
 5
 6         public static MvcHtmlString CheckBox(this HtmlHelper htmlHelper, string name, bool isChecked)
 7         {
 8             return htmlHelper.CheckBox(name, isChecked, null);
 9         }
10
11         public static MvcHtmlString CheckBox(this HtmlHelper htmlHelper, string name, IDictionary<string, object> htmlAttributes)
12         {
13             return CheckBoxHelper(htmlHelper, null, name, null, htmlAttributes);
14         }
15
16         public static MvcHtmlString CheckBox(this HtmlHelper htmlHelper, string name, object htmlAttributes)
17         {
18             return htmlHelper.CheckBox(name, ((IDictionary<string, object>) HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)));
19         }
20
21         public static MvcHtmlString CheckBox(this HtmlHelper htmlHelper, string name, bool isChecked, IDictionary<string, object> htmlAttributes)
22         {
23             return CheckBoxHelper(htmlHelper, null, name, new bool?(isChecked), htmlAttributes);
24         }
25
26         public static MvcHtmlString CheckBox(this HtmlHelper htmlHelper, string name, bool isChecked, object htmlAttributes)
27         {
28             return htmlHelper.CheckBox(name, isChecked, ((IDictionary<string, object>) HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)));
29         }
30         

我们看到这是一个在视图上建立复选框的方法,也是HtmlHelper类型的扩展方法,(即通过HtmlHelper的实例对象直接可以访问到这个方法),它提供了六个方法重载,程序员在使用时根据业务需求去调用,而在参数最少的方法中,直接为参数赋一个默认值即可。

我的项目中的方法重载:

以下是一个通过状态枚举类型,产生一个下拉列表框的扩展方法,它有两个重载方法,第一个是产生下拉列表 (public static MvcHtmlString StatusForSelectList(this HtmlHelper html)),第二个是在产生下拉列表时,给它设一个默认值( public static MvcHtmlString StatusForSelectList(this HtmlHelper html, int selectedValue)),这时使用方法重载就更友好,而另一种作法就是直接用一个方法代替,这对于调用方的程序员来说是不友好的。

下面是两个方式的实现:

不友好的方式:

 1         /// <summary>
 2         /// 状态字段下列列表框,要求调用方的程序员为它传送一个默认值,如0,即使写成int? selectValue,也会使程序员产生歧义
 3         /// </summary>
 4         /// <param name="html"></param>
 5         /// <param name="selectedValue">选中的项</param>
 6         /// <returns></returns>
 7         public static MvcHtmlString StatusForSelectList(this HtmlHelper html, int selectedValue)
 8         {
 9             StringBuilder sb = new StringBuilder();
10             sb.Append("<select name='Status' id='Status'>");//selectedValue等于0 ,然后去进行一个逻辑的实现
11             foreach (Status i in Enum.GetValues(typeof(Status)))
12                 if ((int)i == selectedValue)
13                     sb.AppendFormat("<option value='{0}' selected='selected'>{1}</option>", (int)i, ((Status)i).GetDescription());
14                 else
15                 {
16                     if (i == Status.Normal) sb.AppendFormat("<option value='{0}' selected='selected'>{1}</option>", (int)i, ((Status)i).GetDescription());
17                     else
18                         sb.AppendFormat("<option value='{0}'>{1}</option>", (int)i, ((Status)i).GetDescription());
19                 }
20             sb.Append("</select>");
21             return MvcHtmlString.Create(sb.ToString());
22        }

下面这种方式是我们提倡的,也是微软主推的:

 1         /// <summary>
 2         /// 状态字段下列列表框
 3         /// </summary>
 4         /// <param name="html"></param>
 5         /// <param name="selectedValue">选中的项</param>
 6         /// <returns></returns>
 7         public static MvcHtmlString StatusForSelectList(this HtmlHelper html, int selectedValue)
 8         {
 9             StringBuilder sb = new StringBuilder();
10             sb.Append("<select name='Status' id='Status'>");
11             foreach (Status i in Enum.GetValues(typeof(Status)))
12                 if ((int)i == selectedValue)
13                     sb.AppendFormat("<option value='{0}' selected='selected'>{1}</option>", (int)i, ((Status)i).GetDescription());
14                 else
15                 {
16                     if (i == Status.Normal) sb.AppendFormat("<option value='{0}' selected='selected'>{1}</option>", (int)i, ((Status)i).GetDescription());
17                     else
18                         sb.AppendFormat("<option value='{0}'>{1}</option>", (int)i, ((Status)i).GetDescription());
19                 }
20             sb.Append("</select>");
21             return MvcHtmlString.Create(sb.ToString());
22         }
23
24         /// <summary>
25         /// 状态字段下列列表框
26         /// </summary>
27         /// <param name="html"></param>
28         /// <returns></returns>
29         public static MvcHtmlString StatusForSelectList(this HtmlHelper html)
30         {
31             return StatusForSelectList(html, 100);
32         }

这使得代码很清晰,职责分明!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:架构,改善程序复用性的设计~第四讲 方法的重载真的用不到吗?,如需转载请自行联系原博主。

时间: 2024-10-30 15:25:33

架构,改善程序复用性的设计~第四讲 方法的重载真的用不到吗?的相关文章

架构,改善程序复用性的设计~第三讲 实现一种功能的代码只能出现在一处(续)

原文:架构,改善程序复用性的设计~第三讲 实现一种功能的代码只能出现在一处(续) 在写完架构,改善程序复用性的设计~第三讲 实现一种功能的代码只能出现在一处 ,这篇文章后,得到了园友的反馈,说这种简单的业务逻辑还可以,但业务比较复杂时,根据就没法用这种方法. 针对这个问题,我觉得有必要再写一个续集了,呵呵! 上回说的主要核心内容是将公用的部分从一个方法中提取出来,生成一个新的方法,这个重构中叫做"提取到方法",另外一个核心内容就是方法的"单一职责",即一个方法干一件

运行jar应用程序引用其他jar包的四种方法(转)

Runnable JAR  RunnableJAR(1)在Eclipse中操作 上面的截图中eclipse的版本是:   方案二:安装Eclipse打包插件Fat Jar      方案一对于含有较多第三方jar文件或含有第三方图片资源等就显得不合适,太繁琐.这时可以使用一个打包的插件-Fat Jar.      Fat Jar Eclipse Plug-In是一个可以将Eclipse Java Project的所有资源打包进一个可执行jar文件的小工具,可以方便的完成各种打包任务,我们经常会来

《重构:改善既有代码的设计》目录—导读

内容提要 重构:改善既有代码的设计 本书清晰揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以求改善.书中给出了70 多个可行的重构,每个重构都介绍了一种经过验证的代码变换手法的动机和技术.本书提出的重构准则将帮助你一次一小步地修改你的代码,从而减少了开发过程中的风险. 本书适合软件开发人员.项目管理人员等阅读,也可作为高等院校计算机及相关专业师生的参考读物. 版权声明 重构:改善既有代码的设计 Authorized translation from the

《重构:改善既有代码的设计》—第1章1.1节起点

第1章 重构,第一个案例 重构:改善既有代码的设计 我该从何说起呢?按照传统做法,一开始介绍某个东西时,首先应该大致讲讲它的历史.主要原理等等.可是每当有人在会场上介绍这些东西,总是诱发我的瞌睡虫.我的思绪开始游荡,我的眼神开始迷离,直到主讲人秀出实例,我才能够提起精神.实例之所以可以拯救我于太虚之中,因为它让我看见事情在真正进行.谈原理,很容易流于泛泛,又很难说明如何实际应用.给出一个实例,就可以帮助我把事情认识清楚. 所以我决定从一个实例说起.在此过程中我将告诉你很多重构的道理,并且让你对重

PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用_php技巧

思维导图 介绍 前几篇系列文章,我比较关注的是<PHP 杂谈<重构-改善既有代码的设计>之一 重新组织你的函数>,但是我觉得我还是没有说清楚,我自己也有很多不理解的地方,而且这篇是我的第一篇这方面的文章,有很多的纰漏,所以我会经常性的去做修改,如果大家有好的意见不妨告知一.二. 今天谈得是"接口",此接口非"Interface",而是一个统称.我们一般可以把供别人使用的函数或者url(一般是用于提供数据)叫接口.--可能还有别的意思,毕竟我现

《架构师》反思:软件架构设计

最近在看<软件架构师教程>,今天就第五章<软件架构设计>总结一下,其中还有自己所联想到的.主要从以下几个方面来描述: 软件架构 ABSD 架构模式 DSSA 架构评估   软件架构 架构的定义,在业界,目前主要分为两类:结构派 和 策略派.结构派认为架构是指软件中各构件的组织结构以及各构件之前的相互关系.策略派认为软件的架构设计是要为软件的每个重要的决择进行权衡,并作出最终决定. 架构,作为系统中最重要的组成部分,对整个系统有着重要的作用: 对于软件开发而言,首先,架构设计能使系统

saas 云 异构-【系统设计】如何把公司所有不同需求的业务系统集中管理,而且减少代码冗余,保证代码复用性高了?

问题描述 [系统设计]如何把公司所有不同需求的业务系统集中管理,而且减少代码冗余,保证代码复用性高了? 如题所讲,谢谢各位大神!没有金币了,不好意思啊.. 希望大家都能给点思路,谢谢! 还有,在这里想向大家咨询一个问题,saas-当前市场如何在做了?有实例最好,谢谢 解决方案 宏观层面上来说,你可以用单点登录等把用户和权限从所有系统中拿出来 微观上说,你可以用aop(面向方面编程)来将程序中相同的逻辑从代码中抽出. saas主要是指你的系统要能承载多租户的用户环境.这个取决于市场需求,对于定制化

[原创].NET 分布式架构开发实战之二 草稿设计

原文:[原创].NET 分布式架构开发实战之二 草稿设计 .NET 分布式架构开发实战之二 草稿设计   前言:本篇之所以称为草稿设计,是因为设计的都是在纸上完成的.反映了一个思考的过程. 本篇的议题如下:   1. 第一个数据层草图的提出 2. 对数据访问层的思考 3. 第二个数据层草图的提出   系列文章链接:  [原创].NET 分布式架构开发实战之一 故事起源 [原创].NET 分布式架构开发实战之二 草稿设计 [原创].NET 分布式架构开发实战之三 数据访问深入一点的思考 [原创].

《重构:改善既有代码的设计》—第2章2.1节何谓重构

第2章 重构原则 重构:改善既有代码的设计 前面所举的例子应该已经让你对重构有了一个良好的感受.现在,我们应该回头看看重构的关键原则,以及重构时需要考虑的某些问题. 2.1 何谓重构 我总是不太喜欢下定义,因为每个人对每样东西都有自己的定义.但是既然在写书,总得选择自己满意的定义.在重构这个概念上,我的定义以Ralph Johnson团队和其他相关研究成果为基础. 首先要说明的是:视上下文不同,"重构"这个词有两种不同的定义.你可能会觉得这挺烦人的(我就是这么想的),不过处理自然语言本