【问题标题】:Storing or computing totals for complex models存储或计算复杂模型的总数
【发布时间】:2010-10-30 22:42:12
【问题描述】:

全部,

我正在使用 Zend Framework 开发一个应用程序来管理建筑工程的投标。

招标将是一组相当复杂的模型,其架构类似于下面的代码 sn-p。

我的问题是......我应该将投标的总价值存储为投标模型的一部分,还是应该在每次需要时计算它?投标的总价值将是所有组成部分的总和(例如工厂/劳动力/材料/间接费用/等)。

object(Application_Model_Tender)#75 (4) {
  ["_id":protected] => int(1)
  ["_name":protected] => string(33) "Tender Name"
  ["_due":protected] => string(10) "2010-12-01"
  ["_labour":protected] => array(2) {
    [0] => object(Application_Model_Gang)#81 (3) {
      ["_id":protected] => int(1)
      ["_name":protected] => string(25) "First Gang Name"
      ["_gangMembers":protected] => array(2) {
        [0] => object(Application_Model_GangMember)#93 (5) {
          ["_id":protected] => NULL
          ["_name":protected] => string(11) "Labour Type"
          ["_workingPattern":protected] => string(7) "Default"
          ["_cost":protected] => float(546)
          ["_qty":protected] => int(3)
        }
        [1] => object(Application_Model_GangMember)#91 (5) {
          ["_id":protected] => NULL
          ["_name":protected] => string(11) "Labour Type"
          ["_workingPattern":protected] => string(8) "Custom 1"
          ["_cost":protected] => float(777)
          ["_qty":protected] => int(1)
        }
      }
    }
    [1] => object(Application_Model_Gang)#90 (3) {
      ["_id":protected] => int(2)
      ["_name":protected] => string(15) "Second Gang Name"
      ["_gangMembers":protected] => array(1) {
        [0] => object(Application_Model_GangMember)#92 (5) {
          ["_id":protected] => NULL
          ["_name":protected] => string(11) "Labour Type"
          ["_workingPattern":protected] => string(8) "Custom 1"
          ["_cost":protected] => float(777)
          ["_qty":protected] => int(2)
        }
      }
    }
  }
}

【问题讨论】:

    标签: oop zend-framework frameworks data-modeling


    【解决方案1】:

    我不具体了解zend,但作为一般规则,我建议将计算作为初始策略。仅在出于性能原因需要时才存储它。理由:

    1. 这两种情况都需要编写计算函数。
    2. 如果您存储(缓存)它,您将需要一种策略来检测对投标结构的更改并更新缓存值。这是额外的复杂性,因此只有在您发现需要时才引入它。

    您应该能够将实现策略隐藏在接口 [getTotal()] 后面 - 这样,如果您决定在以后进行缓存,调用客户端就不必更改。

    (上面当然有一些警告。如果结构是不可变的,那么您可以安全地缓存而无需更新检测)。

    【讨论】:

    • 这对我来说已经足够了。除非遇到性能问题,否则我会去计算。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2020-08-19
    • 2017-08-31
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 2012-12-01
    相关资源
    最近更新 更多