📜  Code Smell – 一般介绍及其类型

📅  最后修改于: 2021-10-19 05:35:19             🧑  作者: Mango

代码异味一词最早是由美国软件工程师和极限编程的创造者Kent Back提出的。当我们处理应用程序并为其编写代码时,我们会看到一些需要重构的模式。这些模式要么重复,要么复杂化,或者可能使代码依赖于其他代码。此类模式称为代码气味,对此类代码的检测称为代码气味。

代码气味不是程序的错误。也有代码异味,您的程序可能会运行得很好。它们不会阻止程序运行或不正确。它们只是表示设计中的弱点,可能会增加未来出现错误和程序失败的风险。

根据该书作者的说法,“重构”引用重构为:以不改变代码的外部行为但改进其内部结构的方式改变软件系统的过程。 Code Smells 激发了代码重构。

代码重构有很多优点和缺点。例如:代码量减少,混乱的编码被适当地重组。让我们讨论代码异味的类型以及一些将其从代码中去除的技巧,使其更清晰、更清晰、更易于理解。

代码异味的类型

虽然有一百多种代码异味。下面列出了最常见和最重复的代码异味。这些大致分为2个主要类别。

  • 班内
  • 课间

类中的代码异味

  1. 评论:是的,评论也是代码异味。它就像代码的除臭剂。注释证明代码不是自我记录或意图揭示的。最好的注释是类或方法的名称。如果注释解释了几行复杂的代码或一个复杂的表达式,则应分别作为一个完整的另一个函数/子表达式。
  2. 长方法:长方法包含太多行代码。任何超过 25 行代码的代码都会让你产生疑问。它可以使用重构技术来解决,例如将表达式更改为子表达式,将复杂的代码更改为新函数,以便在不改变其功能的情况下使函数或方法更小且易于阅读。
  3. 长参数列表:任何具有更多参数的函数显然更复杂。经验法则之一是在函数最多使用 3 到 4 个参数。为了处理代码味道,检查参数的值,如果是一些其他函数的输出,然后代替传递作为参数的,将它作为一个函数。因此,我们将获得更易读、更短的代码。
  4. 大类:A类包含了许多方法/代码/场的行被认为是一个代码味道。课程开始时通常很小,但随着时间的推移,它们会随着项目的发展而扩大。
    为了处理这种代码异味,可以进行进一步的重构技术,例如提取类、提取子类、提取接口、复制观察数据。因此,我们不必记住类中的许多属性。
  5. 重复代码:当代码重复两次以上时,将其合并到类的函数或方法中。如果在两个或多个类中发现相同的代码,使用提取方法我们可以重构代码异味。如果在类的构造函数中发现重复代码,我们可以使用上拉构造函数体。
    其他解决这个问题的重构方法有:Pull up field、Form Template 方法、Substitute Algorithm 等。
  6. 死代码:未被使用的代码。没有调用或从未发生的条件的函数。删除未使用的代码和不必要的文件。删除方法或函数不需要的参数。因此,我们将获得更简单的支持和更少的代码。

类之间的代码味道

  1. 数据类:只存储数据而没有方法的类。这些类不包含任何功能。他们不能独立操作他们拥有的数据。一个类应该同时包含数据方法。使用全局或局部变量来重构这种代码异味。如果数据类包含公共数据,我们可以使用封装方法将其隐藏。
    解决此问题的其他重构技术有:Move、Extract 和 Remove 方法。
  2. 数据块:看起来相似的数据可能属于同一类。考虑使用高级班。例如,用于连接到数据库的参数。这些团块应该合并到一个新的类中。如果重复数据的数据包含类的字段,请使用提取类将字段移动到它们自己的类或创建它们自己的类。
    其他处理这种代码异味的重构技术有:引入参数对象、保留整个对象等。
  3. 具有不同接口的替代类:如果两个类在内部相似,也许可以修改它们以共享一个公共接口。例如,创建其中一个类的程序员可能不知道团队中的其他程序员已经存在或创建了一个类似的类。
    处理它们的重构技术有:重命名方法、移动、添加参数、参数化方法。
  4. 拒绝遗赠:一个类从其他类继承,但不使用其父类的继承方法。例如,假设一个类、主体、人类类和动物类都继承自类主体。汽车也有车身,它也可以从车身类继承,但这没有任何意义。
    处理这个问题的重构技术是: 用委托和提取超类代替继承。
  5. 懒惰类:一个类不足以引起您的注意,应该将其删除,因为它会花费您的时间和金钱。例如,一个设计为功能齐全的类,但经过一些重构和代码更改后,它变得没有用或可能有点用。
    Inline Class 和 Collapsing Hierarchy 可用于使代码尺寸更小,易于理解和维护。
  6. 霰弹枪手术:一次射击导致多次射击。类中的单个更改可能会导致多个相关类中的级联更改。这可能发生在过分热心地应用 Divergent Change 之后。可以使用 Move Method 和 Move Field 使代码更易于维护并减少重复。