【问题标题】:How does "Assignment Branch Condition size for index is too high" work?“索引的分配分支条件大小太高”如何工作?
【发布时间】:2016-04-13 21:05:26
【问题描述】:

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

如何解决?谁有好主意?

【问题讨论】:

    标签: ruby code-metrics rubocop


    【解决方案1】:

    ABC size [1][2]

    通过计算一段代码的赋值、分支和条件的数量来计算。原始 C++ 报告文章中的计数规则专门针对 C、C++ 和 Java 语言。

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

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

    其实快速google一下错误显示第一个索引页面是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 
    

    这是一个“盲目”的计算,其值由我组成 (1s)。但是,您可以看到错误状态的数字现在可能作为您的 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 方法中。

    【讨论】:

    • 谢谢你的解释
    • @pangpang 您应该在方法名称的末尾使用“砰”(!),就像我写的那样,因为这是当方法将数据/状态更改为执行的结果。另外,谢谢你,很高兴
    • 不,这不是约定。约定是,如果且仅当两个方法做同样的事情,那么更令人惊讶的一个会用一个爆炸来命名。这与突变无关(参见例如 ActiveRecord 中的savesave! 或Ruby 中的exitexit!)并且它适用当有 两个 方法时(参见例如 ArrayStringHash 中的十几个方法,它们修改接收器,但没有爆炸。)应该只有如果还有同名的非 bang 方法,则为 bang 方法。
    • @jorgwmittag 我看到你发布了很多好东西。我会相信你的话。
    • c2.com 链接已损坏 -- 这是另一个很好的描述:hub.codebeat.co/docs/…
    猜你喜欢
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 2019-10-17
    • 2021-06-16
    • 2015-09-05
    • 2023-04-07
    • 2022-06-20
    • 1970-01-01
    相关资源
    最近更新 更多