代码重复是提取方法的充分理由吗?

时间:2010-11-17 21:45:05

标签: design-patterns language-agnostic architecture

...当提取的方法会产生低凝聚力(没有形成良好的抽象和名字不好)?

例如,您对以下方法给出了什么名称?

private void foobar() {
    Server.checkAllowedDeviceCount(socketAction._sess.getDeviceID();
    socketAction.registerSession();
    socketAction._sess.runApplication();
}

这是我的另一个问题的可能的重复:To DRY or not to DRY? On avoiding code duplication and retaining cohesion - 或者我绝望的方式从更有经验的程序员那里得到一些建议(希望你原谅我)。请检查上面的链接 - 它包含我在这里展示的样本基于的代码。

4 个答案:

答案 0 :(得分:1)

我构建了code clone detectors。我经常看到多组代码A B C P Q被发现为克隆,其中A B C在概念上是连贯的,而P Q在概念上是连贯的,但ABC和PQ是不相关的。克隆检测器(或未经过教育的代码阅读器)将看到与克隆相同的序列。是的,你可以尝试用A B C P Q做一个糟糕的抽象FOOBAR,但是从原则读者的角度来看,你最好只做A B C inyo一个抽象,然后考虑如何处理P Q克隆。

我不知道这是否适用于你的情况,因为你所有的电话都是套接字(A B C?)而且我不熟悉你的界面。

答案 1 :(得分:0)

如果重复是“坏”,那么我会考虑提取它,但你总是希望平衡这个与其他问题。

另外,根据Extract Method Refactoring (C#),有4个提取方法,重复是其中之一。

其他人(如链接文章所述)是:

  • 通过强调离散的,可重复使用的方法来鼓励最佳编码实践。
  • 通过良好的组织鼓励自我记录代码。使用描述性名称时,高级方法可以更像是一系列注释。
  • 鼓励创建更精细的方法来简化覆盖。

答案 2 :(得分:0)

在看了你的“To DRY ...”问题之后,我认为应该提取这个功能 - 重复就足以证明它的合理性了。

试图从你在该问题中显示的内部类中推断出SocketAction类的目的,看起来StartSession是这个函数的合理名称。

答案 3 :(得分:0)

这是关键,如果您必须更改其中一个重复项(修复错误或添加功能),您是否还需要更改其他?如果答案是“是”,那么将它们组合成一个函数。

我也注意到,你的函数的所有三行都处理了一个socketAction,并且根本没有引用this / self。这表明这个方法应该是socketAction类的一部分。