有人可以给我一个隐藏依赖的例子。我用谷歌搜索了它,发现了这样的结果:
"可见依赖项是开发人员可以从中看到的依赖项 班级的界面。如果从班级中看不到依赖关系 接口,它是一个隐藏的依赖。"
(来源 - http://tutorials.jenkov.com/ood/understanding-dependencies.html#visiblehidden)
但我还是不太明白。
是否意味着在函数内部发生依赖关系,而不是在类的开头发生声明的变量?或者,当您只是创建除接口中声明的签名方法之外的函数时?
答案 0 :(得分:9)
以下是隐藏依赖项的示例:
{ /* {this.renderPlayers() */ }
在上面的示例中,constructor(props){
super(props);
this.setState({players: []});
} // this one
}
是class Foo
{
void doSomething() //a visible method signature
{
//the body of this method is an implementation detail
//and is thus hidden
new Bar().doSomething();
}
}
的依赖,因为Bar
依赖于Foo
的协作。
隐藏,因为Foo
的构造函数或Bar
的方法签名中对Bar
的依赖性不明确。
将一个类视为定义向协作者公开的可见合同。方法和构造函数签名是该合同的一部分。方法Foo
的主体是隐藏,因为它是类中未在合同中公开的内部实现细节。我们从签名中知道的所有内容都是名为Foo
的方法,其返回类型为doSomething()
。
对于一个反例,我们可以重构该类以使依赖关系显示出来:
doSomething()
在上面的示例中,void
被明确定义为构造函数的公开签名中的依赖项。
或者我们可以这样做:
class Foo
{
private readonly Bar bar;
Foo(Bar bar) //the constructor signature is visible
{
this.bar = bar;
}
void doSomething()
{
bar.doSomething();
}
}
现在,方法Bar
对class Foo
{
void doSomething(Bar bar) //method signature is visible
{
bar.doSomething();
}
}
的依赖性是可见的,因为它包含在Bar
的方法签名中。
答案 1 :(得分:2)
透明(具体)依赖项:透明依赖项是通过公共构造函数设置的依赖项。
不透明(隐藏)依赖性:不透明依赖性是未通过公共构造函数设置的依赖性,因此不容易看到该依赖性 < / p>
这里是一个示例:
// Transparent Dependency
public class StudentService
{
private IStudentRepository _studentRepository;
public StudentService(IStudentRepository studentRepository)
{
_studentRepository = studentRepository;
}
public List<Student> GetStudents()
{
return _studentRepository.GetAllStudents();
}
}
// Opaque Dependency
public class StudentService
{
public List<Student> GetStudents()
{
var _studentRepository = new StudentRepository("my-db-name");
return _studentRepository.GetAllStudents();
}
}
不透明依赖被认为是一种反模式,this article强调了不透明IoC的问题:
为实现Opaque IoC的组件编写测试要困难得多
透明IoC可以帮助正在“做太多事情”的身份类
Mark Seemann describes第二点很优美:
构造函数注入的奇妙好处之一是它 明显违反单一责任原则 很明显。
与此密切相关的是Nikola's 2nd law of IoC:
任何具有超过3个依赖项的类都应向SRP询问 违反