无处不在的DRY原则
2010-07-22 17:00 by 老赵, 8679 visitsDRY(Don't Repeat Yourself)原则,一般是指在写代码的时候尽量避免重复的实现。违反DRY原则导致的坏处很容易理解,例如维护困难,修改时一旦遗漏就会产生不易察觉的问题。不过其实这个原则并非写代码的时候独有,其实在各处都有类似的情况。当然,现在还是不谈“生活”,而是简单谈谈我在工作中发生的一些事情。
您认识这只小乌龟吗?相信大部分Windows下的程序员一定认识,这是个著名的SVN的客户端工具TortoiseSVN,与Windows下的资源管理器集成,提供了各种可视化的操作,深受广大人民群众喜爱。更重要的是,这个功能可谓十分强大的工具是免费的。
那么,您用过VisualSVN吗?VisualSVN是另一个和SVN相关的工具,它的主要功能是与Visual Studio集成,可以让开发人员在Visual Studio里进行SVN控制。VisualSVN是收费工具,不过对Microsoft MVP提供免费的个人版——说到这点,其实不少收费工具对MVP有此类政策,如著名的单元测试工具TypeMock Isolator也对MVP提供免费的License。MVP同学们可以多多挖掘这类福利,毕竟MVP在世界范围内还是十分有价值的荣誉。此外,VisualSVN还提供了VisualSVN Server(标准版免费),方便人们搭建和管理SVN服务器,不过这是题外话了。
值得一提的是,VisualSVN是基于TortoiseSVN的工具,它与SVN的交互完全利用TortoiseSVN的功能,包括各式对话框。这么看来,VisualSVN的主要工作都是由一个免费工具全权完成,于是我就纳闷了,那么VisualSVN的这么点“附加”功能,就值得收取50美金的费用?当然收费与否,收费多少是软件开发者的自由,不过为什么会有那么多人去购买VisualSVN呢?在Visual Studio里操作SVN,和在资源管理器里操作SVN又有什么大不了的优势呢?VisualSVN值那么多钱吗?
由于我近几年来一直遵守“软件无盗版”的原则,于是对于收费工具不是很上心,即便如VisualSVN这种可以免费使用的软件,我也倾向于使用其免费的替代品。总之,我没有使用VisualSVN,当然使用SVN时几乎还都是借助于TortoiseSVN的。于是,这样便造成了一些问题。例如,我时不时会遗漏一些新建的文件,没有将它们提交至SVN中。于是,另一台机器获取代码之后很显然就无法编译通过了。为什么会造成这种情况?因为我往往在Visual Studio里添加了一个文件,它会出现在解决方案树中,然后继续编辑修改测试,然后就用TortoiseSVN提交了。但是,我还没有把新文件添加到SVN索引里面去!于是我本地看上去完全正常,而SVN Repository里面的数据却是不完整的。
这就是TortoiseSVN的局限性所在。TortoiseSVN只关心硬盘上的文件,而不会关注这些文件在逻辑上有什么关联。在上面的例子中,问题就是“新文件”与“项目文件”其实应该是同步的(如csproj里面的文件也应该在SVN中出现),但这样的重复就需要由我们手动维护了。于是,我们为项目添加一个文件时就要做两件事情:
- 在Visual Studio添加文件
- 在TortoiseSVN里添加(选择)文件
在文件的改名或删除时也会出现类似的情况。其实我已经很小心了,但是这样的事情还是难以完全避免。一个文件添加(改名或删除)两次,这不也是违反了DRY原则吗?于是我才意识到VisualSVN的重要性,我认为它最关键的一点便是帮我们在Visual Studio与SVN索引之间进行同步,例如在解决方案树中添加文件会自动出现在SVN索引中(即下图的红点,这表明该文件“已经加入索引”但“尚未提交”):
在平时开发过程中和DRY相关的地方有很多,例如之前有同事说要将压缩后的JS和CSS文件一并提交到SVN中,我说这样会同步死的,于是最后在某个发布过程中添加了一个步骤对这些资源进行自动压缩。还有,一些程序集可能会用于多个应用程序,于是它们的配置文件也会随之出现在各处,给维护造成困难。最后还是使用了一些最简的做法:只在一处维护配置数据,然后再构建过程中复制到各个地方去。这一切都是不能松懈的。
当然,现在我主要使用的是基于命令行的git(虽然有TortoiseGIT),在每次提交前都会git status看看情况,这样遗漏文件的情况反而不多见了。虽然命令行的git可能不如TortoiseSVN这种GUI工具来的方便,但它可以较方便地暴露出潜在错误,这也是一种颇为可观的优势。
PS:如果您身处上海,熟悉git,有自信能表现出它的优点并愿意这么去做,请联系我(推特帐号:@jeffz_cn)。
说到“Don't Repeat Yourself”,我立即想到是:为什么这个世界这么五彩斑斓?!熟悉了.NET,面对Java,虽然学起来比较容易,但终究要(不少)成本;熟悉了WCF,面对Axis2,一样需要学习成本............................这些才是大大的Repeat Yourself啊!
既生X,何生Y,等价于,既生Y,何生X。
另:既然主题是Visual Studio + “source safe”,为什么不提Visual Studio Team Foundation Server呢?要m$,一定要比m$还m$