我遇到了这样的代码,其中3个控制器正在使用方法调用,例如ClassA.search(a,b,flag)。这是该方法的简化版本:
public List<Result> search(Object a, Object b, boolean flag) {
//do some code logic here, common to the 3 controllers
//at the middle there is:
if (flag) {
//code that affects 2 Controllers
} else {
//code affects only 1
}
//some more common code
//some more code with the flag if else
}
这是一个好主意,因为代码被重用了吗?或者是否有更好的方法仍然能够进行代码重用但不为方法调用(客户端)代码定制引入此标志(比如可能将其拆分为3种不同的方法,但仍能够声明公共代码重构方法)? / p>
答案 0 :(得分:6)
首先,使用函数提取注释行:
public void search(Object a, Object b, boolean flag)
{
commonToThree();
if (flag)
{
affectTwoControllers();
}
else
{
affectsOnlyOne();
}
alsoCommon();
}
现在摆脱flag
布尔参数,这是一个代码气味:
public void searchWithTrueFlag(Object a, Object b) {
commonToThree();
affectTwoControllers();
alsoCommon();
}
public void searchWithFalseFlag(Object a, Object b) {
commonToThree();
affectsOnlyOne();
alsoCommon();
}
答案 1 :(得分:3)
这很好但不是很好。一个布尔值是有道理的,但如果你开始添加更多布尔值,你就不会朝着正确的方向前进。
并非总是可行,但通常会产生更好的代码:
functionOne:
sharedCodeOne()
specificCode
sharedCodeTwo()
functionTwo:
sharedCodeOne()
specificCode
sharedCodeTwo()
与往常一样,很难做出一般性主张:这显然并非总是可行/实用。
答案 2 :(得分:0)
这是一种相对简单的方法。有其他选择,但它们可能更复杂。 (例如传递访问者或调用控制器的方法来说明如何为该控制器做什么)
如果您在代码的三个部分之间共享局部变量,那么这种方法最好,而您必须使用字段。
答案 3 :(得分:0)
我会采取不同的方法试图以一般方式回答这个问题:
主要目标应该是干净代码。究竟是什么,当然取决于具体情况。但是可以肯定的是,在几个地方都有复制粘贴的代码是很糟糕的,因为如果必须更改,这需要更改几个地方 - 同样,尝试在多个部分使用的情况下提取常用部分是不好的他们在所有情况下。
总是想象有人必须阅读你的代码(或者你必须在几周之后完成这项工作)并且必须尽快理解那里发生的事情。因此,它取决于特殊情况,如果最好复制一些行或用常用方法提取它们。
标志本身并不坏,但它并不是真正应该在java方法中过度使用的东西。通常可以通过重载方法并在另一方中使用方法来很好地解决这种情况,以便常见情况在一个中完成,而另一个中的特殊添加。或者,您可以使用多个子方法,并通过多次调用来编写方法,但这只是有意义的,如果您不需要传递太多参数。
一条规则(完全主观,但基于从许多项目中吸取的经验教训)我可以给你:赞成具体实施ober通用方法。它们可能会导致更多代码,并且可能看起来不那么聪明,但它们更容易理解,扩展和调试。