代码之家  ›  专栏  ›  技术社区  ›  Chaban33

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

  •  1
  • Chaban33  · 技术社区  · 6 年前

    我有这个计算方法,计算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 回复  |  直到 6 年前
        1
  •  1
  •   CZoellner    6 年前

    我只看到两件事你可以改进:

    1. Datetime 类获取“now”,因为它已经考虑了Odoo的datetime格式。最后,这更易于维护,因为如果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
        })
    
        2
  •  2
  •   Yajo    6 年前

    首先:您应该主要关注批处理操作的性能。您的案例是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