Rubocop错误'类定义太长红宝石'

brg*_*brg 12 ruby coding-style class rubocop

我得到rubocop错误'类定义太长.[100分之236]".我的课程如下:

class SomeClassName
  include HelperModule
  attr_accessor :aaa, :bbb, :ccc

  .... methods .....
end
Run Code Online (Sandbox Code Playgroud)

可能出什么问题?rubocop docs ClassLength说"类的长度超过某个最大值".这是什么意思?

小智 16

是的,这是因为rubucop认为整体线路太多了.我同意课程不应该太长,但认为最终应该由以下几个方面决定:课程是否有一个责任,方法是否足够简洁,是否有可以通过模块共享的方法等等...数字/警报虽然是一个很好的警告.如果类中的内容看起来没问题,您可以# rubocop:disable ClassLength在类定义的正上方添加.


Ser*_*sev 12

这可能意味着您的类定义需要超过100行代码.

  • @budhram:不,那是作弊. (5认同)

los*_*her 7

(这里有很多好的信息,但是我找到了这个答案,寻找在Rubocop中指定每个类的最大行数的语法,我想其他人也可能会来这里.)

.rubocop.yml

# Allow classes longer than 100 lines of code
ClassLength:
  Max: 250 # or whatever ends up being appropriate
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供此答案-我也搜索了此配置值。一个细节:我认为应该是“ Metrics / ClassLength:” (2认同)

Ano*_*noE 7

一般答案

如果我希望我的班级在这里超过100或需要配置最大长度,我是否需要禁用此警察.你会建议什么?

我在这个工作流程中使用rubocop,假设我遇到一个预先存在的代码库,其中包含大量警告:

  1. 运行rubocop --auto-gen-config以创建"TODO"文件.在主rubocop配置文件中包含该文件.有关详细信息,请参阅文档 在您的示例中,它将生成一个允许长类的配置(如果您有更大的类,则至少236行或更多行).

  2. 现在,如果你运行rubocop,它将忽略你在TODO文件中放置的所有攻击 - 也就是说,现在一切都会好起来的.只有当你引入更多的错误/警告(比如一个237行的类)时,它才会重新启动.所以,在这一点上,rubocop除了阻止你让它变得更糟之外,不会为你做任何事情.

  3. 有一段时间,当我有时间杀死时,我从TODO文件中选择一条规则并对其进行处理.有三种可能性:

    • 从TODO文件中删除规则.这将恢复原来的行为rubocop.
    • 放宽与之相关的数字.比如说,课程长度现在限制在250; 我想把它设置为(比方说)100行,但我知道我现在没有时间重构很多课程.所以我将它设置为240.这将触发240到250行之间的所有类; 可能只有少数我可以轻松处理.我修复它们并继续前进.另一天,我可能会回到它,从240到230等.
    • 有时候我决定不打扰特定的警告.然后我将配置从TODO文件移动到正确的.rubocop文件,永久允许它.

因此,关于所有这些并没有严格的规则.你应该找到自己的价值观.rubocop对象的一些东西对我来说完全没问题,因为它们更多地归结为编码风格而不是正确性等等.

具体答案

如果我希望我的班级在这里超过100或需要配置最大长度,我是否需要禁用此警察.你会建议什么?

我当然确实为我的类文件(以及方法)配置了最大数量的行.代码单元的长度(无论是类还是方法)是一种非常简单但有效的"代码气味",它指向成长的代码和重构/分裂的候选者.

我为我挑选了一些数字,我坚持下去.也就是说,我不会经常向上或向下移动它们以适应特定代码,但如果一段代码增长"1行太大",我就会采取行动.大多数情况下,我的目标是将其大致分成两半,从长远来看,这将导致所需的最小努力.

如果一个课程很长,它通常会打破"每班一个责任"的规则.将其分解成部分通常是有益的.不仅是随机的子类,而且是具有OO合理性,图案化的构造.

如果一个方法很长,它有时可能指向要采取的OO措施(即,引入的类或方法被分割为现有的类;特别是如果该方法由大型if/else构造或特别是case语句组成),但更多时候它需要简单的老式重构为较小的(可能是私有的)方法.

在rubocop中找到你最喜欢的设置很有趣,真棒.