2013-08-22 22 views
3

在GWT MVP中,我的演示者通常有很多私有成员(使用GWT.create()创建的事件总线,rpc,消息包)...)。我们一直使用“ClientFactory”来生成单例视图,所以每次我们需要时都不会重新创建它们。该工厂还可以提供rpc,事件总线和其他资源。使用静态类而不是客户端工厂或依赖注入与杜松子酒?

我可以读GWT docthe 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.

我的问题是:如果我不和绝不会需要不同的实现,工厂与延迟绑定,我不能只用一个静态类&方法检索我的依赖项而不是客户端工厂或杜松子酒? 我不能真正抓住杜松子酒这个解决方案的优势,也不知道它是否会在某些(不明显的)情况下让我陷入麻烦。我通常会避免服务器端代码中的静态类,因为它是多线程的,但是在客户端单线程代码中,我没有看到问题会发生在哪里。然而,似乎大多数人使用杜松子酒或其他解决方案...

回答

3

static的问题不是关于线程,而是关于全局状态和单身。

其中一个主要原因在使用GWT MVP是可以测试你的演示,无需GWTTestCase,因为他们不会在GWT.create()或JSNI直接依赖,这些都需要一个浏览器环境运行(请注意,GWT.create()正在变得可用于普通Java,并且某些项目(如gwt-mockito或gwt-test-utils使用字节码操作来使其无论如何运行)。测试时

全球国家和单身进来的方式:但是,即使没有MVP,那还是会成为一个问题

  • 你的测试不是孤立的(它们依赖于全局状态,所以两个测试运行在同一时间共享相同的状态,因此他们不在受控环境中运行
  • 由于被测系统直接使用单件而不是使用模仿/赝品/存根或其他测试双打,取决于环境传递的一些物体(在测试和生产中有所不同)

请参阅http://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/

+0

感谢您的帮助。我明白我们需要有可测试的演示者(这就是为什么我们必须编写所有这些接口),并且具有全局**状态**是不好的做法。但在我们的情况下,我只需要检查我的视图,rpc,消息,......的接口**上的方法是否及时调用。 **我不必关心他们的状态或者他们的实例是否是单例,因为我正在测试演示者而不是视图,也没有考虑rpc或消息包。难道我不能用PowerMock来嘲笑我的静态工厂,并避免你正在谈论的问题吗? – otonglet

+0

也许我不太了解PowerMock。 AIUI,这或多或少与gwt-test-util相同;只是因为你可以不意味着你应该......基本的想法是你的演示者依赖于某些东西,并且应该为它提供这些东西(Demeter法则),无论环境需要哪个实现(Liskov替换原理)。 (虽然技术上虽然功能较弱,但您也可以将工厂放在单独的JAR中并切换JAR进行测试;或者使用工厂中的布尔开关切换到“测试模式”;但工厂违反了Demeter的法则) –

+0

谢谢,我有点看到你的观点。虽然我没有得到德米特法律所要做的事情,因为它是关于“只与一个人的亲密朋友交谈”,而且工厂(静态与否)是任何主持人的“亲密朋友”。静态工厂也封装了一个非静态的工厂。至于Liskov,我会引用自己的话:'如果我不这样做,永远也不会需要不同的工厂实现'......我想让一个主持人知道不会改变的东西不会影响这个规则。因此,我不需要切换JAR或(更糟糕的)使用布尔值(为什么建议它,如果我需要布尔参数化类,继承会更好 – otonglet