代码之家  ›  专栏  ›  技术社区  ›  Allain Lalonde

使用回调应用程序“深入”是不是不好的做法?

  •  1
  • Allain Lalonde  · 技术社区  · 15 年前

    奇怪的问题,但我不确定它是否是反模式的。

    假设我有一个Web应用程序将向HTML表呈现1000条记录。

    我看到的典型方法是将查询发送到数据库,以某种方式将记录转换为某种抽象状态(数组或对象等),并将转换后的记录放入一个集合中,然后在视图中迭代。

    随着记录数量的增加,这种方法会占用越来越多的内存。

    为什么不随查询一起发送一个回调,在从数据库中读取已翻译行时对其执行操作?这意味着您不需要收集数据以便在视图中进行进一步的迭代,因此内存足迹会缩小,并且您不会对数据进行两次迭代。

    这种方法肯定有一些隐含的错误,因为我很少看到它在任何地方使用。这种方法有什么问题?

    谢谢。

    5 回复  |  直到 15 年前
        1
  •  4
  •   Quassnoi    15 年前

    实际上,这正是开发良好的应用程序应该如何工作的。

    这种方法没有任何问题,只是并非所有的数据库接口都允许您轻松地完成这项工作。

    如果我们说的是禁忌化 10 记录一个又一个社交网络,如果你可以通过一个已经为你实现的单一调用获得一个哈希数组或其他任何东西,就不需要再去处理回调了。

        2
  •  1
  •   Shog9    15 年前

    这种方法肯定有一些隐含的错误,因为我很少看到它在任何地方使用。

    我用它。经常。即使我不需要太多的内存反复复制数据,使用回调看起来也更干净。在带有闭包的语言中,它还允许您将相关的代码放在一起,同时分解出混乱的DB内容。

        3
  •  1
  •   Aaron Digulla    15 年前

    这是一个“受工具限制”的问题:大多数编程语言不允许说“围绕代码做些什么”。近年来,随着关闭的出现,这一问题得到了解决。把闭包看作是将代码传递到另一个方法中的一种方法,然后在上下文中执行该方法。例如,在 GSQL ,你可以写:

    def l = []
    sql.execute ("select id from table where time > ?", time) { row ->
        l << row[0]
    }
    

    这将打开到数据库的连接,创建语句和结果集,然后运行 l << it[0] 对于每一行,DB返回。注意,代码运行在 sql.execute() 但是它可以访问局部变量( l ) 变量定义于 SQLServer() ( row )

    使用这种代码,您甚至可以即时生成HTTP请求的结果,而无需在任何时候将大部分页面保存在RAM中。在我的例子中,我只使用几个kb的RAM将一个2MB的文档传输到浏览器,然后浏览器会咀嚼83s来解析它。

        4
  •  0
  •   Mendelt    15 年前

    这就是迭代器模式允许您做的。在许多情况下,这会在应用程序和数据库之间的接口上分解。像Linq这样的技术甚至有可以将代码发送回数据库的解决方案。

        5
  •  0
  •   Steve    15 年前

    我发现使用接口解析器比深度回调更容易,因为深度回调通过几个类连接在一起。微软的版本比我的版本要高得多,叫做统一。这为访问不应该紧密耦合的类提供了一种更清洁的方法。

    http://www.codeplex.com/unity