0

我在网上看到许多开发人员在他们的 PDO 连接中使用单例模式。[在哪里?]

我之前一直在使用单例模式(在 VB.Net 中),我很确定它仅在您必须调用一个实例两次或更多次时才有用[缺少 .NET 代码的代码示例]。

我目前正在开发一个电子商务网站,我想知道在我的 PDO 连接上使用单例模式是否真的有用,因为我的架构是按照每个脚本只需要一个连接的方式制作的 [代码示例你会使用这样一个单身人士失踪]。

4

1 回答 1

4

为了回应这个问题(也许是答案)引发的“评论讨论”,回顾一下我的观点和普遍共识(不要吝啬设备/服务器负载,这意味着工时和可维护性比速度更重要,除了少数特定情况)。

您说您讨厌框架,并且使用他们自己开发的框架的开发人员出售维护合同。这究竟是如何工作的?任何了解 FW 的人都可以维护使用开源、文档化 FW 的代码。您的代码可以由您维护。
此外,PHP 框架(嗯,至少是主要的)是OPEN SOURCE。我知道,来自 VB.NET 背景,您可能会怀疑这有什么问题,但实际上没有。他们都有 github repo,源代码可以免费复制和编辑(根据许可证,总体上来说还是相当自由的)。基本上,您可以完全控制
不要以为这都是二流代码:Apple(包括他们的 OSX 内核的主要部分)、微软、谷歌……他们都在使用开源软件和框架。不仅因为它易于开发,而且开发速度更快,而且还因为经过验证的技术概念。

此外:性能是你的目标,而且 - 鉴于你讨厌框架 - 为什么不考虑学习汇编?这样一来,您就可以避免让一个愚蠢的编译器将您的代码编译成可能不如它本来可以有效率的东西。
当然,您不会为此使用 IDE,您会选择 Emacs 或蝴蝶,对吗?

Emacs 蝴蝶
(来源:andreas-wilm.com

另一种方法是使用提供高级缓存功能的框架......

在编写代码时,可维护性对您来说应该是最重要的:

'调试的难度是一开始编写代码的两倍。因此,如果你尽可能巧妙地编写代码,根据定义,你就不够聪明,无法调试它。— 布赖恩·克尼汉

服务器是僵尸奴隶:他们不会抱怨,鞭打他们也不违法。尽管一些项目经理似乎忘记了这一点,但开发人员既不是僵尸也不是奴隶:他们不能连续工作 2 周,而且鞭打开发人员仍然非法的。甚至史蒂夫鲍尔默都知道......开发人员,开发人员,开发人员。微软的服务器操作系统是资源密集型的,MSSQL 也是如此,几乎所有的软件,但看看他们的服务器操作系统。有许多功能只能减少系统所需的维护时间. 我不是 MS 粉丝,但我完全理解这个决定。他们无法在价格上击败 Linux(因为它是免费的),但他们可以通过销售系统来吸引公司,这将使他们的系统管理成本减半。(虽然,ATM,他们没有做到这一点,而 IMO,他们永远不会)


这个问题是众多骗局之一,不适合 SO,将被关闭。但是,在它被关闭/删除之前,我想向您指出一些事情:

首先要做的事情

由于我目前正在开发电子商务网站,因此我想知道在我的 PDO 连接上使用单例模式是否真的有用

不,从来都不是。

注射 PHP 无法在请求之间保持对象的状态。服务器接收请求。解析脚本,建立数据库连接,执行查询,发回响应并关闭连接。一遍又一遍地。
连接不能被序列化,它们不能以任何方式、形状或形式存储,因此:
通过良好的编码,您可以使用注入同时确保每次请求只连接到数据库一次。
静态是拖拽中的全局变量,现在:如果你可以传递一个参数,你会使用全局变量吗?给你怀疑的好处,我假设你的答案是否定的。
那么,单例剩下的少数剩余好处不值得为使用单例的代码编写体面的、工作的、单元测试所付出的努力。

为什么

我的架构是按照每个脚本只需要一个连接的方式制作的。

那么你的代码不是很可扩展。我知道这是一个笼统的声明,一个可怕的陈词滥调,但这里就是这种情况。就像您认为每个脚本只需要一个连接的假设现在可能是正确的,但谁能说总是这样呢?
重构数据库,添加对另一个适配器的支持,测试(如前所述)变得越来越困难,因为您将编写代码,并且在没有注意到它的情况下,新代码将被调整以维护单例
这意味着您将编写代码来保留以前的东西,因为您正在解决它的问题,这是一个糟糕的设计决策。

可以这样想:
你建了一座房子,并决定在走廊里建一根混凝土柱子,因为无论如何你都会把衣架挂在那里,而且你永远不会改变它。但 Singleton 暗示您正在编写 OO 代码。重点是您可以重用代码。现在:你真的认为如果房子有一个不可移动的衣架,你能像没有那个东西那样容易地卖掉你的房子吗?当然不是!

而且我很确定它仅在您必须调用实例两次或更多次时才有用。

如果是这样:使用另一种模式,或者从 Symfony 的书中借鉴,并使用容器使连接可用于任何需要它的对象(依赖注入组件值得谷歌搜索)。

测试:

前面已经解释过了,但是测试单例代码是一场噩梦。学习使用注射。

于 2013-09-25T14:14:05.400 回答