作者:陈勇

出处:blog.csdn.net/cheny_com

这是编码简单性系列中的其中一篇,之前几篇包括代码篇/函数篇/语义篇。 因为要积累案例,会随时更新。

之前提到:编码简单性的“心法”就是:只要屏幕上有任何两部分代码看上去相似,则一定有合并办法。而说起相似,没有比switch - case的各段代码更相似的了。如果细数一下自己产品中最长的函数,里边几乎肯定的有一个switch - case,或者一堆if -else if(两者其实等同)。一般各段代码看似相同,又有点不同,既不能变成函数,也不能变成类,怎么办呢?

解决臭长的switch-case的最好方法,就是泛型(在C++时代叫做模板)。泛型不好学,但是却很重要。02年左右的时候曾经作为过程改进人员进行代码审查,无意中发现一段在pagedown的时候做波浪状起伏的代码,观察发现其中有65个函数其实可以缩减为1个函数(没错,65:1),其内容是在5种int常数下,处理13种不同的变量,而处理方法完全相同。这段代码共有4000行,已经耗时一个月,编程者月薪7000(那是10年前,7000元可以购买5平米小产权房,或2平米大产权房);当天下午它们就变成了1个函数,长度不足55行。据此推断,每年因为不能灵活使用泛型而造成的经济损失,可能达到亿元以上。


案例1 2011-05-27 一个简单泛型类

下面一段代码很简短,显得很不值得改造,但其实除了Display之外还有很多函数,其中一些case体很长,而且各种type日后层出不穷,因此不得不进行改造。

Display的目的,是让各种各样的udc们以自己的方式显示器Value中的数值:

public static MvcHtmlString Display(this HtmlHelper htmlHelper, UDC udc) { switch (udc.Type) { case "Text100": return new MvcHtmlString((udc.Value != null) ? udc.Value.ToString() : "NULL"); case "Text20": return new MvcHtmlString((udc.Value != null) ? udc.Value.ToString() : "NULL"); case "Date": return new MvcHtmlString(((DateTime)udc.Value).ToShortDateString()); default: return new MvcHtmlString(string.Format("Unknown UDC type: {0}", udc.Type)); } }

为了能够拆开这个函数,需要声明

public interface IUDC { …… MvcHtmlString Display { get; } …… }

然后让一个类(这个类一般都存在了)继承这个接口,并实现其方法:

public partial class UDCText100 : IUDC { …… public MvcHtmlString Display { get { return new MvcHtmlString((Value != null) ? Value.ToString() : "NULL"); } } …… }

而显示方式也从@Html.Display(udc)变成@udc.Display。

这段代码整个修改后,原来的5个switch-case只剩下1个,代码明显更内聚了,也就是每次增加一个类型,基本只需要在一个地方(partial class)内完成修改,就可以了;修改的成果在编译时就能确认是否充分和正确(而在其中switch-case中漏掉一个类型,只有在运行的时候case找不到才知道)。


 案例2 2011-05-29 泛型函数

private IUDC GetOrDefaultUDC<T, V>(Table<T> table, ..., V defaultValue) where T : class, IUDC, new() { var t = table.SingleOrDefault(...); if (t == null) { t = new T(); ... t.OValue = defaultValue; ... } return t; }

这个泛型函数从一类表中取出一条记录,如果没有,则创建它。由于创建的时候需要new 一个新的纪录,而且新纪录依据table的不同,某些字段的缺省值也不同。用传统的方法需要编写很多函数,而且每当出现一种新的这类表,又需要编写新的函数。本文开头提到的的那个65个函数就是因此而产生的。

处理这类情况的心法是:如果发现由于类型的差异一些看起来很像的代码无法合并为函数,那么就应该用泛型了

这种情况下用泛型需要掌握两种主要技术:new()和Ixxx(某Interface)。new的目的是让T可以创建(如果函数中不创建就不需要了),而Interface的目的是保证编译时刻就能确保未来的新类型依然可以使用这个函数(C++的时代只有用到新的类型的时候才可以确认)。


这里只谈泛型的应用思想,关于泛型的应用技术,在MSDN有一篇很好的文章可供参考:http://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx。此文将整个C#泛型的发展历程从头到尾讲了一遍。

点击下载免费的敏捷开发教材:《火星人敏捷开发手册》

转载于:https://www.cnblogs.com/JPAORM/archive/2011/05/27/2510499.html

