本港台开奖现场直播 j2开奖直播报码现场
当前位置: 新闻频道 > IT新闻 >

码报:一个程序员的审美情感(3)

时间:2017-08-06 15:33来源:668论坛 作者:118开奖 点击:
可见,简化是一切艺术的不二法门。艺术是通过有意味的形式来传递超越语言的表达能力和表达范畴的信息,只可意会,不可言传。因此,只有那些和有意

可见,简化是一切艺术的不二法门。艺术是通过有意味的形式来传递超越语言的表达能力和表达范畴的信息,只可意会,不可言传。因此,只有那些和有意味的形式相关的细节才值得保留。而所有可用语言描述的内容都是无关的,必须删去。

Apple 公司的产品向来以艺术性的设计著称于世。而 Apple 公司奉之若圭臬的设计理念就是简单,力求做到无论是老妇还是稚童皆能很容易的理解和使用 Apple 的产品。在 Apple 公司早期的宣传手册中就明确写道:

“Simplicity is the ultimate sophistication.”

简单的设计必须让产品的外形体现出产品的本质,其他一切皆是多余,为此,必须谨慎的用心处理每一处细节。比如手机的显示器是呈现信息的介质,要在有限的空间尽量最大可能地增加它的面积。强调简单和注重细节现在变成了一切互联网公司产品设计的座右铭。

找到问题的最直接有效的解决方案就是程序员可以创造的简单。在这方面,编程语言的设计是个典型的例子。一般地,编程语言设计的重心是定义数据和过程的最基本的表示,操作与组合,这构成了语言的基础部分,不能也不会轻易改变。而语言的高层次的功能如各种应用程序库都可以从这些基础元素派生而来。数论和欧氏几何都只有五条公理作为基础,其他所有的定理可以从这五条公理中推导出来。类似地,一方面,我们希望编程语言的基础元素越少越好,简单且容易理解;另一方面,又必须要保证这些基础元素足够强大和灵活,能够支撑起语言的其他部分以开发出有用的软件功能。

处理这种简单与强大的冲突的做法还是抽象,把貌似不一样的东西看做一样的东西。比如,scheme 是 lisp 的一种方言,它把过程当作数据,反过来,把数据当作过程。如果过程可以用变量命名,可以用作过程的参数,可以作为过程的结果返回,可以包含在数据结构中,那么过程不就是数据吗?过程抽象为数据,就可以像数据一样被操作。我们引用 MIT 计算机教材《计算机程序的构造和解释》(Harold Abelson, Gerald Jay Sussman, Julie Sussman 著,裘宗燕译) 中的一个平凡的例子来说明过程怎样象数据一样被用作过程的参数:

(define (map proc items) (if (null? items) nil (cons (proc (car items)) (map proc (cdr items)))))

map 根据传递给它的过程参数 proc,对表 items 中的元素做不同的操作。比如,返回表中元素的平方:

(map (lambda (x) (* x x)) (list 1 2 3 4))

结果是:(1 4 9 16)

对每个元素乘一个倍数:

(define (scale-list items factor) map (lambda (x) (* x factor)) Items)) (scale-list (list 1 2 3 4) 10)

结果是:(10 20 30 40)

proc 作为 map 的参数,建起了一道抽象屏障,把对表中元素的处理的过程从提取表的元素 (car) 和组装处理的结果 (con) 的过程分离开来。这样,我们就不需要针对不同的表处理写不同的过程,而只要把对元素的处理过程如平方和倍乘作为参数传递给 map 即可。抽象把变的东西 (表中元素的处理) 和不变的东西 (提取表的元素和组装处理后的结果) 分开来,不变的东西是可重用的,保证了一致性;变的东西是可定制的,提供了灵活性。

另外,schema 把数据看作是满足一组约束条件的过程。如整数、有理数、实数和复数都支持加减乘除的算术操作,于是,把他们统统抽象为支持加减乘除过程的数。上层应用在对这些数做加减乘除的操作时,底层的实现会根据数的类型,调用不同的过程。这听起来,其实就是面向对象编程语言的虚函数、纯虚函数和抽象类这一系列概念的滥觞。

赋予过程一个抽象的名字,过程可以调用其他过程,也可以被其他过程调用。这样,软件就能够实现为由下至上的不同层次,不同的层次使用不同级别的抽象语言。上层的过程调用下层的过程,只要下层提供的接口不变,即使实现改变了,也不会影响上层的功能。同样的道理,软件模块化也是过程抽象的结果。毫无疑问,层次和模块化是管理软件复杂性基础。

过程还可以调用自身,即为递归。自己调用自己,多少让人感到不安。实际上,递归不仅仅是编程语言的功能,更为重要的是,递归是程序员特有的思维的工具和表达的方法,简洁而优雅,许多著名的算法都离不开递归,如回溯算法,快速排序算法,分而治之算法,深度优先搜索算法等。lisp 中大量使用递归,甚至用递归替代循环。

(责任编辑:本港台直播)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容