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

时间:2013-11-22 12:43:37

标签: ruby class coding-style rubocop

我收到rubocop错误'类定义太长。 [100分之236]”。 我的课程如下所示:

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

  .... methods .....
end

可能出现什么问题? rubocop文档ClassLength表示“类的长度超过某个最大值”。 这是什么意思?

4 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:12)

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

答案 2 :(得分:6)

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

.rubocop.yml

# Allow classes longer than 100 lines of code
ClassLength:
  Max: 250 # or whatever ends up being appropriate

答案 3 :(得分:6)

一般答案

  

如果我希望我的班级在这里超过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文件,永久允许它。
  4. 因此,关于所有这些并没有严格的规则。你应该找到自己的价值观。 rubocop对象的一些东西对我来说完全没问题,因为它们更像是编码风格而不是正确性等等。

    具体答案

      

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

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

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

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

    如果方法很长,有时可能会指向要采取的OO措施(即引入的类或方法在现有类上拆分;特别是如果方法由大if/else构造组成或特别是{ {1}}语句,但更多时候它要求简单的老式重构为较小的(可能是私有的)方法。

    在rubocop中找到您最喜欢的设置很有趣,它真棒。