Оптимизация кода для лучшей производительности и качества - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть этот метод расчета, который рассчитывает 6 полей и всего.Оно работает.Вопрос в том, как я могу оптимизировать его с точки зрения производительности и качества кода.Просто хочу получить несколько советов о том, как написать лучший код.

def _ocnhange_date(self):
    date = datetime.datetime.now().strftime ("%Y-%m-%d %H:%M:%S")
    self.date = date
    self.drawer_potential = self.drawer_id.product_categ_price * self.drawer_qty
    self.flexible_potential = self.flexible_id.product_categ_price * self.flexible_qty
    self.runner_potential = self.runner_id.product_categ_price * self.runner_qty
    self.group_1_potential = self.group_1_id.product_categ_price * self.group_1_qty
    self.group_2_potential = self.group_2_id.product_categ_price * self.group_2_qty
    self.group_3_potential = self.group_3_id.product_categ_price * self.group_3_qty
    total = [self.drawer_potential,self.flexible_potential,self.runner_potential,self.group_1_potential,
             self.group_2_potential,self.group_3_potential]
    self.total_potentail = sum(total)

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Перво-наперво: вы должны беспокоиться о производительности в основном при пакетных операциях. Ваш случай - это метод обмена, который означает:

  • это будет вызвано вручную при взаимодействии с пользователем.
  • это повлияет только на одну запись за раз.
  • не будет выполнять запись в базу данных.

Так что, по сути, это не будет критическим узким местом в вашем модуле.

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

def _ocnhange_date(self):
    # Use this alternative method, easier to maintain
    self.date = fields.Datetime.now()
    # Less code here, although almost equal
    # performance (possibly less)
    total = 0
    for field in ("drawer", "flexible", "runner",
                  "group_1", "group_2", "group_3"):
        potential = self["%s_id"].product_categ_price * self["%s_qty"]
        total += potential
        self["%s_potential"] = potential
    # We use a generator instead of a list
    self.total_potential = total
0 голосов
/ 07 сентября 2018

Я вижу только две вещи, которые вы можете улучшить здесь:

  1. Используйте класс Odoo Datetime, чтобы получить «сейчас», поскольку он уже учитывает формат даты и времени Odoo. В конце концов, это удобнее в обслуживании, потому что если Odoo решит изменить всю систему форматирования в целом, вам также придется изменить свой метод.

  2. Старайтесь избегать так много назначений и вместо этого используйте методы, которые позволяют комбинированное обновление некоторых значений. Для методов onchange это будет update(), а для других изменений значений это, очевидно, write().

def _onchange_date(self):
    self.update({
        'date': fields.Datetime.now(),
        'drawer_potential': self.drawer_id.product_categ_price * self.drawer_qty,
        'flexible_potential': self.flexible_id.product_categ_price * self.flexible_qty,
        # and so on
    })
...