“索引的分配条件大小是否过高”如何工作?

时间:2016-01-09 04:21:38

标签: ruby code-metrics rubocop

Rubocop总是报告错误:

  

app / controllers / account_controller.rb:5:3:C:分配分支索引的条件大小太高。 [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

如何解决?任何人都有好主意?

1 个答案:

答案 0 :(得分:12)

ABC size [1] [2]

  

通过计算一段代码的赋值,分支和条件的数量来计算。原始C ++ Report文章中的计数规则专门用于C,C ++和Java语言。

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

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

实际上,关于错误的快速谷歌显示第一个索引页面为the Rubocop docs for the method that renders that message

您的回购或分析工具将在触发警告时定义阈值金额。

计算,如果你喜欢自我造成......

您的代码计算为

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

这是一个'盲目'的计算,用我组成的值(1 s)。但是,您可以看到错误表示现在可能作为ABC和阈值的数字:

 [30.95/24]

因此,警察阈值为24,而ABC size30.95。这告诉我们rubocop引擎为A,B和C分配不同的数字。同样,不同种类或赋值(或B或C)也可以具有不同的值。例如。 “正常”作业x = y的评分可能低于链式作业x = y = z = r

tl;博士回答

此时,您可能对如何减少ABC大小有一个相当清楚的想法。如果不是:

  1. 一种简单的方法,可以将elsif用于条件,并将其放在辅助方法中。
  2. 因为您正在分配一个@变量,并且主要从一个变量调用,所以您的代码不使用内存封装。因此,您可以将ifelsif阻止操作移动到他们自己的load_search_users_by_roleload_search_users_by_order方法中。