2

我正在使用相当标准的 Web/服务/数据访问分层设计构建一个用于娱乐/学习的小型网站。

为了使我不必经常创建服务层/数据访问层类的实例,我将它们中的方法全部设为静态。我不应该遇到并发问题,因为它们使用局部变量等并且不共享任何资源(目前事情很简单)。

据我所知,唯一的权衡是我并没有真正遵循真正的 OO 方法,但它再次使代码更加简洁。

有什么理由这不是一种可行的方法吗?以后可能会出现什么样的问题?有一个“工厂”类可以根据需要返回服务和数据层类的实例会更好吗?

4

6 回答 6

4

你知道那些游乐园里的游乐设施,他们说“请始终把你的手和脚放在游乐设施内”吗?事实证明,如果你不这样做,骑行会更有趣。唯一真正的权衡是,您并没有真正遵循真正的“始终保持双手双脚”的方法。

重点是——你应该遵循“真正的 OO 方法”是有原因的,就像你有理由让你的手和脚保持在骑行中一样——这很有趣,直到你开始到处流血。

于 2008-09-23T19:14:41.143 回答
4

您描述它的方式,这本身并不是“错误”的方法,但我并没有真正看到您试图避免的问题。您不能在服务器启动时创建这些业务对象的单个实例并根据需要将它们传递给您的 servlet 吗?

如果您准备好将 OO 扔出窗外,您可能还想查看 Singleton 模式。

于 2008-09-23T19:18:59.620 回答
3

缺点:

  • 您将无法编写单元测试,因为您将无法编写模拟数据访问/业务逻辑对象来进行测试。
  • 当不同的线程尝试同时访问静态代码时,您将遇到并发问题 - 或者如果您使用同步的静态方法,您最终会遇到线程排队使用静态方法。
  • 您将无法使用实例变量,随着代码变得更加复杂,这将成为一种限制。
  • 如果需要,替换业务或数据访问层的元素会更加困难。
  • 如果您打算以这种方式编写您的应用程序,您最好使用一种旨在以这种方式工作的语言,例如 PHP。

您最好通过以下方式选择非静态业务/数据访问层类:

  • 使用单例模式(创建每个类的单个实例并在线程之间共享它们)......
  • 或者在需要时在每个线程中创建类的实例。

请记住,连接到您的应用程序的每个用户/会话都将在其自己的线程中运行 - 因此您的 Web 应用程序本质上是多线程的。

于 2008-09-29T20:18:18.670 回答
2

我真的看不出你的设计有什么优势,而且有很多事情可能会出错。您正在节省一行代码,也许?以下是您的方法的一些缺点:

  • 您无法轻松替换业务逻辑的实现
  • 您不能定义实例变量以方便将逻辑分解为多个方法
  • 您认为不会出现多线程问题的假设几乎肯定是错误的
  • 你不能轻易地模拟它们进行测试

我真的不认为遗漏一行代码会给你带来任何好处。

这并不是真正的“OO 设计”问题,而更多的是适当性。你为什么还要以这种程序化的方式使用 Java?当然,PHP 更适合这种设计(实际上通过不必编译和部署来节省您的时间)。

我只会让您的业务层非静态;它将使维护、更改和发展您的应用程序变得更加容易。

于 2008-09-23T19:28:15.573 回答
0

您可能难以使用这种类型的架构对您的对象进行单元测试。例如,如果您有一个引用静态数据访问层的业务对象层,则可能难以测试业务层,因为您将无法轻松使用模拟数据访问对象。也就是说,在测试业务层时,您可能不想使用数据访问层中的“真实”方法,因为它们会对您的数据库进行不必要的更改。如果您的数据访问层不是静态的,您可以为业务层提供模拟数据访问对象以进行测试。

于 2008-09-23T19:31:47.530 回答
-1

我认为您将遇到具有多个用户的所有静态方法的并发问题。Web 层将线程化并发用户。你所有的静态方法都可以处理这个吗?也许,但他们不会一直被锁定在单个文件中的请求队列中吗?我不确定,从来没有尝试过你的想法。

于 2008-09-23T18:38:22.963 回答