附:前两篇文章链接
!(https://www.jianshu.com/p/251d1b796259?v=1673184489236)[重构改善既有代码的设计-代码的坏味道(上)]
!(https://www.jianshu.com/p/efa726759259)[重构改善既有代码的设计-代码的坏味道(中)]
下面继续把重构一书代码中的坏味道进行总结与列举:
1.18 异曲同工的类(Alternative Classes with Different Interfaces)
如果两个函数做同一件事,却有着不同的名字。
使用 Rename Method(重命名函数) 重新命名这些相同功能的函数,反复运用 Move Method(搬移函数) 将这些函数移入类,如果需要移入类的函数过多,可以考虑Extract Superclass(提炼父类)来减少过多赘余的属性。
1.19 Incomplete Library Class (不完美的类库)
含义:封装好的类库中功能不能满足实际需求。
缺憾: 库中没有某些需求能够使用的方法函数等,封装好的库不能更改。
目标: 解决代码不能更改造成的不便。
实现方法:
使用 Introduce Foreign Method(162引入外加函数)
在一个无法修改的类中增加新的函数,剥离出来作为静态函数放在需要的类中使用。
或使用 Introduce Local Extension(164引入本地扩展)
你需要为服务类提供一些额外函数,但你无法修改这个类。
则你可以建立一个新类,使它包含这些额外函数,让这个拓展品成为源类的子类或包装类。
该两种重构手法看后续文章更新会进一步附上链接以及详细的总结:
1.20 Data Class(纯稚的数据类)
它们拥有一些字段,以及用于访问(读写)这些字段的函数, 除此之外一无长物.
这样的类只是不会说话的数据容器, 它们几乎一定被其他类过分细碎地操控着.
修改点:
1.这些类早期可能拥有public字段, 果真如此你应该在别人注意到它们之前, 立刻运用Encapsulate Field(封装字段) 将它们封装起来.
2.如果这些类内含有容器类字段, 你应该检查它们是不是得到了恰当的封装;
3.如果没有, 就运用 Encapsulate Collection(封装集合) 把它们封装起来. 对于那些不该被其他类修改的字段, 运用Remove Setting Method(移除设值函数)。找出这些取值/设值函数被其他类运用的地点. 尝试以Move Method 把那些调用行为搬移到Data Class来. 如果无法搬移整个函数, 那就运用Extract Method 产生一个可被搬移的函数. 不久之后你就可以Hide Method(隐藏函数) 把这些取值/设值函数隐藏起来了.
1.21 Refused Bequest(被拒绝的馈赠)
定义:
被拒绝的遗赠是指:对于某个子类,它只想继承基类的部分函数和数据,不需要基类提供的全部内容,这些不需要的内容就成为了子类的负担。
影响: 这种坏味道通常影响并不大,但如果子类拒绝实现部分接口或者基类的方法只适用于某个子类特定的方法,就会对可维护、可扩展性等造成较大影响。
改进目标: 改进不合理的继承体系,使代码结构清晰、可控。
方法:
•函数/字段下移,让超类只持有子类共享的东西[1]。
•以委托取代超类/子类。
注[1]:并不建议对所有存在“被拒绝的遗赠”的代码都进行修改,我们经常使用继承复用一些行为,可以很好的应对日常工作,所以修改的成本和收益还是需要开发者自己权衡。但是当“被拒绝的遗赠”使开发人员困惑时,就建议及时处理掉。
1.22 Comments (过多的注释)
首先声明,注释不是一种坏味道,但是我们经常遇到一段代码有非常长的注释,然后也可以推导出注释之所以这么长,是因为代码很糟糕。这种情况发生的次数多了。
注释可以帮助我们找到本章先前提到的各种坏味道。找到坏味道我们运用各种重构去重构之后,会发现注释一斤变得多余了。因为代码已经说明了一切。
做法:
如果你需要注释来解释一块代码做了什么, 试试Extract Method;
如果函数已经提炼出来,但还是需要注释来解释其行为,试试Rename Method
如果你需要注释说明某些系统的需求规格,试试Introduce Assertion(引入断言)。
首先,当你感觉需要填写撰写注释时,请先尝试重构, 试着让所有注释都变得多余。
如果你不知道该做什么, 这才是注释的良好运用时机 . 除了用来记录将来的打算之外, 注释还可以用来标记你并无十足把握的区域. 你可以在注释里写下自己"为什么做某某事". 这类信息可以帮助将来的修改者, 尤其是那些健忘的家伙.
以上就是重改改善既有代码的设计中列举的代码中的坏味道,希望我们开发人员在开发、迭代功能、需求、解决bug或者优化代码时,能够多多思考,对坏味道多多体会的同时,能够尽量减少这些坏味道。
注这几篇文章中,比较复杂,有意思的重构手法会在文章中附链接,相对简单易理解的,读者可以自行百度。