<!doctype html>
程序员修炼之道(二)
读书笔记--第三周
第二章 注重实效的途径
DRY原则:系统中的每一项只是都必须具有单一、无歧义、权威的表示。
强加的重复:
信息的多重表示。编写简单的过滤器或代码生成器,可以在每次构建软件时,使用简单的代码生成器,根据公共的元数据表示构建多各种语言下单的结构。可以根据在线数据库schema、或是最初用于构建schema的元数据,自动生成类定义。这本书就是一个例子:这本书中摘录的代码,由预处理器在作者每次对文本进行格式化时插入。诀窍就是让该过程成为主动的,这不能是一次性转换,否则就会回退到重复数据的情况。
代码中的文档。糟糕的代码才需要注释,我们需要把低级的知识放在代码中,它属于那里;把注释保留给其他的高级说明。否则,我们就是在重复知识,而每一次改变都意味着既要改变代码,也要改变注释。举个反面例子
xxxxxxxxxx
int d; //d 是直径
这样就犯了低级的知识放在了代码中的错误,好的方法是这么写:
xxxxxxxxxx
int diameter;
这样不需要注释也知道这个是直径。
文档与代码。文档和代码都含有同一知识的表示。
语言问题。
无意的重复:
例子:一个表示线段的类
xxxxxxxxxx
class Line{
public:
Point start;
Point end;
double length;
}
重复原因:每改变一个点,都要改变长度,重复!
好的写法:
xxxxxxxxxx
class Line{
public:
Point start;
Point end;
double length(){ return start.dictanceTo(end); }
}
有时为了性能而选择违反DRY原则。通常:需要缓存数据,以避免重复昂贵的操作时。其诀窍是使影响局部化。对DRY原则的违反没有暴露给外界:只有类中的方法需要注意“保持行为良好”。在可能的情况下,应该总是用访问器函数来写对象的属性。这将使未来在增加功能(比如缓存)变得更加容易
无耐性的重复:
- 相似的程序拷贝代码并在其基础上做改动,可以节省几秒钟时间,但是以后可能损失几个小时。欲速则不达!
开发者之间的重复:
Make it easy to reuse.
- 要营造一种环境,在其中要找到并复用已有的东西,比自己编写更容易。如果不容易,大家就不会去复用,而如果不进行复用,我么就有重复知识的风险。
正交性
什么是正交性:某种不依赖性或是解耦性
正交的好处:消除无关事物之间的影响
设计自足的祖籍按:独立,具有单一、良好定义的目的。
提高生产率和降低风险。
提高生产率
- 改动得以局部化,设计、编写简单的组件,对其进行单元测试,然后把它们忘掉。
- 促进复用。
降低风险
项目团队:
- 正交的团队效率更高(尽管如此,我们依然鼓励自团队不断地相互交流)。
编码:
- 让你的代码保持解耦
- 避免使用全局数据
- 避免编写相似的函数
养成不断地批判对待自己的代码的习惯。寻找任何重新进行组织、以改善其结构和正交性的机会。这个过程叫做重构,它非常重要!
正交性与DRY原则密切相关。运用DRY原则,实在寻求使系统中的重复降至最小;运用正交性原则,可以降低系统的各组件间的相互依赖。在做project时紧密结合DRY原则,运用正交性原则,将会发现开发的系统变得更加灵活、更易于理解,并且更易于调试、测试和维护。
我们已经开始了我们的project,但是还没有开始code,提前看了这个让我有了code时候注意DRY和正交的意识,如果有一天我们大家都在不顾一切地做出改动,而每一处改动似乎都会造成别的东西出错,那么项目很有可能是没有进行正交的设计和编码。那么这就是我们重构的时候了。