вопрос про LCOM4 со сваркой / CDI? - PullRequest
1 голос
/ 27 июня 2011

Я новичок как для сонара, так и для сварки / CDI. Я хотел бы, чтобы ваша помощь дала дальнейшие рекомендации по анализу результатов LCOM4 с помощью Weld / CDI Сначала я создаю простой класс 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.
}

------------- Источник ---------------

После того, как я проанализировал с помощью сонара, он сообщает, что MyPublishedBean имеет LCOM4> 1 как

  1. getPhone () Ljava / языки / String;
  2. SetName (Ljava / языки / String;) V
  3. setPhone (Ljava / языки / String;) V
  4. GetName () Ljava / языки / String;

Ранее я использовал для обозначения всех методов как «окончательный», нет никаких упоминаний о LCOM4. В любом случае система показывает мне исключение Unproxyable, так как мой класс содержит последний метод. Я удалил "финал", я столкнулся с проблемой LCOM4.

Я не уверен, запутался ли я в сонаре, сварке / CDI, дизайне класса / интерфейса или всех них. Не могли бы вы помочь проконсультировать дальше?

1 Ответ

4 голосов
/ 27 июня 2011

Документы сонара объясняют LCOM4 довольно хорошо.Результаты, которые вы видите, полностью правильны, учитывая пример, который вы привели здесь.

Эти интерфейсы выглядят так, как будто они просто держатели данных без логики.Бин, имеющий только геттеры и сеттеры для свойств, будет ожидать, что значение LCOM будет равно количеству свойств в бине.LCOM4 - это показатель, предназначенный для измерения связности логики в классе.Логика чистого бина данных состоит только в том, что данные каким-то образом связаны друг с другом.Поэтому в данном случае LCOM4 является неверной и вводящей в заблуждение метрикой.

LCOM4 также должен быть полностью независим от того, являются ли ваши методы окончательными или нет.

Обратите внимание, что LCOM4> 1 указывает на подозреваемый класс.Это не означает, что класс неправильный и не должен использоваться для пометки класса как плохого.Как только вы обнаружите, что с подозрительным классом все в порядке, лучше всего каким-то образом удалить этот класс из метрики (чтобы не создавать длинный список предупреждений, которые, как вы знаете, следует игнорировать).

...