今天上午的一个收获吧,听老人家讲的Kent Beck简单设计的五句话。而且昨天老人家还介绍我看了《重构》那本书,结合上下文的话,今天这五句话还是很有点意思的。
话不多说,五句话摆出来:1、测试;2、重用性;3、设计意图明确;4、避免多余实体;5、以上各条,按重要顺序排列。
然后拓展一下这五句话,不然看起来太简单了,有点寒酸呀。
首先,测试。测试是重构的前提,是简单设计的前提,就是说不出多重要的重要。为什么呢,可以说有了测试,有了完备的测试,才能放心的去重构你的code设计,提高的是confidence level。而且补充一个,昨天老人家跟我说,TDD,就是要先写测试,再写开发,如果你的方法需要其他类或者service的协助,则mock起来;虽然有的情况下,比如修改代码或者做spike,会先写出code,再添加测试,但仍然,写测试的时候,only keep in mind的是业务,绝对不是实现。孩子,记得哦,业务和实现一定要分开,就好像martin fowler说的两顶帽子,当年写code的时候带着一顶帽子,做重构的时候要带着另一顶帽子,带着code帽子的时候就一定不修改原有代码,只添加新功能;带着refactor帽子的时候,就专注于refactor,对code的修改。同理,业务和实现也是两顶帽子。
第二,重用性。重用性就是为了避免重复代码,因为代码越少,后来人对代码进行修改的时候就越容易理解,也越容易修改。另一方面,为了更容易重用代码,就要用到单一职责的原则啦,这样的code才容易重用。duplicate code虽然对于编译器没有什么影响,或者对于效率也不会产生太大影响,但是嘛,code总是要修改的,不管是需求的变化,还是避免代码腐坏,所以重用对编译器可以没有什么感觉,但是对修改代码的我们,就很有feel啦。
第三,设计意图明确。这个也是为了后来人的,让人一看你的code就会很清晰你究竟想要做什么。这个包括code的设计,接口的设计,也包括最直观的变量方法命名,这个就是可读性啦,而且想起来很重要的一件事,你去做一件事情的时候,做事情的时间一定比你提前想清楚这件事情的时间长的多。想清楚。
第四,避免多余的实体。这个嘛,什么是多余的实体呢,老人家也给了他多年经验的总结,很给力的两条:第一、无重用,如果一个方法只在一个地方需要,那么就暂时没有必要将其提取到一个类中,而是作为私有方法存在于当前类;第二、无修改,如果一个方法可能有多种规则,需要变化,则也应该提取。举个例子吧,有一个processor类需要对数据进行process,但是在process之前需要做validation,那么这个validation如果只在这一个地方用到的话,就可以作为private validate方法存在,但是如果有其他类也需要validation,那么就可以提取validator类,或者不同地方采取不同的validation规则,那么可以定义validator接口,有不同的实现方式,在用到validate的类中通过composition引入validation,并且通过spring依赖注入将选用的某种validator实现类注入进去。这个也是使用接口以及使用spring DI的好处啦,可以达到loose couple哦。
第五,以上各条按重要顺序排列。就是再次强调,测试,一定要有尽可能高覆盖的测试;一定避免duplicate code并且坚守单一职责原则;注意你的思维一定要是清晰的,并且把这种清晰体现在code中;对了,想起来昨天老人家跟我说的另外一点,在写code的时候,一定要体现业务逻辑,用业务逻辑把实现细节包裹起来。
其实,还有很多想写的,但是考虑到单一职责原则,一篇博客只谈一个主题(不过貌似我中间没有收住,还是多说了一些其他东西)。因为我发现,敏捷不只是一种编码的东东,也是一种生活方式,重构也一样。很多思想,可以作为生活方式。不仅仅是更快捷高效的编码,也是更快捷高效的生活!加油加油
浙公网安备 33010602011771号