我刚开始使用Guice。
当我使用 Guice 时,我的应用程序类变得松散耦合。
使用 Google Guice 是否会降低代码的可读性、不清晰、更难理解和调试?
你对它的体验如何?
4 回答
我的经验一直是积极的。我的代码更具可读性;它在天文上更容易测试和维护。松散耦合是重点。
如果有人一般不熟悉依赖注入,那么是的,我认为它会使代码更难理解和理解......起初。例如,我第一次使用 Spring 时,至少可以说有点困惑。然而,一旦你理解了注入 bean 之类的概念,它就会变得有意义。
良好的设计至关重要,而 DI 对松散耦合和可测试性至关重要。
明智地使用依赖注入,无论是通过 Guice 还是其他方式,都可以使代码更容易测试并保持干净和松散耦合。它使测试替身(模拟对象等)的使用变得更加容易。
做得不好,或者走极端,它会使系统几乎无法理解——即使每个类可能孤立地很清楚,但很难说出类的组装是做什么的(尤其是在涉及大量 XML 配置文件的情况下!) . 一些系统似乎将 DI 配置本身用作一种编程语言,这很快就会变得难以管理。
哪个更容易阅读?
A:
public class ServiceCaller {
private String url;
private Service service;
public A {
url = System.getProperty("url);
Hashtable env = ...;
Context ctx = new InitialContext(...)
service = ctx.lookup(...)
}
public String getValue() {
return service.getValue();
} ...
或者
public class ServiceCaller {
private Service service;
@Inject
public ServiceCaller(Service service) {
this.service = service;
}
public String getValue() { ...}
如果你不习惯 DI,你可能会说“#1”,因为你可以阅读所有的实现,并且确切地知道发生了什么,服务是什么等等。但问题是:从外部看类合同,你不知道里面发生了什么。#2 明确指出:“给我一个服务实例,我会给你一个值。你所要做的,就是相信有一个隐藏的机制会提供这个服务实例”。(Hidden=hidden,你需要在你的代码中有一个“getproperty-getcontext-getService-Module”)
所以在我看来:DI 更容易阅读(尽可能使用基于构造函数的注入)。它更容易测试,有些人可能会说,最好的文档是编写良好的、有效的测试。你只需要一点信心就可以相信会有一个服务实例......