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 に答える
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 ファイルからルールを選んでそれに取り組みます。次の 3 つの可能性があります。

    • TODO ファイルからルールを削除します。これにより、 の元の動作が復元されrubocopます。
    • それに関連付けられている番号を緩和します。たとえば、クラスの長さは現在 250 人に制限されています。(たとえば) 100 行に設定したいのですが、今は多くのクラスをリファクタリングする時間がありません。そこで、240 に設定しました。これにより、240 ~ 250 行のすべてのクラスがトリガーされます。おそらく、私が簡単に扱えるものはほんのわずかです。私はそれらを修正して次に進みます。別の日、私はそれに戻って240から230などに行くかもしれません.
    • 時々、特定の警告を気にしないことに決めます。次に、構成を TODO ファイルから適切な .rubocop ファイルに移動し、永続的に許可します。

したがって、これらすべてについて厳格なルールはありません。あなたはあなた自身の価値を見つけることになっています。rubocop が反対するいくつかのことは、正確性などよりもコーディング スタイルに依存するため、私にはまったく問題ありません。

具体的な答え

ここでクラスを 100 より長くしたい場合、または最大長を設定する必要がある場合、この警官を無効にする必要がありますか? 何を提案しますか?

私は間違いなく、クラス ファイル (およびメソッド) に対して最大数の行を構成しています。コードの単位 (クラスであれメソッドであれ) の長さは、非常に単純ですが効果的な「コードの匂い」であり、成長したコードとリファクタリング/分割の候補を示します。

私は自分のためにいくつかの数字を選びましたが、それらに固執しています。つまり、特定のコードに合わせて常に上下に移動するわけではありませんが、コードの一部が「1行大きくなりすぎた」場合は、アクションを実行します。ほとんどの場合、私の目標はそれを大まかに半分に分割することです。これは、長期的には、必要最小限の労力につながります。

クラスが非常に長い場合、通常、「クラスごとに 1 つの責任」という規則に違反します。通常は、パーツに分割することをお勧めします。ランダムなサブクラスだけでなく、実際には OO 正当化可能でパターン化された構造です。

メソッドが非常に長い場合、オブジェクト指向の対策が取られることを示す場合があります (つまり、導入されたクラスまたはメソッドが既存のクラスに分割されている、特にメソッドが大きなif/else構造体または特にcaseステートメントで構成されている場合)。単純な昔ながらのリファクタリングをより小さな (おそらくプライベートな) メソッドにします。

rubocop でお気に入りの設定を見つけて楽しんでください。

于 2016-01-14T20:10:42.413 に答える