...当提取的方法会产生低凝聚力(没有形成良好的抽象和名字不好)?
例如,您对以下方法给出了什么名称?
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 - 或者我绝望的方式从更有经验的程序员那里得到一些建议(希望你原谅我)。请检查上面的链接 - 它包含我在这里展示的样本基于的代码。
答案 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类的一部分。