Pular para o conteúdo principal

Índice de Manutenibilidade

Índice de Manutenibilidade é uma métrica de software que mede quão manutenível (fácil de suportar e alterar) o código-fonte é. O índice de manutenibilidade é calculado como uma fórmula fatorada composta por Source Lines Of Code, Cyclomatic Complexity e Halstead Volume.

A fórmula original:

MI = 1715.2 * log(HALVOL)0.23 * log(CYCLO)16.2 * log(SLOC)

Usamos a versão de Microsoft Visual Studio com uma escala deslocada (de 0 a 100):

MI = max(0, (1715.2 * log(HALVOL)0.23 * log(CYCLO)16.2 * log(SLOC)) * 100 / 171)

Exemplo de configuração

flutterando_metrics:
...
metrics:
...
maintainability-index: 50
...

Exemplo

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 indiceDeManutenibilidade =
(171 - halVolScale * 5.2 - cycloScale * 0.23 - slocScale * 16.2) / 171;

return MetricComputationResult(
value: (indiceDeManutenibilidade * 100).clamp(0, 100).ceil(),
);
}

Índice de Manutenibilidade para a função do exemplo é 56.

Nota: O Índice de Manutenibilidade ainda é uma métrica muito experimental e não deve ser levado tão a sério quanto as outras métricas.