从if else到switch case再到抽象

作者:Cat Chen 来源:百度泛用户体验 时间:2010-11-05 18:30:00 

大家觉得在接手遗留代码时,见到什么东东是最让人感到不耐烦的?复杂无比的 UML ?我觉得不是。我的答案是,超过两个 else 的 if ,或者是超过两个 case 的 switch 。可是在代码中大量使用 if elseswitch case 是很正常的事情吧?错!绝大多数分支超过两个的 if else 和 switch case 都不应该以硬编码( hard-coded )的形式出现。

复杂分支从何而来

首先我们要讨论的第一个问题是,为什么遗留代码里面往往有那么多复杂分支。这些复杂分支在代码的首个版本中往往是不存在的,假设做设计的人还是有点经验的话,他应该预见将来可能需要进行扩展的地方,并且预留抽象接口。

但是代码经过若干个版本的迭代以后,尤其是经过若干次需求细节的调整以后,复杂分支就会出现了。需求的细节调整,往往不会反映到 UML 上,而会直接反映到代码上。例如说,原本消息分为聊天消息和系统消息两类,设计的时候自然会把这设计为消息类的两个子类。但接着有一天需求发生细节调整了,系统消息里面有一部分是重要的,它们的标题要显示为红色,这时候程序员往往会做如下修改:

在系统消息类上面加一个 important 属性

在相应的 render 方法里面加入一个关于 important 属性的分支,用于控制标题颜色
程序员为什么会作出这样的修改?有可能因为他没意识到应该抽象。因为需求说的是「系统消息里面有一部分是重要的」,对于接受命令式编程语言训练比较多的程序员来说,他或许首先想到的是标志位──一个标志位就可以区分重要跟不重要。他没想到这个需求可以用另一种方式来解读,「系统消息分为重要和不重要两种类别」。这样子解读,他就知道应该对系统消息进行抽象了。

当然也有可能,程序员知道可以抽象,但基于某些原因,他选择了不这样做。很常见的一种情况就是有人逼着程序员,以牺牲代码质量来换取项目进展速度──加入一个属性和一个分支,远比抽象重构要简单得多,如果要做10个这种形式的修改,是做10个分支快还是做10个抽象快?区别显而易见。

当然, if else 多了,就有聪明人站出来说「不如我们改成 switch case 」吧。在某些情况下,这确实能够提升代码可读性,假设每一个分支都是互斥的话。但是当 switch case 的数量也多起来以后,代码一样会变得不可读。

标签:分支,IF,编程
0
投稿

猜你喜欢

  • 利用XSLT把ADO记录集转换成XML

    2008-09-05 17:12:00
  • 定位后无法选择容器的内容解决方案

    2008-07-30 12:08:00
  • Access命令行参数

    2007-08-23 15:35:00
  • 用SQL语句删除重复记录的四种方法

    2011-05-03 09:25:00
  • 理解SQL SERVER中的逻辑读,预读和物理读

    2012-01-05 19:32:29
  • 使用NetBox 编译 asp 为exe应用程序

    2009-11-29 16:13:00
  • MYSQL教程:索引和查询优化程序

    2009-02-27 15:52:00
  • JavaScript中的64位加密及解密

    2009-12-23 19:10:00
  • DW MX 2004新功能:加密FTP

    2009-09-13 18:42:00
  • 定位?浮动?自适应?

    2008-06-30 14:20:00
  • 学习ASP.NET八天入门:第一天

    2007-08-07 13:08:00
  • 一个可应用在ASP 标记加密文件的MD5的DLL组件

    2008-04-12 07:21:00
  • 两行 JavaScript 代码

    2010-08-31 14:57:00
  • 以用户为中心的WEB表单

    2010-08-03 12:11:00
  • javascript基础之数组(Array)对象

    2008-06-25 13:32:00
  • 聚族索引、非聚族索引、组合索引的含义和用途

    2010-07-02 21:51:00
  • 如何实现上下翻页?

    2010-05-24 18:29:00
  • ASP用csDrawGraph组件制作饼图、柱状图

    2008-04-25 22:58:00
  • 在Oracle 8x实现自动断开后再连接

    2010-07-26 13:03:00
  • 浏览器右下角弹出提示窗口

    2008-10-30 12:37:00
  • asp之家 网络编程 m.aspxhome.com