Rubocop错误’类定义太长ruby’

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

class SomeClassName include HelperModule attr_accessor :aaa, :bbb, :ccc .... methods ..... end 

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

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

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

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

.rubocop.yml

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

一般答案

如果我希望我的课程在这里超过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行太大”,我就会采取行动。 大多数情况下,我的目标是将其大致分成两半,从长远来看,这将导致所需的最小努力。

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

如果一个方法很长,它有时可以指向要采取的OO措施(即引入的类或方法在现有类上拆分;特别是如果该方法包含大的if/else结构或特别是case语句),但更多通常它需要简单的老式重构为较小的(可能是私有的)方法。

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