(笔者简称老乐)
重构是一种在不改变软件系统外在行为的前提下,优化代码内部质量的方法,使得代码易于复用、易于理解、减少冗余,从而使软件实现的复杂度逼近于软件要解决问题的复杂度,降低理解和维护成本。
重构中重要的手段就是baby step,也就是我们常说的小步快跑。首先强调一个概念,这里的小步,指的是业务上的一小步,而不是指实现的一小步,小步的规模和代码的行数多少没有直接关系。也就是说,有可能一个业务上的一小步只修改一行代码;也有可能需要修改几十行代码,这些都是一小步。
Baby step的优势:
1、控制复杂度
我们对于复杂事物的处理思路一般来说都是分而治之,分解成一个个小节点+节点间链接,这样问题就被分解为两部分:在一个小节点内进行思考和设计,这样复杂度就比较小,过程比较清晰,每个小节点的结果也容易预期;节点间链接专门处理接口和协作,节点和关系各自管理自己的复杂度;如果重构的步子过大,就会把复杂度不高的n个事物揉在一起,复杂度的递增往往不是加法关系,可能会是乘法甚至几何数量级递增,人脑短期内很难hold住,从而失去控制感,产生强烈挫败感。
2、增加解决方案正确性
人脑是人体内最耗氧气的器官,所有它处理问题时特别喜欢寻求精巧的解决方案,但这也放过来导致人思考过程不连续和跳跃,极容易引入不易察觉的逻辑错误,重构时步子过大特别容易产生这种问题。
Baby step讲究缩短思考过程,一个个小节奏处理问题,用例-》功能-》消除坏味道,这3步组成一个小循环,然后下一个场景又是一个这样的小循环,循环接着循环,形成滚动的效果。由于每次处理问题粒度小,始终可以保持思考和重构过程的可控性和连续性,这样就可以减少大段思维跳跃带来的不易察觉的逻辑错误。
3、快速反馈
a、减少大脑场景切换的浪费
小步快跑可以带来快速的反馈,出了问题可以小粒度的范围解决,然后再奔向下一个目标,如果粒度很大,就需要大脑在不同的小节点间进行场景切换,造成精益中说的8种浪费之一的不必要移动的浪费。
b、Small Win
玩游戏打怪过程中大家都有体会,完成任务,消灭怪物都会及时获得奖励:赚取金币、提升等级、缴获宝物等,这些small win反过来会激励你继续打下一个怪,很容易不知疲倦甚至上瘾。
重构的过程中坚持baby step,每次完成一个小步,测试用例通过立即获得反馈,虽然是一个很小的成功,也会促使人脑分泌多巴胺,让人获得成功的愉悦感,从而激励大家不停的往下重构,这种baby step模式下,整个重构感觉就像玩游戏一样,不停step by step,不断获得重构的乐趣。
4、时刻保持版本可用性
坚持baby step,可以保持版本随时可用性,真正实践“重构是随时可以停止的”这条承诺。
如何做好小步快跑呢?
首先是步骤
每个baby step中都至少包含三步:测试用例-》功能实现-》消除坏味道,然后切换到下一个step重复这些步骤。
其次就是做好拆分,这也是要点和难点,对于如何把要重构的目标分解成一个个的small step呢?老乐常用的方法如下:
1、按场景拆分
比如分为正常场景、异常场景、边界值场景等。
2、按业务流拆分
比如业务流分为A、B、C、D、E五步,第一个step处理A-》E,BCD pass by,第二个step处理A-》B-》E,step 3处理A-》B-》C-》E,最后一个step处理A-》B-》C-》D-》E。
3、按simple-》complex拆分
就像画画一样,一个step勾勒出轮廓,再用一个个step完善丰富细节。这个方法可以看做是按场景拆分和按业务流拆分的组合。
4、按时间顺序
比如一个新增需求,带来了新的需求变化方向,我们可以先调整老的架构,使之适应新的需求变化方向并跑通老的用例,然后再合入新需求。通过这样的拆分来控制复杂度的逐步增加。
5、逐个消除代码坏味道
不要一步消除到位,每次消除一种坏味道,跑通测试用例后,再消除下一种坏味道,一般不要把几种坏味道一起消除,防止复杂度过高。
其他还有一些技巧,文字可能不方便充分表达,老乐用录屏软件录了一段视频,里面有4个需求变化,演示了需求变化时,如何通过baby step的方式进行用例设计、功能拆分、消除代码坏味道等手法,有兴趣的童鞋可以微信联系我,发给大家对照参考下。
土鳖扛铁牛(待续)
声明:来自丁辉的软件架构说,仅代表创作者观点。链接:https://eyangzhen.com/6172.html