package org.projectusus.statistics; import org.projectusus.core.basis.MetricsResults; import org.projectusus.core.basis.SourceCodeLocation; import org.projectusus.core.statistics.CockpitExtension; /** * Implements a linear measurement schema for class size. Classes with more than 20 methods are measured. 21 methods counts 0.05, 40 methods counts 1, and so on. * * @author Nicole Rauch * */ public class LinearClassSizeStatistic extends CockpitExtension { public static final int KG_LIMIT = 12; private double linearViolations = 0.0; public LinearClassSizeStatistic() { super( codeProportionUnit_CLASS_label, KG_LIMIT ); } @Override public void inspectClass( SourceCodeLocation location, MetricsResults results ) { int classSize = valueForClass( results ); addResult( location, classSize ); int surplusMethods = classSize - KG_LIMIT; if( surplusMethods > 0 ) { linearViolations += ((double)surplusMethods / KG_LIMIT); } } public int valueForClass( MetricsResults results ) { return results.getIntValue( MetricsResults.METHODS ); } @Override public double getAverage() { return calculateAverage( linearViolations, getBasis() ); } @Override public String getLabel() { return "Class size"; //$NON-NLS-1$ } @Override protected String getTooltip() { return "The underlying metric determines the number of static and nonstatic methods and initializers in each class.\n" //$NON-NLS-1$ + "The method visibility is not taken into account.\n" + getDescription(); //$NON-NLS-1$ } @Override protected String hotspotsAreUnits() { return format( "with more than %d methods.", KG_LIMIT ); } }