2月20日真是令人难忘的一天。我们从无到有、从郁闷到兴奋,在此期间,大家都围着白板陷入痴狂,而且我们最终真的设计出来一点东西,可以开始往前走了,这感觉令人着迷。
不过我们确实还是走了很多弯路,在这里还是有很多经验教训值得总结:
尽管今天确实得到了一个看上去不错的设计,但是谁都吃不准什么时候会开始第一次重构。能根据设计写出优质的代码才是检验设计合理性的方法,写代码的工作就放在明天吧,今天到此为止。
参考文献:
[1] Robert C. Martin,敏捷软件开发:原则、模式与实践,清华大学出版社,2003.9
不过我们确实还是走了很多弯路,在这里还是有很多经验教训值得总结:
- 举出足够典型的样例,根据例子来归纳设计。这其实正是测试先行的一种做法,当我们设计能力并不足以一眼看穿最佳的设计方法时,通过不断的归纳来逼近最佳的(或至少是可行的)设计是最有效的方法。例如,XophiiX的第一个设计,虽然并不能解决所有问题,但至少也是一个能够解决问题的设计(不要怀疑,这是真的),它比那种纯粹的空中楼阁好多了。
- 先从最粗略的系统流程开始考虑。这里说的流程并不一定指的是数据流图,还可能是状态迁移、用例图等等,反正就是最粗略的东西,只要能够理解需求就能够说出来的东西。例如,我画的那个流程图,大家起码都了解设计的重点和难点在哪里。
- 采用隐喻(metaphor)的方法可以形象的找到问题的切入点。我不知道原理到底是什么,但是当我们找到一个可以类比的实际系统之后,我们的思路就开阔和活跃了许多,甚至类的职责都可以通过类比来确定。例如,我们把收集词元信息比作“作坊”,然后再想象作坊内部运作模式,惊奇地发现思路一下就通了。
- 尽量在一开始就降低类之间的耦合。在设计之初降低耦合往往只是举手之劳,但是如果最开始没有理会这样的问题,那么到以后再试图解耦合则可能会造成极大的代价。例如,如果作坊一开始就需要专门为一个客户服务,那么如果我们需要加入更多用户就必须改动作坊的内部实现,而且测试的时候也需要假定作坊的客户是稳定的,实在是不爽。其实为了使类拥有“易测试性”,解耦合是非常必要的。
尽管今天确实得到了一个看上去不错的设计,但是谁都吃不准什么时候会开始第一次重构。能根据设计写出优质的代码才是检验设计合理性的方法,写代码的工作就放在明天吧,今天到此为止。
参考文献:
[1] Robert C. Martin,敏捷软件开发:原则、模式与实践,清华大学出版社,2003.9