Maintainability Index
Maintainability Index
is a software metric which measures how maintainable (easy to support and change) the source code is. The maintainability index is calculated as a factored formula consisting of Source Lines Of Code
, Cyclomatic Complexity
and Halstead Volume
.
The original formula:
MI = 171 − 5.2 * log(HALVOL) − 0.23 * log(CYCLO) − 16.2 * log(SLOC)
We use Microsoft Visual Studio version with a shifted scale (0 to 100) derivative:
MI = max(0, (171 − 5.2 * log(HALVOL) − 0.23 * log(CYCLO) − 16.2 * log(SLOC)) * 100 / 171)
Config example
dart_code_linter:
...
metrics:
...
maintainability-index: 50
...
Example
MetricComputationResult<int> computeImplementation(
Declaration node,
Iterable<ScopedClassDeclaration> classDeclarations,
Iterable<ScopedFunctionDeclaration> functionDeclarations,
InternalResolvedUnitResult source,
Iterable<MetricValue> otherMetricsValues,
) {
final halVol = otherMetricsValues.firstWhere(
(value) => value.metricsId == HalsteadVolumeMetric.metricId,
);
final cyclomatic = otherMetricsValues.firstWhere(
(value) => value.metricsId == CyclomaticComplexityMetric.metricId,
);
final sloc = otherMetricsValues.firstWhere(
(value) => value.metricsId == SourceLinesOfCodeMetric.metricId,
);
final halVolScale = log(max(1, halVol.value));
final cycloScale = cyclomatic.value;
final slocScale = log(max(1, sloc.value));
final maintainabilityIndex =
(171 - halVolScale * 5.2 - cycloScale * 0.23 - slocScale * 16.2) / 171;
return MetricComputationResult(
value: (maintainabilityIndex * 100).clamp(0, 100).ceil(),
);
}
Maintainability Index for the example function is 56.
Note: Maintainability Index is still a very experimental metric, and should not be taken into account as seriously as the other metrics.