重构可以让代码更整洁,更易于理解和维护。代码味道(Code Smells)的辨别需要实践和经验:设计不良的特征说明代码存在更深层次的问题。工具可以帮助我们逐步重构,并防止破坏代码。
代码坏味道只是一种表象,它通常对应于系统中更深层次的问题。
如果重视不够,没有适当地维护或改进代码,那么代码质量就会下降。
代码坏味道示例:
- “面向对象滥用”;这类异味和面向对象设计的不完全或错误实现有关。辨别“面向对象滥用”异味有助于找出可能违反面向对象设计原则、可以导致错误的对象行为的代码。
- “变更障碍”,即代码的一处变更(例如,实现一个新特性或者调整一个现有特性)会影响许多类,需要对整个代码进行大量的修改。“平行继承层次”或“发散式变更”(Divergent Change)就是这类代码异味的例子。
发散式变化(Divergent Change)
发散式变化(Divergent Change) 类似于 霰弹式修改(Shotgun Surgery) ,但实际上完全不同。发散式变化(Divergent Change) 在一个类中修改多处。霰弹式修改(Shotgun Surgery)指的是同时对多个类进行单一的修改。
特征
你发现你想要修改一个函数,却必须要同时修改许多不相关的函数。例如,当你想要添加一个新的产品类型时,你需要同步修改对产品进行查找、显示、排序的函数。
问题原因
通常,这种发散式修改是由于编程结构不合理或者“复制-粘贴式编程”。
解决办法
运用 提炼类(Extract Class) 拆分类的行为。
如果不同的类有相同的行为,你可以考虑通过继承来合并类(提炼超类(Extract Superclass) 和 提炼子类(Extract Subclass))。
收益
- 提高代码组织结构
- 减少重复代码
重构方法说明
提炼类(Extract Class)- 问题
某个类做了不止一件事。
解决
建立一个新类,将相关的字段和函数从旧类搬移到新类。
提炼超类(Extract Superclass)- 问题
两个类有相似特性。
解决
为这两个类建立一个超类,将相同特性移至超类。
提炼子类(Extract Subclass)- 问题
一个类中有些特性仅用于特定场景。
解决
创建一个子类,并将用于特殊场景的特性置入其中。
重构可以带来什么好处?
重构的目标是更整洁的代码,就是说,重构旨在让代码更容易理解,降低变更成本
什么时候应该重构?什么时候不应该?
- 重构,像编写测试一样,应该成为同一特性实现的一部分。它不是一个独立的活动,当你希望修改代码,而代码本身 尚未做好变更准备时,重构它。重构是测试驱动开发TDD的一个重要步骤。
- 代码审查也是重构执行的一个最佳选择
- 另一方面,为了实现“完美的代码”,而在整个代码库上进行大量低价值的重构被称为镀金 。这有损于代码整洁,因为它削弱了重构的真实性需求,盲目地为了重构而重构。如果代码正常,就不需要修改,不要碰它。
Refactoring and Code Smells – A Journey Toward Cleaner Code
https://blog.csdn.net/cpongo2ppp1/article/details/89019521











网友评论