package jdepend.util.todolist;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import jdepend.model.Component;
import jdepend.model.MetricsMgr;
import jdepend.model.util.JDependUnitByMetricsComparator;
public class SplitComponentTODOIdentifyer implements TODOIdentifyer {
private List<TODOItem> list;
private Collection<Component> splitComponents;
private static final Float SplitComponentTODOItemOrder = 100F;
@Override
public List<TODOItem> identify(TODOIdentifyInfo info) throws TODOListException {
list = new ArrayList<TODOItem>();
splitComponents = new HashSet<Component>();
this.identifySplitCompoentWithBalance(info);
this.identifySplitCompoentWithFissileObject(info);
return list;
}
/**
* 根据内聚性指数拆分
*/
private void identifySplitCompoentWithBalance(TODOIdentifyInfo info) {
SplitComponentTODOItem item = null;
for (Component component : info.getResult().getComponents()) {
if (!this.splitComponents.contains(component) && component.getBalance() != null
&& component.getBalance() < 0.2F) {
item = new SplitComponentTODOItem(component);
if (item.isSplit()) {
item.setContent("组件[" + component.getName() + "]内聚性差,需要拆分");
item.setAccording("组件内的Class应该关系更紧密,而与其他组件中的Class关系疏远");
item.setOrder(SplitComponentTODOItemOrder - component.getBalance());
this.splitComponents.add(component);
this.list.add(item);
}
}
}
}
/**
* 根据易分对象识别需要拆分的组件
*/
private void identifySplitCompoentWithFissileObject(TODOIdentifyInfo info) {
List<Component> components = info.getResult().getComponents();
Collections.sort(components, new JDependUnitByMetricsComparator(MetricsMgr.Ce, false));
int Ca;
int Ce;
SplitComponentTODOItem item = null;
L: for (Component component : components) {
if (!this.splitComponents.contains(component)) {
Ca = component.getAfferentCoupling();
Ce = component.getEfferentCoupling();
if (Ca == 1 && Ca < Ce) {
item = new SplitComponentTODOItem(component);
if (item.isSplit()) {
item.setContent("组件[" + component.getName() + "]作为易分对象又被其他组件依赖,需要拆分");
item.setAccording("作为易分对象又被其他组件依赖,需要拆分");
item.setOrder(SplitComponentTODOItemOrder - component.getBalance());
this.splitComponents.add(component);
this.list.add(item);
break L;
}
}
}
}
}
}