Javaではクラスごとに何行が多すぎますか?[閉まっている]


74

あなたの経験では、Javaの1つのクラスには何行のコードが多すぎるかについての有用な経験則は何ですか?

明確にするために、行数は特定のクラスにあるべきものとそうでないものに使用する実際の標準にさえ近いものではないことを知っています。クラスは、適切なOOP哲学(カプセル化など)を念頭に置いて設計する必要があります。そうは言っても、経験則はリファクタリングの考慮事項の有用な出発点を提供することができます(つまり、「うーん、このクラスには> n行のコードがあります。ある時点でリファクタリングされます」)。

反対に、おそらく、OOP設計を順守し、長さにも関わらず読み取りと保守が可能な非常に大きなクラスの例に遭遇したことはありませんか?

これは、関数ごとの行に関する、重複しない関連する質問です。


4
私は千行以上のクラスを見てきましたが、「多すぎる」というようなことはないと思います。
マフムードホッサム

5
コンパイルできない場合は多すぎます。真剣に、クラスがあまりにも多くの異なることをしているとき、それは多すぎます。
ベリンロリチュ

20
経験則は最大値に変わり、それが不一致に変わるポリシーに変わります。数を避けてください。カウントと測定は、責任が適切に割り当てられているかどうかを確認する理想的な方法ではありません。
-S.ロット

7
文字列の正しいインチ数とほぼ同じ。
マット

6
30票の質問、最大24k回表示、10回答(まとめて)〜75票。「主に意見に基づくものとして閉鎖」スタック交換へようこそ:) SE文化の中で何かを変える必要がある…
jb。

回答:


79

いくつかの興味深い指標:

            junit fitnesseテストNG tam jdepend ant tomcat
            ----- -------- ------ --- ------- --- ------
最大500 498 1450 355668 2168 5457
平均64.0 77.6 62.7 95.3 128.8 215.9 261.6
最小4 6 4 10 20 3 12
シグマ75 76110 78 129261369
ファイル90632 1152 69 55954 1468
合計行5756 49063 72273 6575 7085 206001 384026

私はFitNesseをベンチマークとして使用します。なぜなら、それを書くことに多くの関係があるからです。FitNesseでは、平均的なクラスの長さは77行です。498行より長いものはありません。また、標準偏差は76行です。つまり、クラスの大部分は150行未満です。5000行を超えるクラスが1つあるTomcatでも、ほとんどのクラスは500行未満です。

これを考慮すると、おそらく200行を下に留まるための良いガイドラインとして使用できます。


9
クラスの責任が1つだけの場合、200〜500行を超える可能性は非常にわずかです。通常、他の関連する責任を処理するための「内部クラス」を持っています。たとえば、Tomcat 5000+の行クラスは、実際には1つのメインクラスであり、1ダースの内部クラスがあります。これは、リクエストハンドラなどがあるJavaでは珍しいことではありません。
ベリンロリチュ

4
これらのメトリックは実際にどのように取得されますか?ただ知りたい
Sнаđошƒаӽ

1
私は通常の機能に関連するリンク質問にこの答え方にもっと傾くだろう: programmers.stackexchange.com/a/9452/100669の LOCは、一種の無関係である、として多分を除いて、非常に一般的な経験則は、単にあなたが可能性がある場合疑問に開始するにはさらに物事を分解することができます。そして、ネストされたクラスのことについて同意します。それにもかかわらず、500はおそらく一般的な警告サインに近いでしょう。
パンツァー危機

@Sнаđошƒаӽgithub.com/AlDanial/ cloc
firephil

32

私にとっては、この文脈ではコード行は無関係です。変更するためにこのクラスに来るさまざまな理由がすべてです。

Personを検証するためのルールを変更したいときにこのクラスに来る場合、Orderを検証するためのルールを変更するために同じクラスに行きたくはありません。 Personを永続化します。

そうは言っても、それを目指すなら、200行以上のクラスはめったに見つかりません。それらは正当な理由で起こりますが、まれです。したがって、レッドフラッグメトリックを探している場合は、開始するのに悪い場所ではありません。ただし、ルールではなくガイドラインにしてください。


200は非常に大雑把な推測として正しいと感じています。あなたが言うように、あなたが最初に心配することではありません。
スティーブ

Javaの重要な点は、LOCをカウントするとき、ゲッター/セッターを無視することです。
MrFox

