系统中的每一项知识都必须具有单一、无歧义、权威的表示。
--- DRY原则
黑牛和白牛有一天,一位记者来到了一块牧场,看见了一位农夫在喂牛。记者便上去搭讪道:“请问您每天给你的牛喂些什么呢?” 农夫说:“你问的是黑牛还是白牛?”
记者:“黑牛”
农夫:“玉米和小麦”
记者:“那白牛呢?”
农夫:“玉米和小麦”
记者有点迷糊了... 记者又问:“您每天给它们喂多少斤啊?”
农夫:“你问的是黑牛还是白牛?”
记者:“黑牛”
农夫:“5斤”
记者:“那白牛呢?”
农夫:“5斤”
记者有点不耐烦,便质疑的问道:“为什么同样的答案你却偏偏要让问我两次?”
农夫淡淡地说道:“因为黑牛是我的”
记者:“那白牛呢?”
农夫:“也是我的”
《伏尔加河上的纤夫》 俄国批判现实主义画家 伊里亚·叶菲莫维奇·列宾 1870年-1873年
本期“黑牛和白牛”的故事做启发,一起聊聊软件工程中重复的问题。无论你承不承认,在你所在的项目中也或多或少存在重复的痕迹。作为程序员,我们每天都在不停的进行着项目功能开发迭代,这个过程中伴随着环境的变化,也需要对原有的逻辑进行维护或增强特性。
当我们维护时,我们不得不找到并改变应用中的知识表示-那些嵌在系统中的代码逻辑块。问题是,在我们开发的规范、过程和程序中很容易重复表述知识。这个时候就是我们之前说的“破窗”,也就是重复的开始。那么重复是怎么发生的呢?我们列举以下几点和相关建议:1. 强加的重复(imposed duplication)。 这种情况往往是系统中我们没有更好的选择-环境似乎要求重复。
a.重复的代码结构:可以使用过滤器或者代码生成器,减少重复的工作内容。
b.代码中的文档:要把低级的知识放在代码中,它属于那里。把注释保留给高级的说明。
c.文档与代码:考虑使用工具,同步代码和文档的同步。如接口文档工具swagger。2. 无意的重复(imnadvertent duplication)。 那些我们在开发中没有意识到的重复信息。 可能是在无意的设计中造成的。比如经常会要用缓存的方式来避免一些繁琐的操作时。这时候要我们要做的是使影响局部化,不要把重复暴露给外界。
3. 无耐性的重复(impatient duplication)。 ctrl+V,ctrl+C. 这个熟悉的操作,这样的开发节奏似乎更快些。 每个项目都有时间压力,这也是我们走捷径的内在驱动。相同逻辑的代码拷贝后做些改动。然后跑通逻辑。搞定!(这样真的可以吗?)。有时候“欲速则不达”,这个时候需要把一些细节明确,以避免一个小小的失误然后回来在找bug用多半个小时。
4. 开发者之间的重复(interdveloper duplication)。 同一团队或者不同团队中开发的时候重复了相同的信息,功能模块,方法或逻辑等。 最不好察觉和维护的重复就是开发者之间的重复。这个重复是从整个功能开始的,会给后期维护或者升级带来较大的难度。
那“知其所以然”后,我们能有哪些避免重复的方法呢?
1. 定期进行代码review。 把公用类和方法定期优化同步 ,减少重复造轮子。
2. 团队协作之间主动交流。对已经有类似的方法先考虑是否可以重用。
3. 沉淀公共知识的统一管理和同步。比如像之前我在启明星辰做的通用知识文档。
简而言之,目标就是“在系统中避免重复造轮子,让复用变得容易”。
草莓时刻:
1. 在你所在的团队项目代码中,找下存在哪种重复的情况并试着做点改变。
2. 和团队中的小伙伴相互代码review.(开放心态目的是学习和成长)。
俊超说,每天说点程序员的事。
欢迎留言交流。
网友评论