不要if else的编程

开发 项目管理
条件控制是编程中与生俱来的一种结构,但对于我来说,除了给我带来麻烦外,没有发现任何的用处。一次又一次,我不断发现,越少的if语句,越少的 switch语句,越少的循环,就会是越好的代码。通常这其中的原因是程序员用编程语言实现了更好的抽象归纳。

条件控制是编程中与生俱来的一种结构,但对于我来说,除了给我带来麻烦外,没有发现任何的用处。一次又一次,我不断发现,越少的if语句,越少的 switch语句,越少的循环,就会是越好的代码。通常这其中的原因是程序员用编程语言实现了更好的抽象归纳。他们并不是有意识的避免使用控制结构。但他 们确实做到了这些。

如果是使用一种面向对象编程语言,我们可以用多态(polymorphism)来代替switch。同样的技巧也能用在 if语句上,但如果逻辑太简单,这样做就有点得不偿失。当使用一种有函数式特征的编程语言时,大部分的循环执行任务我们都可以用 map,filter,fold等实现。控制结构最终从代码中消失,这是对代码大有好处的事。

条件控制结构的问题是,它很容易导致你把代码修改的乱七八糟。让我们看看下面一个简单的if语句:

  1. if ... 
  2.     ... 
  3.   else 
  4.     ... 
  5.   end  

代码中所有打省略号的地方都是你可以不断添加代码的地方。这些地方可以访问if外面的变量。这很容易造成高耦合。更糟糕的是,人们会习惯性的在条件 控制里嵌套条件。我见过的最糟糕的代码,里面的嵌套之深的就像是噩梦里的无底洞。我想,条件控制结构的真正问题所在是,它把各种任务混合到了一起。我相 信,你能从某种角度上看出,它是和任务单一编程原则相冲突的。

我们该怎么做?我们可不可以完全不要控制结构?我想不行,但我们可以做一些实验来看看如何能减少对它们的使用。通常这样做会让我们从中学到一些新技巧,让我们的代码更整洁。

不久前,我开发了一些Ruby程序,我需要写一个‘take’函数,用它从一个数组里取出一些元素。Ruby里有一些针对Enumerable的这样的函数,但我需要一些特殊的功能。如果我需要的数组的大小超出了目标数组的大小,需要把多余的数组空间都置为0。

这看起来可以用简单的if语句实现:

  1. def padded_take ary, n 
  2.    if n <= ary.length 
  3.      ary.take(n) 
  4.    else 
  5.      ary + [0] * (n - ary.length) 
  6.    end 
  7.  end 

让我们认真的看一看这段代码。它没有向我们显示任何填充动作的信息,没有显示数组跟填充的关系。如果认真看,可以看出其中的逻辑,但我们看不出这段代码的意图。

我们引入一些函数来让这段代码更清楚些,使用guard语句来简化if语句:

  1. def padded_take ary, n 
  2.    return ary.take(n) unless needs_padding?(ary, n) 
  3.    ary + pad(ary, n) 
  4.  end 

这个短小精悍,但不是更简单——我们可以使用一个null对象来去掉条件语句。空的数组就是很好的null对象。让我们在来一次。

我们不需要用一个条件语句来计算填充的长度。这个长度我们可以取两个数组中的***值,如果我们想要的长度超出了数组的长度,填充的长度就是它们的差值:

  1. pad_length = [0, n - ary.length].max 

有了这个长度,我们可以先填充数组,然后取出我们想要的元素:

  1. def pad ary, n 
  2.    pad_length = [0, n - ary.length].max 
  3.    ary + [0] * pad_length 
  4.  end 

于是,我们可以这样定义取出动作:

  1. def padded_take ary, n 
  2.     pad(ary, n).take(n) 
  3.   end 

我们通过先进行填充从而避免了使用if语句。当然,有时候填充的是一个空数组。

我不想去争论这样的写法是否比最初的if-then-else代码更简单,但现在的代码的意图更清晰了,而且我不认为这种策略在这种代码里使用是过度技术化。

从提取归纳的层面看,代码经过处理后的好处是明显的。当遇到更复杂问题时,它带来的益处将会更明显。

原文链接:http://michaelfeathers.typepad.com/michael_feathers_blog/2013/11/unconditional-programming.html

译文链接:http://www.aqee.net/unconditional-programming/

责任编辑:陈四芳 来源: 外刊IT评论
相关推荐

2013-11-28 10:22:37

编程结对编程

2021-03-04 21:57:12

Python编程语言计算

2012-05-24 10:29:54

编程程序员

2012-04-13 10:11:22

Java

2021-04-08 11:10:22

网络安全C语言if…else…

2015-06-04 09:43:59

代码注释编程

2018-03-15 09:23:24

编程语言程序员Java

2018-03-12 13:32:02

编程语言程序员语言

2013-03-06 10:28:57

ifJava

2011-05-23 16:23:18

Pythonelse

2017-08-02 06:10:07

Python编程语言for 循环

2023-06-02 07:30:24

If-else结构流程控制

2021-04-13 06:39:13

代码重构code

2021-02-25 09:35:32

语句elsePython

2021-03-10 07:20:43

if-else静态代码

2010-04-20 14:59:56

面试

2018-07-16 16:29:26

编程函数代码

2011-08-24 10:43:35

2011-05-27 16:58:19

2019-05-17 14:50:11

AI语言程序员
点赞
收藏

51CTO技术栈公众号