1
@MrFox:私は同意しません。クラスにLOCデータを歪めるのに十分なゲッターとセッターがある場合、「このクラスはやりすぎですか?」でカウントされます 質問。ただし、妥協案として、NetBeanのゲッター/セッターは、このようなメソッドが持つ過剰なボイラープレートを考慮せずに、1行/行未満にしたいと思います。
ブライアン

23

申し訳ありませんが、多くの回答が「実際には問題ではない」と述べていることに非常に驚いています。クラス内の行数は非常に重要です。どうして?優れたJavaコードを記述する際には、これらの原則を考慮してください...

  • テスタビリティ
  • 凝集
  • カップリング
  • わかりやすさ

多くの行が含まれるクラスは、これらの原則のすべてに違反する可能性が高いでしょう。

「本当に問題ではない」と言っている人のために... 5000行以上の行があるクラスを試して理解するのはどれほど楽しいですか?または、それを変更するには?それが楽しいと言うなら、あなたは痛みに対して奇妙な親和性を持っている...

1000行を超えるクラスは、少なくとも上記の原則に違反している可能性があるかどうかを質問し、場合によってはいくつかの「派生」クラスに解析する必要があります。

私のコメントは、Martin Fowler、Joshua Bloch、Misko Heveryなどの著者を読んで研究することに基づいています。優れたJavaコードを作成するために参照する優れたリソースです。

次の人(数年後にはあなたになるかもしれません)に好意を与え、より多くの行ではなく、より少ない行を持つクラスを書くよう努めてください。


5000+は一般的に良い兆候ではない(ネストされたクラスをカウントしない)ことは誰もが同意すると思いますが、実際の問題よりも副作用や何かのように感じます。もちろん、一部の人々は過度に冗長であり、変数などを宣言および初期化するためだけに過剰な行を使用します-そして、彼らはそれを止める必要があります。それはない、それが読みにくくなります。ただし、クラス構造に関連する場合、問題はLOC自体ではありません。そもそも誰かが物事をうまく分割できていないという事実であり、LOCはその副作用です。
パンツァー危機

2
重要なのは、クラスは高い凝集度と明確な責任を持たなければならないということです。つまり、通常、クラスはそれほど大きくはなりません。しかし、クラスが適切に設計されていても5000行以上のコードがある場合、それを複数の小さな密結合クラスに分割することは誰にも役立ちません。
ジャックB

12

行数ではなく、複雑さに依存します。私は理解しやすく、正確に1つのことを実行し、それをうまく実行する大きな愚かなルーチンを書きましたが、何百行も続きました。理解しにくい(そしてデバッグしにくい)かなり短い関数を作成しました。

もう1つ確認できるのは、クラス内のパブリック関数の数です。これは警告サインでもあります。

十分な数は入手できませんが、お店で役立つことをするまともなコードを見て、それを基にすることをお勧めします。確かに、最も長いクラスと最大のAPIを調べる必要があります。


7
+1:線のような愚かなものを測定しないでください。循環的な複雑さと機能の数(メソッドの数)は、行をより意味があります。
-S.ロット

2
はいといいえ。行数が多すぎると、設計が不適切であることが多く、そのため、クラスでリファクタリングが必要になる可能性があります。
11

1
@jwentingはい、それは私が得ていたものです。多くの行をリファクタリングする必要があることはわかっていますが、設計が不十分であるために作業しているほとんどすべてのクラスをリファクタリングする必要があります。
マイケル

5

クラスがあまりにも多くの異なることをしている場合、コードの行が多すぎます。基本的に、クラスの単一責任の原則に従う場合、クラスが成長する大きさに制限があります。

あなたが持つことができる物理的な制限について(ソース:クラスファイル形式Java5):

  • 65,536個の定数、適用されるインターフェイス、フィールド、メソッド、および属性-それぞれ 注:を使い果たす前に、一定のスペースが不足します任意の他の項目の。注2:属性はクラスファイルの構造です。「@ Attribute」マーカーと混同しないでください(つまり、デバッグ情報とバイトコードはメソッドの個別の属性として保存されます)。
  • 各メソッドは、4GB(32ビット)の生成されたバイトコードにすることができます。注:1.5より前のJavaバージョンでは、各メソッドに対して生成されるバイトコードは64KB(16ビット)のみでした。

要するに、クラスファイルは、だれもが有用と考えるよりもはるかに大きくなる可能性があります。単一の責任原則に固執する場合、クラスファイルは適切なサイズになります。


1
単一の責任のために+1 :) @Berinこれをソフトウェアに厳密に実装していますか?
アディティアP

