在GWT MVP中,我的演示者通常有很多私有成员(使用GWT.create()创建的事件总线,rpc,消息包)...)。我们一直使用“ClientFactory”来生成单例视图,所以每次我们需要时都不会重新创建它们。该工厂还可以提供rpc,事件总线和其他资源。使用静态类而不是客户端工厂或依赖注入与杜松子酒?
我可以读GWT doc是the main purpose of this factory is to gain access to object needed through your application. The second advantage of using a ClientFactory is that you can use it with GWT deferred binding to use different implementation classes based on user.agent or other properties.
我的问题是:如果我不和绝不会需要不同的实现,工厂与延迟绑定,我不能只用一个静态类&方法检索我的依赖项而不是客户端工厂或杜松子酒? 我不能真正抓住杜松子酒这个解决方案的优势,也不知道它是否会在某些(不明显的)情况下让我陷入麻烦。我通常会避免服务器端代码中的静态类,因为它是多线程的,但是在客户端单线程代码中,我没有看到问题会发生在哪里。然而,似乎大多数人使用杜松子酒或其他解决方案...
感谢您的帮助。我明白我们需要有可测试的演示者(这就是为什么我们必须编写所有这些接口),并且具有全局**状态**是不好的做法。但在我们的情况下,我只需要检查我的视图,rpc,消息,......的接口**上的方法是否及时调用。 **我不必关心他们的状态或者他们的实例是否是单例,因为我正在测试演示者而不是视图,也没有考虑rpc或消息包。难道我不能用PowerMock来嘲笑我的静态工厂,并避免你正在谈论的问题吗? – otonglet
也许我不太了解PowerMock。 AIUI,这或多或少与gwt-test-util相同;只是因为你可以不意味着你应该......基本的想法是你的演示者依赖于某些东西,并且应该为它提供这些东西(Demeter法则),无论环境需要哪个实现(Liskov替换原理)。 (虽然技术上虽然功能较弱,但您也可以将工厂放在单独的JAR中并切换JAR进行测试;或者使用工厂中的布尔开关切换到“测试模式”;但工厂违反了Demeter的法则) –
谢谢,我有点看到你的观点。虽然我没有得到德米特法律所要做的事情,因为它是关于“只与一个人的亲密朋友交谈”,而且工厂(静态与否)是任何主持人的“亲密朋友”。静态工厂也封装了一个非静态的工厂。至于Liskov,我会引用自己的话:'如果我不这样做,永远也不会需要不同的工厂实现'......我想让一个主持人知道不会改变的东西不会影响这个规则。因此,我不需要切换JAR或(更糟糕的)使用布尔值(为什么建议它,如果我需要布尔参数化类,继承会更好 – otonglet