Reload Original PagePrint PageEmail Page

The Man Who Wasn't There » 给众大师所提倡的代码风格唱唱反调

给众大师所提倡的代码风格唱唱反调
2010-12-05 15:15:58

现在已经有两个这样的论断似已成为共识:

1 简短的不重复的代码就一定强过啰嗦的代码。
2 声明式代码一定强于命令式代码。

很可惜,这两个论断,在我看来,在不少的场合都不成立,反对的方式也很明确:

1 简短的不重复的代码不一定比啰嗦的代码易懂。
2 声明式代码也未必就比命令式代码易懂。

这里用来反对这两个论断的是我称之为最高原则的“易懂”。

“简短不重复”很容易与“易懂”发生冲突,比如一些大公司的产品说明书,要求高到仅仅识字的人就能够看懂,这导致一些啰嗦,重复的说法。如果要求是用最简短的话将功能做一说明,内文到处是引用参见,像形式系统一样严密,估计能看懂的也就没几个人了。

适当的啰嗦,实际上,对提高易懂程度起到的是很正面的作用。

人脑的思维方式很大程度上就是命令式的,大脑很很容易的记住一个过程,但很难进行多变量的逻辑推理和数学计算。对声明式风格的强加运用,带来编码难度的大大提高,也也就是为什么lisp虽然在范式上大大超越各种编程语言,却一直没有进入软件工业的主流。

有人肯定要提出强烈的反对意见,例如在面向变化和重构方面,命令式代码一直就面临难题,是的,很大程度上是因为现有软件生产力工具的局限,才导致了这样一个局面,而上述的两个原则,只是软件灵活性增强逼得大家不得不想出来的一个权宜之计,也谈不上是解决问题的灵丹妙药。

真正的灵丹妙药是…. ….我已经写了这么多日记了,这是我心目中的银弹。

15人浏览 > 修改 > 删除
推荐

2010-12-05 15:23:15: whig (清晨听自己说梦话)
同意
> 删除

2010-12-05 15:26:34: zhang3 (the man who wasn’t there)
我要拿这个去激起公粪了
> 删除

2010-12-05 20:21:10: 超级无敌大灰猫
软件盲,代码盲,飘过
> 删除

2010-12-06 10:21:06: 船长 (每一天太短 只能做相对要紧的事)
看了这篇又受益了
几乎所有的计算机的硬件工作都是命令式的
声明式:是什么或者需要做出什么 命令式:怎么做
> 删除

2010-12-06 15:31:53: alex00zoe (大繁至简)
命令式是人类一出生刚睁眼睛就会的方式。
而恂恂善诱的以对方为出发点的教育方式,则不是所有人都能掌握的。一般人的情况下,至少需要自己比对方高出一个数量级,才会有足够的底气和自觉去使用这种同理心。
> 删除

2010-12-06 15:33:01: zhang3 (the man who wasn’t there)
悟空,你第二段又跑题了
> 删除

2010-12-06 15:54:35: alex00zoe (大繁至简)
你说我嘛?呵呵。我是说对人来说,要掌握声明式方法的难度,高于命令式方法的难度。
命令式方法就相当于整个世界的逻辑都在我的自己的脑海内部,你只需要执行就可以了,至于你能不能执行,执行地好不好,是另一个问题。
而声明式方法就相当于我要为你描述出你所需要关注的那个子世界的逻辑关系和内在构造,然后再告诉你怎么做。
很显然,对于计算机来说,因为目前它们并不真正具备直接对世界产生观察和感知的能力,所有人类必须对于计算机所处理的某个子领域,子世界的逻辑联系和逻辑构造进行充分和完全的建模。这就是说声明式的工作,在概念上是不可避免的。
而一旦当这一工作完成之后,比如说我们拥有了一个画图的函数库之后。接下来的事情就比较偏向于命令式了,我们让它怎么画就怎么画,让它画成什么样就画成什么样。
但是其实两者的意义也是完全等价的。构造画图库的过程也就是命令式的告诉要怎么响应画图命令的过程。而是用画图库画图的过程也就是声明式地描述我们要画的图的内部构造和逻辑。不过如果我们没有一个画图库在先的话,大家做起事情来,无论是给命令,还是更高层次的给声明,都是很麻烦的。一堆不熟练工人在那里,到最后你还是得去教他们。
> 删除

2010-12-06 16:04:38: zhang3 (the man who wasn’t there)
其实我现在觉得区分很简单:
有时间概念的是命令式,没有时间概念的是声明式。
线性的语句可交换的是声明式,不可交换的是命令式。
> 删除

2010-12-06 16:09:58: alex00zoe (大繁至简)
这倒也是一个很好的视角呀。好像数学模型描述的东东确实比较偏向于声明式,没有先后顺序的。而物理规律所产生的作用则是完全声明式的,全时刻作用,没有时间之分的。
> 删除

2010-12-06 16:17:13: 船长 (每一天太短 只能做相对要紧的事)
可交换的是声明式,不可交换的是命令式。
这个要宽泛的说吧
对 数学一般关注的重点是 “声明”