はい。秘Theは、理にかなった方法で責任を分割することです。
ベリンロリチュ

ああ、古き良き64KB境界。すべての静的htmlに対して多くのprintlnステートメントを使用して単一のメソッドに変換されるため、JSPが複雑すぎるかどうかを確認するための素晴らしいlithmusテスト:)
11

Java 5の時点で、4GBに増加しました。心配ありません。
ベリンロリチュ

5

正解は42です。冗談です。
実際、クラスごとの最大推奨行は2000行です。

1999年以降の「Java Code Conventions」では、次のように記述されてい
ます。2000行を超えるファイルは扱いにくいため、避ける必要があります。

Javaが発明されて以来、Sun / Oracle Codingの慣習に従ってきたので、クラスごとの行に関するこの経験則は妥当であることがわかりました。Javaコードの99%が準拠する必要があります...そして、2000を超える場合は、クラスに作業が必要であることを示すTODOを先頭に付けてください。

最悪なのは、プログラマーが各クラスにほとんど機能を持たずに非常に多くの小さなクラスを作成する場合の反対です。「Favor Composition」へのアドバイスを無視して、プログラマーは、大規模なクラスの問題(少なくとも通常は関連するクラス名で機能を維持する)よりもはるかに悪い複雑なオブジェクトモデルを作成する何百もの継承クラスを作成します。

http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-141855.html#3043


実際、それらのほとんどはコメントです@LluisMartinez
Xtreme Biker

2000年には強く反対します。クラスは、コメントを除いて200行以内でなければなりません。
ニコラス

4

クリーンコード:

クラスは小さくなければなりません!

クラスの最初のルールは、クラスを小さくすることです。クラスの2番目のルールは、クラスをそれよりも小さくすることです。いいえ、関数の章のまったく同じテキストを繰り返すつもりはありません。ただし、関数の場合と同様に、クラスの設計に関しては、より小さいことが主要なルールです。関数の場合と同様に、当面の質問は常に「どれくらい小さいのですか?」

**関数では、物理的なラインをカウントしてサイズを測定しました。クラスでは、別のメジャーを使用します。責任を数えます。**

クラスの名前は、それが果たす責任を記述する必要があります。実際、命名はおそらくクラスサイズの決定を支援する最初の方法です。クラスの簡潔な名前を導出できない場合は、大きすぎる可能性があります。クラス名があいまいなほど、責任が多すぎる可能性が高くなります。たとえば、Processor、Manager、Superなどのイタチの単語を含むクラス名は、多くの場合、不幸な責任の集約を示唆しています。

次に:

  • メソッドが1つのことだけを行うようにしてください。
  • 次に、クラスの責任が多すぎないことを確認します。

最終的に、管理可能なサイズのクラスになります。


もしClean Codeあなたの答えがロバートC.マーティンの本に言及しているなら(そうです!)、私はあなたと言わなければなりません。その本が私をこの質問に導いたものです。私はこの答えはそれをすべて言うと思う
Sнаđошƒаӽ

2

行数は、クラスの品質の指標としてはかなり貧弱です。私にとって、私は(他の人が言及したように)パブリックメソッドと公開されているプロパティ(Javaのパブリックゲッター/セッターを推測します)を見るのが好きです。私が注意を引く可能性があるために数字を空中から取り出さなければならなかった場合、それぞれが10を超えると言います。実際、プロパティまたはメソッドのいずれかが5つ以上ある場合は、よく見てリファクタリングする方法を見つけますが、10を超えるものは通常、何かが十分に公開されていない可能性が高いという警告サインです。

完全に別の会話ですが、プライベートなメソッドとフィールドは私にとって臭いが少ないので、それらが行数に大きく貢献している場合、私は心配することはありません。少なくとも、オブジェクトを遠くから操作している神のコントローラーがいないことを示していますが、これはかなり問題のある設計上の問題です。


2

より良いメトリックを使用してみてください。

1つの例はABC Metricです。これは、コードの量よりも、コードによって実行されている作業の量の指標です。


1

クラスの外部で記述されたクラスの問題領域内にある行は、それが存在するクラスの1行が少なすぎ、1行が多すぎます。クラスをトピックと考えてください。カバーする必要があります。できるだけ簡潔にするのが理想ですが、500行かかる場合は500行かかります。これらの行の100行が別のトピックをカバーしている場合、それらは別の場所に属します。内部クラスとしてクラス内の小さなサブドメインに分割することは理にかなっていますが、他の場所で使用している場合にのみクラスの外部のサブドメインを定義します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.