1

私はSonarとWeld/CDIの両方に不慣れです。Weld/CDIを使用したLCOM4の分析結果についてさらにアドバイスをお願いします。まず、次のように単純なJavaクラスを作成します。

- - - - - - -ソース - - - - - - - -

interface MyInterface1 {
   String getName();
   void setName(String name);
}

interface MyInterface2 extends MyInterface1 {
   String getPhone();
   void setPhone();
}

public interface MyPublishedInterface extend MyInterface1, MyInterface2 {
   //There is no any definition, it just a collected capabilities 
   //which will be published to other package. Some capabilities 
   //may be hidden and use internally.
}

abstract class MyBean1 implements MyInterface1 {
   private String name;
   @Override
   public String getName() {
      return this.name;
   }
   @Override
   public void setName(String theName) {
      this.name = theName;
   }
}

abstract class MyBean2 extends MyBean1 implements MyInterface2 {
   private String phone;
   @Override
   public String getPhone() {
      return this.phone;
   }
   @Override
   public void setPhone(String thePhone) {
      this.phone= thePhone;
   }
}

public class MyPublishedBean extends MyBean2 implements MyPublishedInterface {
   //There is no any coding, it just a collected capabilities 
   //which will be published to other package. Some capabilities
   //may be hidden and use internally.
}

@Named
@RequestScope
public class MyBackingBean {
   @Inject
   private MyPublishedInterface myPublishedInterface;

   //-----the business method, setter and getter here.
}

- - - - - - -ソース - - - - - - - -

Sonarで分析した後、MyPublishedBeanのLCOM4>1は次のように報告されます。

  1. getPhone()Ljava / lang / String;
  2. setName(Ljava / lang / String;)V
  3. setPhone(Ljava / lang / String;)V
  4. getName()Ljava / lang / String;

以前は、すべてのメソッドを「最終」メソッドとしてマークしていましたが、LCOM4については何も言及されていません。とにかく、私のクラスにはfinalメソッドが含まれているため、システムはUnproxyableに関する例外を表示します。「ファイナル」を削除しましたが、LCOM4の問題に直面しました。

Sonar、Weld / CDI、クラス/インターフェイスデザイン、またはそれらすべてについて混乱しているかどうかはわかりません。さらにアドバイスをお願いします。

4

1 に答える 1

4

SonarのドキュメントはLCOM4を非常によく説明しています。ここで示した例を考えると、表示される結果は完全に正しいものです。

これらのインターフェイスは、ロジックのない単なるデータホルダーのように見えます。プロパティのゲッターとセッターだけを持つBeanは、Bean内のプロパティの数に等しいLCOM値を持つことを完全に期待します。LCOM4は、クラス内のロジックのまとまりを測定するためのメトリックです。純粋なデータBeanの論理は、データが何らかの形で相互に関連しているということだけです。したがって、この場合、LCOM4は、使用するのに不正確で誤解を招くメトリックです。

LCOM4は、メソッドが最終的なものであるかどうかにも完全に依存しない必要があります。

LCOM4> 1は、疑わしいクラスを示していることに注意してください。クラスが間違っているという意味ではなく、クラスに不良のフラグを立てるために使用しないでください。疑わしいクラスに問題がないことがわかったら、そのクラスを何らかの方法でメトリックから削除することをお勧めします(無視する必要があることがわかっている警告の長いリストを作成しないようにするため)。

于 2011-06-27T10:03:41.357 に答える