5

你们中的一些人肯定已经处理过这个问题。当程序员对 OO 过于执着而忘记了性能和拥有数据库时,往往会发生这种情况。

例如,假设我们有一个电子邮件表,它们需要由该程序发送。在启动时,它会查找需要发送的任何内容,如下所示:

Emails = find_every_damn_email_in_the_database();
FOR Email in Emails
  IF !Email.IsSent() THEN Email.Send()

从不要重复自己的角度来看,这是一件好事,但有时这是不可避免的,应该是:

Emails = find_unsent_emails();
FOR Email in Emails
  Email.Send()

这个有名字吗?

4

13 回答 13

9

我将试一试,并命名为“惰性过滤器(反)模式”。

于 2009-04-01T01:44:44.307 回答
5

我见过一次。那个程序员的时间不长。

我们称之为“消防水带法”。

于 2009-04-01T01:51:59.407 回答
2

对我来说,这是 Joel Spolsky 的泄漏抽象

这并不完全是一种反模式,但无论是谁编写了这段代码,都没有真正理解 Active Record 模式抽象在哪里泄漏。

于 2009-04-01T01:53:57.593 回答
2

我称之为“霰弹枪方法”。

于 2009-04-01T03:32:51.787 回答
1

我不确定这一定与数据库相关,因为您可能有一个复杂且昂贵的过程(例如,不仅仅是一个标志)来为组应用过滤器。

我不认为它有名字,因为第一个设计根本不好,它违反了一个责任原则。如果您搜索、过滤和打印过滤后的内容,您正在做多件事,因此您需要将其重构为“搜索过滤后”并打印。

与这里的简单重构唯一不同的是,它也会影响性能,就像内部循环可以以损害性能的方式设计一样。

于 2009-04-01T01:46:16.380 回答
1

似乎源自以下反模式:

最初的开发人员可能不被允许编写 find_unsent_emails() 实现,因此会重用 midget 函数。那么,为什么要在开发和测试之后改变它呢?

于 2009-04-01T03:27:56.587 回答
1

这通常是因为使用现有查询然后在代码中过滤比添加新的 SQL 查询要容易得多。可能是因为 DBA 控制所有查询并获得批准的新查询需要几天时间,或者可能是因为您使用的 ORM 工具使得定义您自己的自定义查询变得非常困难。

如果我要命名它,我会称它为“Easy Way Out”(反)模式。它是否是反模式实际上取决于个人情况。如果您需要检索的项目数量很少,那么在代码中进行过滤确实不是什么大问题。但是如果项目的数量很大并且有可能持续增长,那么显然应该在服务器上进行过滤。

于 2009-04-01T04:20:22.890 回答
1

我在其他地方看到过类似的问题,而不是简单的一系列事情要做,而是有一个基于“列表集群”的“事务集群”,它基于一个基于“内存集群”的“集合集群”。不用说,最简单的事情变成了一个伟大的大交易。

我称之为疾驰的普遍性

于 2009-04-01T16:05:26.083 回答
0

愚蠢的业余爱好者。

说真的,我只在拥有计算机科学学位且完全没有专业经验的人身上看到过这种情况。当我在杜克大学任教时,我的导师和我开设了一个“大规模编程”课程,我们让人们准确地看到这些类型的错误。

于 2009-04-01T01:44:32.733 回答
0

第一个的性能实际上可以很好,具体取决于Emails. 如果它只是一个迭代器(想想std::vector::begin()in C++),那么它比首先将所有未发送的电子邮件存储在某个容器中更好而且更好。

于 2009-04-01T01:51:30.437 回答
0

这个反模式有几个可能的名字。

  • “不知道的 SQL”反模式
  • “法西斯-DBA”反模式
  • “‘延迟’是什么意思?” 反模式
于 2009-04-01T01:53:42.633 回答
0

The Daily WTF有一个很好的例子。

于 2009-04-01T05:58:04.450 回答
0

部分受到 1800 年“惰性过滤器(反)模式”的启发,“功能失调编程”(即与函数式编程相反)怎么样?

于 2009-12-11T03:47:37.790 回答