优化代码以获得更好的性能和质量

时间:2018-09-07 11:45:52

标签: odoo odoo-9

我有这种计算方法,可以计算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 :(得分:2)

第一件事:您应该主要考虑批处理操作的性能。您的案例是onchange方法,这意味着:

  • 它将由用户交互手动触发。
  • 它一次只会影响一条记录。
  • 它不会执行数据库写操作。

因此,基本上,这不是您模块中的关键瓶颈。

但是,您正在问如何将其变得更好,所以就到这里了。这只是一个想法,在某些方面有所不同(不是更好),但是通过这种方式,您可能会在自己喜欢的某个地方看到不同的方法:

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

答案 1 :(得分:1)

我只看到您可以在此处改进的两件事:

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