13

我收到 rubocop 错误“类定义太长。[236/100]'。我的班级如下所示:

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

  .... methods .....
end

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

4

4 回答 4

16

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

于 2014-01-08T16:32:11.510 回答
11

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

于 2013-11-22T12:44:38.073 回答
8

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

.rubocop.yml

# Allow classes longer than 100 lines of code
ClassLength:
  Max: 250 # or whatever ends up being appropriate
于 2015-08-10T19:31:35.380 回答
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 人或需要配置最大长度,是否需要禁用此警察。你有什么建议?

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

我为我挑选了一些数字,我坚持使用它们。即,我不会不断地上下移动它们以适应特定的代码,但是如果一段代码变得“一行太大”,我就会采取行动。大多数时候,我的目标是将其大致分成两半,从长远来看,这将导致所需的工作量最少。

如果一个类很长,它通常会打破“每个类一个责任”的规则。将其分解为多个部分通常是有益的。不仅是随机子类,而且实际上是 OO 合理的、模式化的构造。

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

玩得开心在 rubocop 中找到您最喜欢的设置,这太棒了。

于 2016-01-14T20:10:42.413 回答