代码中常见的坏味道及重构手法
在软件开发中,存在许多常见的代码坏味道(code smells),它们指示出潜在的设计或实现问题。下面是一些常见的代码坏味道以及相应的重构手法:
- Duplicated Code(重复代码):
- 坏味道:代码中存在相同或非常相似的代码片段。
- 重构手法:将重复的代码抽取为方法或函数,通过调用来避免重复。
- Long Method(过长的方法):
- 坏味道:方法过长,包含过多行数或复杂逻辑。
- 重构手法:将长方法分解为多个小方法,每个方法负责一个明确的任务,提高代码的可读性和可维护性。
- Large Class(过大的类):
- 坏味道:类过于庞大,承担了过多的责任。
- 重构手法:将类的功能分解为多个小类或模块,每个类只负责一个明确的职责,提高类的可理解性和可维护性。
- Long Parameter List(过长的参数列表):
- 坏味道:方法的参数列表过长,增加了方法的复杂性和调用的困难度。
- 重构手法:将相关的参数封装为对象或数据结构,或者使用重构模式(如Builder模式)来简化参数传递。
- Primitive Obsession(基本类型偏执):
- 坏味道:过度使用基本数据类型,而不是创建专门的类来表示概念。
- 重构手法:创建适当的类来表示相关的概念,提高代码的可读性和可维护性,同时提供更丰富的行为和封装。
- Switch Statements(过多的switch语句):
- 坏味道:代码中存在大量的switch或if-else语句,难以扩展和维护。
- 重构手法:使用多态、策略模式或工厂模式等技术,将条件逻辑转移到不同的类中,提高代码的灵活性和可扩展性。
- Lazy Class(无用的类):
- 坏味道:存在没有实际功能或用途的类。
- 重构手法:移除无用的类,或者将其与其他类合并,以减少代码库中的冗余。
- Data Clumps(数据泥团):
- 坏味道:代码中多个地方出现相同的参数组合,表示它们可能应该被封装为一个单独的对象。
- 重构手法:创建一个新的类来封装这些相关参数,提高代码的可读性和可维护性。
- Feature Envy(依恋情结):
- 坏味道:一个类对另一个类的方法有过多的调用,可能表示这些方法应该属于该类。
- 重构手法:将被依恋的方法移动到调用它的类中,改善代码的一致性和聚合性。
- Shotgun Surgery(散弹式修改):
- 坏味道:对一个功能的修改需要在多个不同的类或模块中进行大量的修改。
- 重构手法:将相关的功能集中到一个类或模块中,以减少修改的范围。
- Message Chains(消息链):
- 坏味道:代码中存在长串的方法调用,形成冗长的消息链。
- 重构手法:使用中间对象或方法来封装消息链,简化代码的调用和维护。
- Middle Man(中间人):
- 坏味道:一个类仅仅委托给另一个类的方法,过度增加了类之间的耦合性。
- 重构手法:消除中间人类,直接调用被委托的类的方法,简化代码结构。
- Speculative Generality(过度泛化):
- 坏味道:添加复杂的抽象、接口或类层次结构,但实际上并没有真正的需求。
- 重构手法:去除不必要的抽象,简化代码结构,只有在确实需要时才进行泛化设计。
- Parallel Inheritance Hierarchies(平行继承体系):
- 坏味道:存在两个类继承体系,彼此之间存在强耦合,导致扩展和维护困难。
- 重构手法:使用组合关系替代继承,将共享的行为封装到单独的类中,减少继承的依赖。
- Comments(过多的注释):
- 坏味道:代码中存在大量冗长、无效或重复的注释。
- 重构手法:重构代码,使其自我解释,并删除不必要的注释,使代码更加清晰和易懂。
- Refused Bequest(拒绝的遗赠):
- 坏味道:子类只使用了父类的部分方法,而其他方法则被拒绝使用。
- 重构手法:重新设计继承关系,使子类只包含需要的方法,或者将拒绝使用的方法移动到其他类中。
- Lazy Initialization(延迟初始化):
- 坏味道:对象在第一次使用之前不会被初始化,导致额外的延迟和性能开销。
- 重构手法:在对象被使用之前进行初始化,避免不必要的延迟和潜在的错误。
- God Class(上帝类):
- 坏味道:一个类负责过多的功能,成为系统中的中心点,导致类变得庞大且难以维护。
- 重构手法:将类的功能分解为更小的、职责单一的类,提高代码的可读性和可维护性。
- Inappropriate Intimacy(过度亲密):
- 坏味道:两个类之间的交互过于密切,相互依赖过多。
- 重构手法:通过引入中间层或使用事件驱动的方式,减少类之间的直接依赖关系。
- Incomplete Library Class(不完整的库类):
- 坏味道:使用的第三方库或框架中的类缺少所需的功能。
- 重构手法:通过继承、组合或适配器模式,扩展库类以满足具体需求。
- Excessive Coupling(过度耦合):
- 坏味道:类之间的依赖关系过多,修改一个类可能导致级联的修改。
- 重构手法:使用设计模式如依赖注入(Dependency Injection)或解耦合模式,减少类之间的紧耦合关系。
- Data Class(数据类):
- 坏味道:一个类仅仅用于封装数据,缺乏行为和功能。
- 重构手法:将数据类转换为具有行为和功能的类,遵循面向对象的设计原则。
- Feature Creep(功能蔓延):
- 坏味道:系统的功能不断增加,导致代码变得复杂且难以维护。
- 重构手法:使用分解和重组的方法,拆分系统为更小的、高内聚的模块,简化系统的复杂性。
- Magic Numbers(魔法数):
- 坏味道:代码中存在未经解释的具体数值,降低代码的可读性和可维护性。
- 重构手法:将魔法数值提取为常量或枚举,增加代码的可读性和可维护性。
iOS中特有的坏味道及重构手法
-
Massive View Controller(巨大的视图控制器):
- 坏味道:视图控制器包含大量的业务逻辑和视图管理代码,导致代码庞大、难以维护和测试。
- 重构手法:使用MVVM(Model-View-ViewModel)或MVC(Model-View-Controller)等架构模式,将业务逻辑和视图管理解耦,将代码分解成更小、可测试的组件。
-
Massive Model(巨大的模型):
- 坏味道:模型类包含过多的属性和方法,违反了单一职责原则,难以理解和维护。
- 重构手法:将大型模型类分解为多个更小的模型类,每个类负责一个明确的任务。使用组合或继承来组织模型之间的关系。
-
Massive Storyboard(巨大的故事板):
- 坏味道:故事板包含大量的视图控制器和视图之间的连接关系,导致故事板复杂、难以维护和协作。
- 重构手法:将故事板拆分为多个较小的故事板,根据模块、功能或视图层级进行划分。使用故事板引用和导航控制器等技术来管理不同故事板之间的导航。
-
Massive XIBs(巨大的XIB文件):
- 坏味道:XIB文件包含大量的视图和视图之间的连接关系,导致文件庞大、难以理解和维护。
- 重构手法:将XIB文件拆分为多个较小的XIB文件,根据视图层级或功能进行划分,使用代码或接口构建视图层次结构。
-
Tight View-Controller Coupling(视图控制器紧耦合):
- 坏味道:视图控制器与特定的视图高度耦合,导致视图控制器难以重用和测试。
- 重构手法:使用视图模型(ViewModel)将视图控制器与视图解耦,将视图控制器的职责限制在响应用户交互和协调业务逻辑方面。
-
Massive Networking Code(巨大的网络代码):
- 坏味道:网络请求和处理逻辑散布在应用的多个地方,导致代码重复和难以维护。
- 重构手法:创建网络服务层或使用现有的网络框架(如Alamofire)来集中处理网络请求和响应逻辑。将网络请求和处理逻辑封装为可重用的组件,并确保适当的错误处理和结果处理机制。
-
Lack of Error Handling(缺乏错误处理):
- 坏味道:缺乏对错误和异常情况的适当处理和反馈,可能导致应用崩溃或不可预测的行为。
- 重构手法:在适当的位置添加适当的错误处理机制,包括错误捕获、错误传递、错误回调或使用Result类型等。通过良好的错误处理机制,增强应用的稳定性和可靠性。
-
Overuse of Singletons(滥用单例模式):
- 坏味道:过度使用单例模式导致全局状态和共享状态的混乱,使代码难以测试和扩展。
- 重构手法:使用依赖注入和面向协议编程等技术来减少对单例的依赖。将共享的状态封装在适当的组件中,并通过构造函数或属性注入来访问这些组件。
-
Massive View Hierarchy(巨大的视图层次结构):
- 坏味道:一个视图层次结构包含大量的视图和子视图,导致性能下降、内存占用增加和布局复杂。
- 重构手法:使用容器视图、自定义视图或视图组合来简化视图层次结构。
-
Lack of Code Modularization(缺乏代码模块化):
- 坏味道:代码在整个项目中重复出现,缺乏可重用性和可维护性。
- 重构手法:将常用的功能和逻辑提取为独立的模块或库,并在需要时进行引用。使用模块化的设计原则和模式来提高代码的组织性和可重用性。
-
Inefficient Data Fetching(低效的数据获取):
- 坏味道:数据获取和处理逻辑不高效,导致性能下降和用户体验差。
- 重构手法:使用合适的数据获取技术,如异步操作、缓存和批量加载,以提高数据获取的效率。优化数据结构和算法,减少不必要的网络请求和数据处理。
-
Poor Memory Management(差劲的内存管理):
- 坏味道:缺乏对内存的适当管理,导致内存泄漏、内存警告和应用崩溃。
- 重构手法:使用自动引用计数(ARC)机制来管理内存,确保正确地添加和释放对象的引用。避免循环引用和强引用,使用弱引用和无主引用来解决对象之间的引用关系。
重构是一个持续的过程,旨在改善代码的质量和可维护性。通过识别和纠正代码中的坏味道,可以使代码更加健壮、可读和易于扩展。
转载自:https://juejin.cn/post/7326733138423365641