"Assignment Branch Condition size for index is too high" 是如何工作的?

How does "Assignment Branch Condition size for index is too high" work?

Rubocop 总是报错:

app/controllers/account_controller.rb:5:3: C: Assignment Branch Condition size for index is too high. [30.95/24]

if params[:role]
  @users = @search.result.where(:role => params[:role])
elsif params[:q] && params[:q][:s].include?('count')
  @users = @search.result.order(params[:q][:s])
else
  @users = @search.result
end

如何解决?谁有好主意?

ABC size [1][2]

computed by counting the number of assignments, branches and conditions for a section of code. The counting rules in the original C++ Report article were specifically for the C, C++ and Java languages.

前面的链接详细说明了 A、B 和 C 的重要性。ABC 大小是标量大小,让人联想到三角关系:

|ABC| = sqrt((A*A)+(B*B)+(C*C))

实际上,对错误的快速 google 显示第一个索引页面是 the Rubocop docs for the method that renders that message

您的存储库或分析工具将定义触发警告时的阈值。

计算中,如果你喜欢self-inflicting...

您的代码计算为

(1+1+1)^2  + 
(1+1+1+1+1+1+1+1+1+1+1+1+1)^2   + 
(1+1+1+1)^2 
=> 194 

这是一个 'blind' 计算,其中包含我编写的值 (1s)。但是,您可以看到错误状态数字现在可能作为您的 ABC 和阈值有意义:

 [30.95/24]

所以警察门槛是 24 而你的 ABC size30.95。这告诉我们,rubocop 引擎为 A、B 和 C 分配了不同的数字。同样,不同的种类或分配(或 B 或 C)也可能有不同的值。例如。 'normal' 作业 x = y 的得分可能低于链式作业 x = y = z = r.

tl;博士回答

此时,您可能对如何减小 ABC 大小有了相当清晰的认识。如果不是:

  1. 获取用于 elsif 的条件并将其放入辅助方法的简单方法。
  2. 因为您正在分配一个 @ 变量,并且主要也是从一个变量调用,所以您的代码没有使用内存封装。因此,您可以将 ifelsif 块操作移动到各自的 load_search_users_by_roleload_search_users_by_order 方法中。