这几周在紧张的准备期中考试,在读书上进度有所缓慢

本次读后感如下:

重复的危害

  给予计算机两项自相矛盾的知识,是James T. Kirk舰长(出自Star Trek,“星际迷航”——译注)喜欢用来使四处劫掠的人工智能生命失效的方法。遗憾的是,同样的原则也能有效地使你的代码失效。
  我们觉得,可靠地开发软件、并让我们的开发更易于理解和维护的惟一途径,是遵循我们称之为DRY的原则:系统中的每一项知识都必须具有单一、无歧义、权威的表示。

重复是代码中最坏的味道,大家可以回想一下,有多少Bug是因为重复代码漏改引起的,修改重复代码又浪费了多少时间。这么坏的东西一定要深恶痛绝!书中归纳了几种常见的重复类型:

强加的重复(imposed duplication)。开发者觉得他们无可选择——环境似乎要求重复。强加的重复细分为四类:

  • 信息的多种表示。举个例子,QT的语言源文件是(.ts文件),会由QT工具编译为.qm文件提供给应用程序使用。现在PC千牛把这两个文件都提交到了SVN,而不是只提交.ts文件然后动态生成.qm文件。因为漏提交.qm文件已经出过几次文案显示异常的Bug。解决这类重复很简单,保证单一数据源,其它的表示方式都通过根据这个数据源自动生成。办法是有了,但真能保证做到吗?
  • 代码中的文档。DRY法则告诉我们,要把低级的知识放在代码中,它属于那里;把注释保留给其他的高级说明。否则,我们就是在重复知识,而每一次改变都意味着既要改变代码,也要改变注释。注释将不可避免地变得过时,而不可信任的注释比完全没有注释更糟。逻辑清楚的代码自身就是最好的注释,除非是诡异的商业需求、不得已的临时解决方案抑或是在困难问题前屈服后使用的非常规方案。所以只有糟糕的代码才需要许多注释。
  • 文档与代码。程序员们通常都有乖乖写文档的经历,但往往很难坚持,总有一天代码更新了,因为各种各样的理由,文档没有同步。所以在准备提供文档时请下定决心与做出承诺:保证要与代码进行同步的更新。
  • 语言问题。就像C++的.h和.cpp文件,声明与实现就在重复着相同的内容。为了达到模块实现与接口分离的目的,就会出现这类重复。没有简单的技术手段避免,好在信息不一致编译期间会有错误。理想的做法是接口文件能通过实现文件自动生成。