【问题标题】:Avoid duplicate code in POJO Class避免 POJO 类中的重复代码
【发布时间】:2012-05-25 14:20:07
【问题描述】:

假设我们有 3 个类:A、B 和 C。每个类在参数中都有其他类。像这样: 编辑:

 +-----+  +-----+  +-----+
 |  A  |  |  B  |  |  C  |
 -------  -------  -------
 | X x |  | X x |  | Z z |
 | Z z |  | Y Y |  | Y y |
 -------  -------  -------

Getter 和 setter 将被复制。那么,这是一种不好的做法,我们应该避免这种做法吗?或者这不应该被代码分析器(例如PMB)视为重复代码?

我曾想过“策略模式”,但我认为它可能太多了,只是针对 getter 和 setter ...

编辑:我的第一个问题可能不是很清楚。问题是我们是否有两个具有共同属性和完全相同的 getter/setter 的类(未链接)。 Sonar 或 PMD 是否应该将这些方法视为重复代码?如果没有,会修复吗?

【问题讨论】:

  • 这些类看起来耦合非常紧密。他们为什么会这样?
  • 代码重复很糟糕。为什么不能只从 A 中引用 B 类并以这种方式使用方法?
  • A.getB() 的含义不必与 C.getB() 相同。所以它不是重复的。也就是说,我在某处看到了 @Getter@Setter 注释,它们甚至有助于简化(我不记得它是哪个框架/库)
  • @Matt Ball 你是对的。我编辑了我的示例。

标签: java sonarqube pmd code-duplication


【解决方案1】:

如前所述,首先考虑您是否真的需要复制。也许它们应该在一个可以传递的共同对象中。也许他们不需要。

现在让我们假设它们确实是需要的。当然可以。 PMD 的复制粘贴检测器可让您在将其计为重复之前设置最小行数。由于 getter/setter 各只有 3 行(或两者各 6 行),因此您可以将阈值设置在上面。

【讨论】:

    【解决方案2】:

    这是一个循环引用,通常是不好的做法。你可以重新设计不这样做吗?

    【讨论】:

    • 是的,你是对的,但在我的真实情况下,没有循环引用。我将编辑我的帖子以获得更好的示例。
    【解决方案3】:

    复制代码并不总是一个错误的想法,在某些情况下,进行一些克隆是不可避免的。现在也确实生成了 setter 和 getter,但也生成了 for 和 while 循环,并且这些代码不应该被自动排除,因为它们是手动维护的。不加考虑地积极消除代码重复不是一个好主意。基本上并不是所有的重复都是坏的,而且它并不总是能够消除它们。得到回报的是所谓的克隆管理,即跟踪现有的重复并消除真正引起麻烦的重复。为此,您需要一个复杂的工具,例如 FrontEndART 的 QualityGate,它包含一个 CloneManager 模块。它不仅列出了重复,还通过版本跟踪它们的生活,并让您知道哪些是您应该仔细查看的重复。您可以通过online demo version of QualityGate查看此工具。

    【讨论】:

      【解决方案4】:

      setter 和 getter 是自动生成的代码,因此它们绝不是代码重复(有人手动编写它们)吗?

      您应该考虑的唯一问题是您是否有数据重复?在你的例子中没有办法说,因为类“A”和“C”中的字段“b”可以有其他含义。

      就像“客户”和“建筑”中的“地址”字段。这意味着别的东西。

      【讨论】:

      • 在 Java 中,getter 和 setter 不会自动生成。你一定在想 C#。
      • @Matt Ball:Java 开发者的常见做法是让 eclipse 生成 getter 和 setter,eclipse 也会在 get/setter 中反映字段重命名。
      猜你喜欢
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 2017-10-01
      相关资源
      最近更新 更多