package jdepend.model.metrics;
import jdepend.metadata.Attribute;
import jdepend.metadata.Method;
import jdepend.model.Component;
import jdepend.model.JDependUnit;
import jdepend.model.JavaClassUnit;
import jdepend.model.Metrics;
import jdepend.model.MetricsInfo;
public final class ObjectOrientedMetrics implements Metrics {
@Override
public MetricsInfo getMetrics(JDependUnit unit) {
MetricsInfo info = new MetricsInfo();
if (unit instanceof JavaClassUnit) {
info.setMetrics(getObjectOriented((JavaClassUnit) unit));
} else if (unit instanceof Component) {
info.setMetrics(getObjectOriented((Component) unit));
}
return info;
}
public float getObjectOriented(JavaClassUnit javaClass) {
Float objectOriented = null;
int attributeCount = countAttributes(javaClass);
int methodCount = countMethods(javaClass);
if (methodCount != 0) {
objectOriented = new Float(attributeCount) / new Float(methodCount);
} else {
objectOriented = 0F;
}
return objectOriented;
}
public float getObjectOriented(Component component) {
if (component.getClassCount() == 0) {
return 0.0F;
}
Float oo = 0.0F;
for (JavaClassUnit javaClass : component.getClasses()) {
oo += getObjectOriented(javaClass);
}
return oo / component.getClassCount();
}
/**
* 计算非公开属性
*
* @return
*/
private int countAttributes(JavaClassUnit javaClass) {
int count = 0;
for (Attribute attribute : javaClass.getJavaClass().getAttributes()) {
if (!attribute.isPublic() && !attribute.isStatic()) {
count += 1;
}
}
return count;
}
/**
* 计算公开方法
*
* @return
*/
private int countMethods(JavaClassUnit javaClass) {
int count = 0;
for (Method method : javaClass.getJavaClass().getSelfMethods()) {
if (method.isPublic() && !method.isConstruction()) {
count += 1;
}
}
return count;
}
}