注册 登录  
 加关注

网易博客网站关停、迁移的公告:

将从2018年11月30日00:00起正式停止网易博客运营
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

为着理想勇敢前进

 
 
 

日志

 
 

大牛说  

2007-12-21 12:56:25|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
什么是程序?什么是数据?程序处理数据的时候,程序和它所处理的数
据的关系是什么?
我们知道,数据是程序的输入,而程序的输出则取决于输入。所以程序和函数基本上是同义词。但是问题在于,谁是谁的输入,谁是谁的输出,判断的标准是什么?比如我们写了一个 perl 脚本,接受一个文本文件作为参数,根据文本文件的内容输出一些东西,我们在控制台敲下一下内容:
foo.pl bar.txt
我们为什么说 foo.pl 是程序,而 bar.txt 是数据呢?仅仅是因为他们在命令行中的顺序不同吗?
那 么,假如我们写了一个 foo.pl 作为配置文件,定义并赋值了许多变量,然后用 eval 来运行 bar.txt 的内容,把定义的那些配置,作为参数传给 bar.txt 中的某个函数。这时候,到底 foo.pl 和 bar.txt 哪个是数据,哪个是程序呢?
这个例子会让人感到疑惑,原因在于用 foo.pl 作配置文件而用 bar.txt 来运行违背了我们的一个隐含假设:程序是不变的,而数据是易变的。
正因为数据是易变的,而程序是不变的,所以我们会说,数据是程序的"输入"。
程序和数据的关系,类似于底层库和上层库的关系,也类似于库和应用程序的关系。底层库是不变的,高层库是可变的;库是不变的,应用程序是易变的。
我们使用一些库来写代码的时候,我们认为这个代码比其所依赖的库更高层。这也就意味着高层代码提供输入数据或者说输入选项给其所依赖的底层库。
所以,我们用 IDE 编程的时候,和修改屏幕分辨率一样,都是在修改一些选项而已。编程之所以比修改屏幕分辨率更复杂,只是因为选项组合更多罢了。
一些 C++ 程序员,喜欢虚函数,他们说:"用了我这个牛叉的继承体系,你不用写 if(isClosed()){foo();} ,只用写 virtual onClosed() { foo(); } 就可以了。"
一些 Java 程序员,喜欢配置文件,他们不用 new ,他们用工厂模式,用反射,把那个类名写在 xml 文件里面。然后说:"你看,用了我这个牛叉的框架,你就不用写程序了,只需要改改 xml 里面的'选项'就行了。"
他们都是蠢人,他们做的都是无用功,因为他们不知道,写程序就是在设置选项,把选项从一处移到另一处根本不可能降低复杂度。降低复杂度的唯一方式就是减少选项,而减少选项的唯一方式就是把把不想改变的选项写死。
函数的参数是选项,函数调用的顺序是选项,数据结构也是选项。想要减少这些选项,就必须把函数的参数写死,把函数调用的顺序写死,把数据结构定死。你必须硬编码。除此以外所做的一切代码,都没用。
大牛说"机制(mechism)而不是策略(policy)"。机制就是硬编码,而策略就是绕圈子。
  评论这张
 
阅读(385)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018