在Java中,给出以下类:
public class MyClass {
private final Dependency dependency;
public MyClass(Dependency dependency)
{
this.dependency = dependency;
}
public void doWork()
{
// validate dependency...
}
doWork方法需要调用使用dependency
的方法。
以下哪两种变体被视为“最佳做法”,为什么?
// Access dependency directly
void validateDependency()
{
this.dependency.something();
}
// access dependency as passed to the method
void validateDependency(Dependency dependency)
{
dependency.something();
}
我发现自己偏爱后者,将依赖项直接传递给方法,因为它使得该方法更容易单独测试(尽管是边缘)。
但是,我对这里的java惯例/最佳实践很感兴趣。
答案 0 :(得分:11)
存在一个类,因为您具有与该状态耦合的状态和操作。将该状态的一部分作为参数传递给类方法是没有充分理由的。
事实上,它会向我表明这件国家不应该属于这个阶级。或者该方法不属于该类。
使用参数“以便更容易进行单元测试”是后者保持的一个很好的指示(该方法不应该在类中)。
答案 1 :(得分:3)
嗯,在你的例子中,你要求函数对Dependency做一些事情,它适用于静态函数,而不是成员函数。
我的经验法则是:在拥有该成员的对象上调用方法时直接使用成员,但在执行/测试与依赖项直接相关的内容时传递引用,并为后者支持静态方法
有点冗长,但我希望它有所帮助。一如既往地尝试“做正确的事”和差异,这个小的不太可能对代码的维护或可读性产生巨大影响。
答案 2 :(得分:-1)
没有正确的方法可以做到这一点。我更喜欢把变量放在那里。
答案 3 :(得分:-1)
依赖注入。第二个选项是“最好的”。
如果将“Dependency”类设为接口,则会使代码更加模块化,更易于测试,更少耦合。