7

1. PMDについて:

1.1 PMDチェックを設定して、「変数名が短すぎる、または長すぎる」、「空のコンストラクターを削除するなど」などの一部を無視するにはどうすればよいですか。そうすると、クラスが必要であるという別の警告が表示されます。いくつかの静的メソッドがあります。基本的に、クラスは後の開発のために空でした、そして私は今のところそれをそのままにしておくのが好きです。

1.2この警告アドバイスに従う必要がありますか?

  A class which only has private constructors should be final

1.3それはどういう意味ですか?

 The class 'Dog' has a Cyclomatic Complexity of 3 (Highest = 17)

1.4これはどうですか?私はこれを変更したいのですが、現時点では変更に関して何も頭に浮かびません。

Assigning an Object to null is a code smell. Consider refactoring.

2.FindBugsについて:

2.1宣言より後のある時点で、静的フィールドに書き込むのは本当に悪いことですか?次のコードは私に警告を与えます:

Main.appCalendar = Calendar.getInstance();
Main.appCalendar.setTimeInMillis(System.currentTimeMillis());

ここappCalendarで、は静的変数です。

2.2このコード:

strLine = objBRdr.readLine().trim();

警告を出します:

Immediate dereference of the result of readLine()

はどこにobjBRdrありますかBufferedReader(FileReader)。何が起こる可能性がありますか?readLine()nullになる可能性がありますか?コードはwhile (objBRdr.ready())テストでネストされており、これまでのところ、問題はありません。

Update1:​​2.2は、コードを次のように置き換えたときに修正されました。

strLine = objBRdr.readLine();
    if (strLine != null) {
        strLine = strLine.trim();
    }
4

2 に答える 2

9

1.1PMDチェックを設定するにはどうすればよいですか[...]

PMDは、ルールセットXMLファイルと呼ばれる特別なリポジトリにルール構成を保存します。この構成ファイルには、現在インストールされているルールとその属性に関する情報が含まれています。

これらのファイルはrulesets、PMDディストリビューションのディレクトリにあります。EclipseでPMDを使用する場合は、PMDのカスタマイズを確認してください。

1.2この警告アドバイスに従う必要がありますか?

A class which only has private constructors should be final

すべてのコンストラクターは、常にスーパークラスコンストラクターを呼び出すことから始まります。コンストラクターにスーパークラスコンストラクターへの呼び出しが明示的に含まれている場合は、そのコンストラクターが使用されます。それ以外の場合は、引数なしのコンストラクターが暗黙指定されます。引数なしのコンストラクターが存在しないか、サブクラスに表示されない場合、コンパイル時エラーが発生します。

したがって、すべてのコンストラクターがプライベートであるクラスからサブクラスを派生させることは実際には不可能です。したがって、そのようなクラスにマークを付けるfinalことは、サブクラス化を明示的に防ぐため、良い考えです(ただし必須ではありません)。

1.3それはどういう意味ですか?

The class 'Dog' has a Cyclomatic Complexity of 3 (Highest = 17)

複雑さは、メソッド内の決定ポイントの数にメソッドエントリ用の1を加えたものです。決定ポイントは、「if」、「while」、「for」、および「caselabels」です。一般に、1〜4は低複雑度、5〜7は中程度の複雑度、8〜10は高複雑度、11+は非常に高複雑度を示します。

そうは言っても、AggregateCyclomaticの複雑さの一部を引用するだけでは意味がありません。

[...]このメトリックは、単一のメソッドのコンテキストでのみ意味があります。クラスの循環的複雑度がXであることに言及しても、本質的には役に立ちません。

循環的複雑度はメソッドのパスを測定するため、すべてのメソッドには少なくとも1の循環的複雑度があります。したがって、次のgetterメソッドのCCN値は1です。

public Account getAccount(){
   return this.account;
}

accountこのクラスのプロパティであるこのブギーメソッドから明らかです。ここで、このクラスに15のプロパティがあり、各プロパティの一般的なゲッター/セッターパラダイムに従い、それらが使用可能な唯一のメソッドであると想像してください。つまり、クラスには30の単純なメソッドがあり、それぞれの循環的複雑度の値は1です。クラスの集計値は30になります。

この値には何か意味がありますか?もちろん、時間をかけてそれを見ると、何か面白いものが生まれるかもしれません。ただし、それ自体では、集計値としては本質的に無意味です。クラスの30は何も意味しませんが、メソッドの30は何かを意味します。

次回、クラスの循環的複雑度の集計値を読んでいることに気付いたときは、クラスに含まれているメソッドの数を理解してください。クラスの循環的複雑度の合計値が200の場合、メソッドの数がわかるまで、危険信号を上げないようにする必要があります。さらに、メソッド数は少ないが循環的複雑度の値が高い場合は、ほとんどの場合、メソッドにローカライズされた複雑度を見つけることができます。右に!

したがって、私にとって、このPMDルールは注意して実行する必要があります(実際にはあまり価値がありません)。

1.4これはどうですか?私はこれを変更したいのですが、現時点では変更に関して何も頭に浮かびません。

Assigning an Object to null is a code smell. Consider refactoring.

これについて何が得られないのかわからない。

2.1宣言より後のある時点で、静的フィールドに書き込むのは本当に悪いことですか?[...]

私の推測では、メソッドに不揮発性静的フィールドの非同期の遅延初期化が含まれているため、警告が表示されます。また、コンパイラまたはプロセッサが命令を並べ替える可能性があるため、メソッドが複数のスレッドから呼び出される可能性がある場合、スレッドは完全に初期化されたオブジェクトを参照することが保証されません。フィールドを揮発性にして問題を修正できます。

2.2 [...]Immediate dereference of the result of readLine()

読み取るテキストの行がこれ以上ない場合は、readLine()nullを返し、逆参照するとnullポインター例外が生成されます。したがって、結果がnullかどうかを実際に確認する必要があります。

于 2009-10-10T23:26:05.280 に答える
2

ここにいくつかのアイデア/答え

1.4オブジェクトにnullを割り当てる理由は何ですか?同じ変数を再利用する場合、以前にnullに設定する理由はありません。

2.1この警告の理由は、クラスMainのすべてのインスタンスが同じ静的フィールドを持っていることを確認するためです。Mainクラスでは、静的カレンダーappCalendar = Calendar.getInstance();を使用できます。

2.2については正しいですが、nullチェックを使用すると、NullPointerExceptionが発生しないことが確実になります。BufferedReaderがいつブロック/ゴミ箱に移動できるかはわかりません。これは(私の経験では)頻繁には発生しませんが、ハードドライブがいつクラッシュするかはわかりません。

于 2009-10-10T22:11:51.987 に答える