代码之家  ›  专栏  ›  技术社区  ›  WW.

这个反模式叫什么名字?

  •  5
  • WW.  · 技术社区  · 16 年前

    当然,你们中的一些人已经处理过这个问题。当程序员有点过于关注面向对象,忘记了性能和数据库时,就会发生这种情况。

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

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

    这个有名字吗?

    13 回复  |  直到 13 年前
        1
  •  9
  •   1800 INFORMATION    16 年前

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

        2
  •  5
  •   Scott Whitlock    16 年前

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

        3
  •  2
  •   lubos hasko    16 年前

    对我来说,这是乔尔·斯波尔斯基的 leaky abstraction .

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

        4
  •  2
  •   jedihawk    16 年前

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

        5
  •  1
  •   Uri    16 年前

    我不确定这是否一定与数据库有关,因为为组应用过滤器可能需要一个复杂而昂贵的过程(例如,不止一个标志)。

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

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

        6
  •  1
  •   Vineet Reynolds    16 年前
        7
  •  1
  •   Jesse Smith    16 年前

    如果我要命名它,我会称之为“简单出路”(反)模式。是否是反模式实际上取决于具体情况。如果你需要检索的项目数量总是相当少,那么在代码中进行过滤真的不是什么大问题。但是,如果项目数量很大并且有可能持续增长,那么显然应该在服务器上进行过滤。

        8
  •  1
  •   Mike Dunlavey    16 年前

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

    我叫它 驰骋的普遍性 .

        9
  •  0
  •   Charlie Martin    16 年前

    懒散的业余爱好者。

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

        10
  •  0
  •   Frank    16 年前

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

        11
  •  0
  •   Steven Huwig    16 年前

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

    • “法西斯DBA”反模式
    • “'延迟'是什么意思?”反模式
        12
  •  0
  •   Svante    16 年前

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

        13
  •  0
  •   Andrew Grimm atk    15 年前