3

在 GWT MVP 中,我的演示者通常有很多私有成员(事件总线、rpc、使用 GWT.create() 创建的消息包...)。我们一直在使用“ClientFactory”将视图生成为单例,因此每次我们需要它们时都不会重新创建它们。该工厂还可以提供 rpc、事件总线和其他资源。

我可以在GWT 文档中读到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.

我的问题是:如果我不需要并且永远不会需要具有延迟绑定的工厂的不同实现,我不能只使用静态类和方法来检索我的依赖项而不是客户端工厂或 Gin吗?在这个解决方案中,我无法真正抓住 Gin 的优势,也无法在某些时候/在某些(不明显的)情况下给我带来麻烦。我通常会避免在服务器端代码中使用静态类,因为它是多线程的,但在客户端单线程代码中,我看不出哪里会出现问题。然而,似乎大多数人使用杜松子酒或其他解决方案......

4

1 回答 1

3

问题static不在于线程,而在于全局状态和单例。

GWTTestCaseGWT使用MVP的主要原因之一是能够在不需要GWT.create(). ,而一些项目,如 gwt-mockito 或 gwt-test-utils 使用字节码操作使其无论如何运行)。但即使没有 MVP,这仍然是个问题:GWT.create()

测试时,全局状态和单例会妨碍您:

  • 您的测试不是孤立的(它们依赖于全局状态,因此同时运行的两个测试共享相同的状态,因此它们不在受控环境中运行)
  • 您不能使用模拟/伪造/存根或其他测试替身,因为被测系统直接使用单例,而不是依赖于环境传递的某些对象(测试和生产中的对象不同)

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

于 2013-08-22T10:25:49.490 回答