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
クラスに問題がなければ、クラス定義のすぐ上に追加できます。
(ここにはすでに多くの良い情報がありますが、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 ファイルからルールを選んでそれに取り組みます。次の 3 つの可能性があります。
rubocop
ます。したがって、これらすべてについて厳格なルールはありません。あなたはあなた自身の価値を見つけることになっています。rubocop が反対するいくつかのことは、正確性などよりもコーディング スタイルに依存するため、私にはまったく問題ありません。
ここでクラスを 100 より長くしたい場合、または最大長を設定する必要がある場合、この警官を無効にする必要がありますか? 何を提案しますか?
私は間違いなく、クラス ファイル (およびメソッド) に対して最大数の行を構成しています。コードの単位 (クラスであれメソッドであれ) の長さは、非常に単純ですが効果的な「コードの匂い」であり、成長したコードとリファクタリング/分割の候補を示します。
私は自分のためにいくつかの数字を選びましたが、それらに固執しています。つまり、特定のコードに合わせて常に上下に移動するわけではありませんが、コードの一部が「1行大きくなりすぎた」場合は、アクションを実行します。ほとんどの場合、私の目標はそれを大まかに半分に分割することです。これは、長期的には、必要最小限の労力につながります。
クラスが非常に長い場合、通常、「クラスごとに 1 つの責任」という規則に違反します。通常は、パーツに分割することをお勧めします。ランダムなサブクラスだけでなく、実際には OO 正当化可能でパターン化された構造です。
メソッドが非常に長い場合、オブジェクト指向の対策が取られることを示す場合があります (つまり、導入されたクラスまたはメソッドが既存のクラスに分割されている、特にメソッドが大きなif/else
構造体または特にcase
ステートメントで構成されている場合)。単純な昔ながらのリファクタリングをより小さな (おそらくプライベートな) メソッドにします。
rubocop でお気に入りの設定を見つけて楽しんでください。