package jdepend.util.todolist;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import jdepend.framework.exception.JDependException;
import jdepend.metadata.Method;
import jdepend.model.JDependUnit;
import jdepend.model.JavaClassUnit;
import jdepend.model.MetricsMgr;
import jdepend.model.util.JDependUnitByMetricsComparator;
public final class AdjustAbstractTODOItem extends TODOItem {
private JDependUnit unit;
public AdjustAbstractTODOItem(JDependUnit unit) {
super();
this.unit = unit;
}
public JDependUnit getUnit() {
return unit;
}
@Override
public List<Object> execute() throws TODOListException {
StringBuilder info = new StringBuilder();
if (unit.getStability() < 0.5) {
Collection<JavaClassUnit> abstractnessClasses = new ArrayList<JavaClassUnit>();
// 抽象程度不够
List<JavaClassUnit> javaClasses = new ArrayList<JavaClassUnit>(unit.getClasses());
// 按传入耦合倒序排序
Collections.sort(javaClasses, new JDependUnitByMetricsComparator(MetricsMgr.CaCoupling, false));
// 搜索代码行数超过500,方法超过200的JavaClass
L: for (JavaClassUnit javaClass : javaClasses) {
if (!javaClass.getJavaClass().isAbstract() && javaClass.getLineCount() > 500) {
for (Method method : javaClass.getJavaClass().getSelfMethods()) {
if (method.getSelfLineCount() > 200 && !method.isStatic()) {
if (!abstractnessClasses.contains(javaClass)) {
abstractnessClasses.add(javaClass);
if (abstractnessClasses.size() >= 5) {
break L;
}
}
}
}
}
}
if (abstractnessClasses.size() > 0) {
for (JavaClassUnit javaClass : abstractnessClasses) {
info.append("建议将[" + javaClass.getName() + "]设计成接口或抽象类,并采用多个子类分散其逻辑\n");
}
} else {
info.append("未识别出需要设计成接口或抽象类的Class\n");
}
} else {
info.append("不必设计过多的接口或抽象类\n");
}
List<Object> infos = new ArrayList<Object>();
infos.add(info);
return infos;
}
@Override
public String getAccording() {
return "违反稳定抽象等价原则";
}
@Override
public List<Object> getInfo() {
try {
return this.execute();
} catch (JDependException e) {
e.printStackTrace();
return null;
}
}
}