web-dev-qa-db-ja.com

Javaのプライベートヘルパーメソッドとパブリックスタティックユーティリティメソッド

Javaクラスが長くなっています。コード品質ツールで実行すると、クラス内の行数にフラグが付けられます。

これは下位層クラスであり、上位層が Spring's@Autowiredで使用します。このクラスには、静的ではないプライベートインスタンスメソッドが多数あります。インスタンスフィールドは使用せず、メソッドパラメーターのみを操作します。

これらのメソッドを別のユーティリティクラスでpublic staticとして安全に移動できますか?欠点は何ですか?

27
Sabir Khan

ここでの「間違った」考え方。

ツールがこれまたはそれについて不平を言っているので、あなたはクラスをやり直しません。

ソースコードのqualityを改善したい場合。このようなツールは、「考える価値のあるトピック」を特定するのに役立ちます。あなたは彼らのフィードバックをhint; 「注文」としてではありません。

したがって、クラス内の「コードの行」について心配する必要はありません。代わりに、このクラスが持つ責務を心配します。意味:行番号のカウント自体は問題ではありませんが、 単一責任原則 の違反は問題です。

したがって、次のステップに戻り、クラスが正確に何をしているかを確認します。そして、明らかに複数のことをしているとき、そのような側面を他のクラスに抽出します!

意味:このコードがすべて、そのクラスの責任に「属している」ことが実際にわかった場合。そこに保管してください。 内部実装の詳細を無関係なヘルパークラスに入れ始めないでください。いくつかのツールが行数について警告するからです。

一方、プライベートメソッドを静的/パッケージ保護されたものに変換すると、それらのメソッドを単体テストできます。これは利点かもしれません。しかし、言ったように:実装の詳細について話している限り、それらは非公開のままにしておくべきです。とにかくユニットテストされるべきではありません。

長文コード:「クリーンコード」とは何かを理解し、理解します。そして、そこに概説されているアイデアに従うようにしてください。

66
GhostCat

メソッドの分割は、技術的なプロパティではなく、目的/アプリケーション/ロジック(名前を付ける)ごとに行う必要があります。

長いソースコードは、いくつかの小さなサイズのクラスに分割される可能性があり、各クラスには独自の目的/責任があります。

4

私は常に静的メソッドを含むユーティリティクラスを使用しており、非常に便利です。メソッドが実際に単一のクラスでのみ使用される場合は、ユーティリティクラスを元のクラス内の静的なプライベートクラスとして配置できます。しかし、多くの場合、一般的な静的ユーティリティメソッドは複数のクラスで使用できることがわかったため、この場合は、複数のクラスで使用できる静的メソッドのセットを使用して個別のユーティリティクラスを作成します。

また、GhostCatの一般的な考え方についての回答にも強く同意します。クラスのサイズに関しては、それは懸念事項かもしれませんが、通常はそれほど心配しません。私が本当に探しているのは、メソッドのサイズです。メソッドは、その名前、パラメーターの名前と順序からロジックまで、短くて自明なものが好きです。内部ロジックの大きなチャンクがある場合-別のメソッドに抽出します。これにより、コードがはるかに読みやすく、保守しやすくなります。

2
Michael Gantman

コードの品質は行数では測定できません。クラスファイルが日々成長しているようなら、クラスが単一責任原則に従っていることを確認してください。

クラスが原則に従っていない場合は、クラスを個々のクラスに分離し、クラスをパッケージにします。

それ以外の場合は、基本クラスを abstract class として作成し、utilメソッドをabstractとして作成できます。基本クラスの抽象メソッドの実装を提供する基本クラスを拡張する子クラスがあります。

ここに良い SOをメソッドを静的として作成できる時期に関する回答

@Zack Jannsenによると、

「静的」は、インスタンス間で何かが変更されないことがわかっている場合に役立ちます。これが当てはまる場合、「単一の責任原則」を実際に検討します。これは、クラスが1つの責任を持ち、変更する理由が1つだけであることを意味します。 「ConvertMpgToKpl(double mpg)」関数、および同様のメソッドを独自のクラスに移動することを検討する必要があると思います。自動車オブジェクトの目的は、自動車のインスタンス化を可能にすることであり、自動車間の比較を提供することではありません。これらはクラスの外部にある必要があります。

Staticを使用すると、オブジェクトを作成せずにメソッドにアクセスできますが、メソッドをstaticにしようとするときは、常に次のことに注意してください

  • メソッドは、入力引数に基づいて一貫した結果を生成します
  • そのメソッドは常にメモリ内にある必要があります(つまり、頻繁にメソッドが必要です)-static経由でアクセスするのではなく、オブジェクト作成の助けを借りて非常に数回しかアクセスされない巨大なメソッドにアクセスする方が良い場合があります
  • 非常に頻繁に使用されるユーティリティメソッドは、staticとして作成できます。
1
rm -rf star