C#编码简单性之泛型篇(如何编写简短的C#代码,随时更新)相关推荐

  1. C#编码简单性之语义篇(如何编写简短的C#代码,随时更新)

    以前写C++的时候曾经在自己网站上发表过一个编码"简单性"之文章,现在编写C#了才发现自己无意之间就会写下一些浪费屏幕的代码. 下面是自己编码中偶然发现的一些案例,欢迎中等水平的编 ...

  2. C#编码简单性之函数篇(如何编写简短的C#代码,随时更新)

    作者:陈勇 出处:blog.csdn.net/cheny_com 这是编码简单性系列中的其中一篇,之前几篇包括代码篇和语义篇. 因为要积累案例,会随时更新. 之前提到:编码简单性的"心法&q ...

  3. C#编码简单性之代码篇(如何编写简短的C#代码,随时更新)

    以前写C++的时候曾经在自己网站上发表过一个编码"简单性"之文章,现在编写C#了才发现自己无意之间就会写下一些浪费屏幕的代码. 下面是自己编码中偶然发现的一些案例,欢迎中等水平的编 ...

  4. 第一篇:“大集中”应用系统的结构和技术特点3——复杂性和简单性于一体

    大集中应用系统是复杂的,无论从技术.应用规模.业务关系等哪一个方面来看,都是这样的. 首先,框架结构的复杂性.所有大集中应用系统在建设过程中都要基于基础框架来开发,其目的是为了屏蔽底层的技术细节.为了 ...

  5. super go_Go 简单性的价值:来自对 Go 倍加青睐的谷歌软件工程师的自述

    点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 Go 语言最近几年逐渐获得越来越多的开发者的喜欢.在 Go 社区前不久刚刚庆祝Go诞生10周年生日之际 ...

  6. go定时器 每天重复_Go 简单性的价值:来自对 Go 倍加青睐的谷歌软件工程师的自述...

    点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 Go 语言最近几年逐渐获得越来越多的开发者的喜欢.在 Go 社区前不久刚刚庆祝Go诞生10周年生日之际 ...

  7. python3中字符串编码常见种类_Python基础篇—标准数据类型—String字符串编码问题...

    我要开始写String编码问题了...脑壳疼.. 在String字符串的第一篇末尾有留一个坑,就是关于中文字符串编码.整个编码的故事说起来都是很费劲的,我也只能把我所知道的梳理整理一下,在日常敲码过程 ...

  8. TensorFlow 2.0.0-RC0版发布,专注于简单性与易用性

    TensorFlow 2.0 RC0 发布了,2.0 专注于简单性和易用性,主要特性包括: 通过 Keras 和热切执行轻松建模. 在任何平台生产中进行稳健的模型部署. 强大的研究实验. 通过减少重复 ...

  9. 怎么简单的锁定文件夹_简单性与鲁棒性–在锁定文件处理中展示

    怎么简单的锁定文件夹 今天,我们将讨论使事情保持简单,愚蠢(KISS)和鲁棒性的设计价值之间,设计不足和过度设计之间的冲突. 我们正在编写一个批处理Java应用程序,需要确保在服务器上一次最多运行一个 ...

最新文章

  1. 机器学习理论之SVM
  2. CUDA性能优化----线程配置
  3. Python代码模块化!
  4. 记录Yii2代码调试中出现的两个问题(截图展示)
  5. ge linux安装apt_linux – 一个通用的bash脚本,用于安装apt-ge...
  6. 计算机术语翻译的最烂,我国计算机名词的翻译现状和建议
  7. 兄弟连Linux教学——第三讲 给初学者的建议
  8. 2022中国大数据产业发展白皮书(附下载)
  9. 应广单片机开发流程需要注意哪些?
  10. 小甲鱼老师目前所有视频教程下载地址
  11. 华为u8500刷机、、root
  12. HTML超大图片加载显示解决方案--图片切割转换成瓦片地图(BaiduMapTileCutter)
  13. 地震数据剖面图-matlab
  14. Multisim10中仿真时间步长与数码显示管的类型有关
  15. 易语言取MySQL错误代码_易语言mysql错误排查
  16. 特定偏好的效用函数——CES效用函数
  17. 【问链-EOS公开课】第六课 什么是石墨烯技术?
  18. PostgreSQL备份恢复之pgbackRest恢复
  19. 三星oneui主屏幕费电_三星One UI初体验,你想要的使用感受都在这里
  20. 基金投资好简单,从入门到精通 -学习笔记day8

热门文章

  1. 关于魔方里的工具修改方法
  2. 笔记.NET基础知识05
  3. [转]加密技术在企业数据安全中的应用
  4. iPhone girl幕后推手浮出 制造者为论坛站长
  5. Cannot find class [xxx] for bean with name ‘‘ defined in class
  6. 渗透测试攻击(一)Arp中间人攻击 伪装网关 截获 上网信息用户名密码
  7. python标准库学习笔记
  8. 克罗谈投资策略02_赢家和输家
  9. mysql从挂了数据怎么恢复_详解MySQL误操作后怎样进行数据恢复
  10. 利用Pandas库进行简单的数据规整