Хранение или вычисление итогов для сложных моделей - PullRequest
0 голосов
/ 18 октября 2010

Все,

Я разрабатываю приложение с использованием Zend Framework для управления тендерами на строительные работы.

Тендер будет представлять собой довольно сложный набор моделей с архитектурой, напоминающей фрагмент кода.ниже.

Мой вопрос: должен ли я хранить общую стоимость тендера как часть модели тендера, или я должен вычислять ее каждый раз, когда она требуется?Общая стоимость тендера будет суммой всех компонентов (например, завод / рабочая сила / материалы / накладные расходы / и т. Д.).

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

1 Ответ

0 голосов
/ 18 октября 2010

Я не знаю, Zend конкретно, но, как правило, я бы рекомендовал вычисления в качестве начальной стратегии. Храните его только в случае необходимости по соображениям производительности. Обоснование:

  1. Вам необходимо написать функцию вычисления в обоих случаях.
  2. Если вы храните (кэшируете) его, вам потребуется стратегия для обнаружения изменений в структуре тендера и обновления кэшированного значения. Это дополнительная сложность, поэтому представьте ее, только если / когда она вам понадобится.

Вы должны иметь возможность скрыть стратегию реализации за интерфейсом [getTotal()] - поэтому звонящим клиентам не придется менять, если вы решите кешировать позже.

(Конечно, есть предостережения, приведенные выше. Если структура неизменна, то вы можете безопасно кэшировать без необходимости обнаружения обновлений).

...