本文档主要探讨的是大型重构及其在软件开发过程中的重要性,由作者刘伟(Sunny)分享,电子邮件地址为weiliu_china@163.com。大型重构涉及对现有代码结构进行深层次的改进,以提高代码质量、可读性和可维护性。文章分为三个部分,分别介绍重构列表、在对象之间搬移特性以及重新组织数据。
重构列表部分详细列举了九种常用的重构技术:
1. 提取方法(ExtractMethod):将一个函数中的重复逻辑抽取到一个新的独立方法中,提高代码的模块化。
2. 内联方法(InlineMethod):当一个方法体非常短且不会被其他地方重用时,将其直接替换为调用的代码,减少冗余。
3. 内联临时变量(InlineTemp):消除临时变量,使代码更简洁。
4. 替换临时变量与查询(ReplaceTempwithQuery):将计算结果直接作为参数传递,而不是存储在临时变量中。
5. 引入解释变量(IntroduceExplainingVariable):创建一个变量来明确表达复杂的条件或表达式的含义。
6. 拆分临时变量(SplitTemporaryVariable):当一个临时变量的功能复杂时,将其拆分成多个更小的变量。
7. 移除对参数的赋值(RemoveAssignmentstoParameters):避免在方法内部修改参数,保持其原始状态。
8. 用方法对象替换方法(ReplaceMethodwithMethodObject):将操作封装到一个对象中,提高复用性和可测试性。
9. 替换算法(SubstituteAlgorithm):当有更好的算法实现时,替换原有的算法逻辑。
在对象之间搬移特性部分介绍了八种方法:
1. 移动方法(MoveMethod):根据功能关联性,将方法从一个类移到另一个类。
2. 移动字段(MoveField):调整字段的归属,以反映数据的真正所有者。
3. 提取类(ExtractClass):将共享行为的代码块转换为独立的类。
4. 内联类(InlineClass):将小类的功能合并到父类或调用它的类中。
5. 隐藏委托(HideDelegate):隐藏不必要的代理行为,简化接口。
6. 移除中间人(RemoveMiddleMan):去除不必要的间接交互,提高代码清晰度。
7. 引入外来方法(IntroduceForeignMethod):引入外部库或框架的方法,减少代码自定义。
8. 引入本地扩展(IntroduceLocalExtension):提供扩展点,使得扩展性更强。
最后,重新组织数据部分列举了十六种策略:
1. 自我封装字段(SelfEncapsulateField):增强字段的访问控制,保护内部状态。
2. 将数据值替换为对象(ReplaceDataValuewithObject):将简单的数据转换为具有行为的对象,增加灵活性。
3. 将值转换为引用(ChangeValuetoReference):优化数据结构,可能减少内存消耗。
4. 将引用转换为值(ChangeReferencetoValue):反之,将对象转为基本类型,简化操作。
5. 替换数组为对象(ReplaceArraywithObject):对象化数组,利于面向对象编程。
6. 复制观测数据(DuplicateObservedData):为多线程或并行处理复制数据,保持一致性。
7. 改变单向关联为双向关联(ChangeUnidirectionalAssociationtoBidirectional):增加数据之间的相互依赖关系。
8. 改变双向关联为单向关联(ChangeBidirectionalAssociationtoUnidirectional):反之,简化依赖关系。
9. 替换魔法数(MagicNumber)为符号常量(SymbolicConstant):提高代码可读性,便于后期更改。
10. 封装字段(EncapsulateField):限制字段访问,确保安全。
11. 封装集合(EncapsulateCollection):将操作封装到集合类中,便于管理。
12. 替换记录(Record)为数据类(DataClass):将数据结构组织成独立的类,便于管理和复用。
13. 替换类型码(TypeCode)为类(Class):将类型标识转换为具体的类实例,提高灵活性。
14. 替换类型码为子类(SubstituteTypeCodewithSubclasses):通过继承和多态实现代码的复用和扩展。
本文档提供了丰富的大型重构技巧,涵盖了从函数到对象再到数据的不同层次,是提升代码质量、降低维护成本的重要参考资源。