这个反模式的名称是什么?

5

可能有些人已经遇到过这个问题。当程序员过于关注面向对象,忘记了性能和数据库时,这种情况就会发生。

例如,假设我们有一个电子邮件表格,需要通过该程序发送。在启动时,它会按以下方式查找需要发送的任何内容:

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()

这个有名称吗?

1
我相信你会得到很多回答告诉你性能已经不重要了。 :) - BobbyShaftoe
我不确定过度使用面向对象编程与此有什么关系? - Michael Burr
@MB:我猜询问电子邮件是否已发送是面向对象的,而非面向对象的方法则是直接查看列。 - Andrew Grimm
我提到OO的原因是因为Email类有一个漂亮整洁的Sent()方法。思路是“我将填充所有对象,然后它们就具有行为”。这很酷,但速度较慢。 - WW.
我明白了,是的,我猜这是一个常见的反模式。 - Michael Burr
13个回答

0

第一种方法的性能实际上可能很好,这取决于Emails的类型。如果它只是一个迭代器(类似于C++中的std::vector::begin()),那么它比先将所有未发送的电子邮件存储在某个容器中要好。


在这种情况下,1800 Information的名称仍然正确。高效的惰性过滤器非常有效! - Steve Jessop
我的观点是所有记录被无缘无故地从数据库拖到应用程序中。 - WW.
当大部分电子邮件已经发送时,从数据库中获取所有电子邮件是愚蠢的。DBMS可以进行过滤,并仅传输尚未发送的电子邮件。 - Jonathan Leffler
@Jonathan:你误解了我的帖子。我说的是提供的伪代码并不一定意味着所有电子邮件都已从数据库中获取。这取决于“电子邮件”的类型。如果它只是一个迭代器,那么实际上还没有获取任何内容。 - Frank

0

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

  • “不懂 SQL” 反模式
  • “法西斯 DBA” 反模式
  • “什么是 '延迟'?” 反模式

0

这里有一个不错的例子,可以在The Daily WTF找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接