我收到 rubocop 错误“类定义太长。[236/100]'。我的班级如下所示:
class SomeClassName
include HelperModule
attr_accessor :aaa, :bbb, :ccc
.... methods .....
end
可能会出什么问题?rubocop docs ClassLength说“类的长度超过了某个最大值”。这是什么意思?
我收到 rubocop 错误“类定义太长。[236/100]'。我的班级如下所示:
class SomeClassName
include HelperModule
attr_accessor :aaa, :bbb, :ccc
.... methods .....
end
可能会出什么问题?rubocop docs ClassLength说“类的长度超过了某个最大值”。这是什么意思?
是的,这是因为rubucop认为整体线条太多了。我同意类不应该太长,但认为最终应该由以下因素决定:类是否有单一职责,方法是否足够简洁,是否有可以通过模块共享的方法等...数字/警报不过是一个很好的警告。如果类中的内容看起来不错,您可以# rubocop:disable ClassLength
在类定义的正上方添加。
这可能意味着您的类定义需要超过 100 行代码。
(这里已经有很多很好的信息,但是我来到这个答案是为了寻找在 Rubocop 中指定每个类的最大行数的语法,我认为其他人也可能会来这里。)
在.rubocop.yml
# Allow classes longer than 100 lines of code
ClassLength:
Max: 250 # or whatever ends up being appropriate
如果我希望我的班级在这里超过 100 人或需要配置最大长度,是否需要禁用此警察。你有什么建议?
我在这个工作流程中使用了 rubocop,假设我遇到了一个带有大量警告的预先存在的代码库:
运行rubocop --auto-gen-config
以创建“TODO”文件。将该文件包含在您的主 rubocop 配置文件中。有关详细信息,请参阅他们的文档。在您的示例中,它将生成一个允许长类的配置(至少 236 行,如果您有更大的类,则更多)。
现在,如果您运行rubocop
,它将忽略您放入 TODO 文件中的所有违规行为 - 即,现在一切看起来都很好。只有当你引入更多错误/警告(比如一个有 237 行的类)时,它才会再次启动。所以,在这一点上,rubocop
除了阻止你让事情变得更糟之外,不会为你做任何事情。
偶尔,当我有时间消磨时间时,我会从 TODO 文件中挑选一条规则并对其进行处理。有三种可能:
rubocop
.因此,所有这一切都没有硬性规定。你应该找到自己的价值观。rubocop 反对的一些事情对我来说完全没问题,因为它们更多地取决于编码风格而不是正确性或其他什么。
如果我希望我的班级在这里超过 100 人或需要配置最大长度,是否需要禁用此警察。你有什么建议?
我当然确实为我的类文件(以及方法)配置了最大数量的行。代码单元(无论是类还是方法)的长度是一种非常简单但有效的“代码气味”,它指向增长的代码和重构/拆分的候选者。
我为我挑选了一些数字,我坚持使用它们。即,我不会不断地上下移动它们以适应特定的代码,但是如果一段代码变得“一行太大”,我就会采取行动。大多数时候,我的目标是将其大致分成两半,从长远来看,这将导致所需的工作量最少。
如果一个类很长,它通常会打破“每个类一个责任”的规则。将其分解为多个部分通常是有益的。不仅是随机子类,而且实际上是 OO 合理的、模式化的构造。
如果一个方法很长,它有时可以指向要采取的 OO 措施(即,引入的类或将方法拆分为现有类;特别是如果该方法由大型if/else
构造或特别是case
语句组成),但更多时候它需要简单的老式重构为更小的(可能是私有的)方法。
玩得开心在 rubocop 中找到您最喜欢的设置,这太棒了。