繁体   English   中英

这种方法如何超过Rubocop账户分支条件大小?

[英]How is this method exceeding the Rubocop Account Branch Condition size?

我有一个简单的before_save方法,用于根据user_idapplication_idcontact_id是否已存在于模型中来分配account_id

class Note < ApplicationRecord
  belongs_to :contact
  belongs_to :application
  belongs_to :user
  belongs_to :account

  before_save :assign_account_id

  private

  def assign_account_id
    self.account_id =
      if user_id.present?
        user.account.id
      elsif application_id.present?
        application.account.id
      elsif contact_id.present?
        contact.account.id
      end
  end
end

该方法有效,在我看来,就像我能得到它一样简单,但Rubocop坚持认为它稍微超过了指定分支条件大小(ABC大小),其中限制为15 ,我的方法的ABC为15.33

根据这篇文章 ,ABC大小为15,通过8个任务,8个分支和8个条件实现。 但是,我只计算1个赋值self.account_id = ,1个分支(返回)和3个条件(3个if / elsif语句)。

我错了吗? 附加任务,分支机构或条件来自哪里? 打电话present? ,遍历模型层次结构?

注意:我注意寻找替代实现,我有兴趣了解导致此分数的原因。


对于任何感兴趣的人,这里是我最终使用的解决方案,满足ABC大小。

self.account_id = [
  user&.account&.id,
  application&.account&.id,
  contact&.account&.id
].find(&:present?)

我选择它是因为垂直列表最强烈地传达了场的级联性质。 我觉得我能够回到这里,仍然能够理解它在做什么。

这是 rubocop文档在其源代码中引用 的网页 ,在Metrics/AbcSize的文档中(截至最新版本; 0.61.0 )。

换句话说,它说:

标量ABC大小值(或“聚合幅度”)计算如下: |ABC| = sqrt((A*A)+(B*B)+(C*C)) |ABC| = sqrt((A*A)+(B*B)+(C*C))

其中A分配数, B分支数, C条件数

  • 您的代码有1个分配self.account_id = )。
  • 您的代码有15个分支 (!!!)( user_id.present? , user.account.idapplication_id.present?application.account.idcontact_id.present? , contact.account.id
  • 您的代码有3个条件if ... elsif ... elsif )。

将其插入上述公式给出:

ABC = sqrt(1*1 + 15*15 + 3*3)
    = sqrt(235)
    = 15.32970...

这就是15.33的(舍入)值来自的地方。


我知道你并不是真的要求一个替代的实现,但无论如何这里是一个:

def assign_account_id
  self.account_id = (user || application || contact).account.id
end

......你甚至可以考虑将这些括号移到一个单独的方法中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM