【问题标题】:Rubocop error 'Class definition is too long ruby'Rubocop 错误“类定义太长 ruby​​”
【发布时间】:2013-12-07 08:31:21
【问题描述】:

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

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

  .... methods .....
end

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

【问题讨论】:

    标签: ruby class coding-style rubocop


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • Sergio:如果我希望我的班级在这里超过 100 人或需要配置最大长度,是否需要禁用此 cop。你有什么建议?
      • 或者你可以重写你的类以适应 100 行。这是个好习惯。
      • Sergio:可以在一个模块中采用所有可能的方法,然后将该模块包含在类中吗?
      • @budhram:不,那是作弊。
      • 我更喜欢将这些类型的警察视为警告而不是错误。我仍在尝试找到一种方法将警察配置为 W,而不是 C。
      【解决方案3】:

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

      .rubocop.yml

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

      【讨论】:

      • 感谢您的回答 - 我还搜索了此配置值。一个细节:我觉得应该是Metrics/ClassLength:
      • .rubocop.yml 通常位于何处?
      【解决方案4】:

      一般回答

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

      我在这个工作流程中使用 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 人或需要配置最大长度,我是否需要禁用此 cop。你有什么建议?

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

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

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

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

      在 rubocop 中找到您最喜欢的设置很有趣,这太棒了。

      【讨论】:

        猜你喜欢
        • 2021-03-10
        • 2020-01-08
        • 1970-01-01
        • 2016-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多