我和我的同事现在已经有几个星期有争执了。我想听听社区对此的意见。
我们在申请中使用guice。在这个应用程序的UI部分,我更喜欢通过DI和自定义注释(也称为工厂的位置)实例化所有字段和组件,并在buildUI方法中将它们连接起来。
如下所示:
我的方法:
@Inject
@PreConfigured(caption="foo", width="100%")
Label field;
private void buildUI() {
this.addComponent(field);
}
我还写了一些数据绑定注释和i18n。
我的同事这样做:
他的方法:
private Label field;
private void buildUI() {
field = new Label();
field.setCaption("foo");
field.setWidth("100%");
this.addComponent(field);
}
这里的代码可能很长。考虑到数据绑定和其他主题,第二个代码可以变得更长,而我的方法只是另一个注释。
我的理由是:
他的理由是:
但是我还从福勒那里读到了一些articles,他指出,定位注射(用场注入替代)是一个糟糕的设计决定。但那些在其他项目中没有重用的视图呢?
Field Injection是一个糟糕的设计吗?或者上面介绍的另一种方式更优雅?
亲切的问候 基督教
PS:我知道讨论的开始只是基于意见,但这是一个长期持续的讨论(setter vs constructor injection),这可能是值得放手的。答案 0 :(得分:3)
免责声明:由于这是一个主观问题,我还会根据个人偏好在这个答案中提出一些主观主张。这是我的两分钱:
这两种方法对我来说都很糟糕。
你的不好是因为:
您拥有模块中的所有绑定。想想这个模块有多大,特别是如果有很多屏幕的话。想想这个可持续性的含义:现在想要改变单个屏幕的程序员必须
1- Know the DI framework
2- Find the module where the bindings for this screen are defined.
3- Scroll down to find the binding.
4- Make the change in the module, maybe also in the screen.
5- Commit changes for the module class, maybe also for the screen class.
使用DI意味着使用反射,这比不使用反射慢。
你的同事的方法当然是有缺陷的,因为它包含硬依赖性。不过,这对屏幕来说可能是可以接受的。我认为DI可以用于大事(比如使用解析器实现注入服务,注入控制器,daos,记录器),但我不会将它用于视图,而且我宁愿坚持使用构造函数注入。所以(在Android中)我只是在xml中定义视图并在Activity类中编写视图控制器部分,这就是你应该这样做的方式。
答案 1 :(得分:1)
我认为您的问题并不适合StackOverflow(请查看常见问题解答),但我可以向您介绍我的想法。
我支持你在这个问题上的想法,因为你似乎已经在这个项目中使用了DI,为什么你不使用它提供的功能呢?
我对你的理由的评论:
@PreConfigured(caption="foo", width="100%")
他的观点:
4.
private
字段,也不涉及具有8-10个参数的构造函数。如果你想要不可变对象你可以使用Builder
模式,如果你想要单身,你可以放心,Spring(我认为Guice有相同的概念)单身范围对你来说很好。顺便说一句,这是常识:如果它是唯一有效的方式就没有别的办法了,对吗?答案 2 :(得分:0)
现场注入比单独调用setter更好。你为什么要花时间打电话给特定的制定者。依赖注入的重点是避免业务逻辑中的setter的样板代码。