[英]Rubocop: Assignment Branch Condition size for method is too high. How can I reduce the method?
[英]How is this method exceeding the Rubocop Account Branch Condition size?
我有一个简单的before_save
方法,用于根据user_id
, application_id
或contact_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是条件数 。
self.account_id =
)。 user_id
, .present?
, user
, .account
, .id
, application_id
, .present?
, application
, .account
, .id
, contact_id
, .present?
, contact
, .account
和.id
) 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.