Measurement of Maintainability Index (MI) with Testwell CMT++ and CMTJava (Complexity Measures Tools)
Testwell CMT++ and Testwell CMTJava support Lines-of-code-metrics, Halsteads Metrics, McCabe Metrics and the Maintainability Index (MI).
MI is a single-number value for estimating the relative maintainability of the code.
Maintainability Index is calculated with certain formulae from lines-of-code measures, McCabe measure and Halstead measures.
The measurement and track maintainability are intended to help reduce or reverse a system's tendency toward "code entropy" or degraded integrity, and to indicate when it becomes cheaper and/or less risky to rewrite the code instead to change it.
Maintainability Index is defined during the last 10 years in the USA and described e.g. at
Software Engineering Institute´s web pages.
There are two variants of Maintainability Index:
one that contains comments (MI) and one that does not contain comments (MIwoc).
CMT++ and CMTJava calculate them both.
The tools calculate Maintainability Index for functions (and class/struct definitions), for files
and for the whole software.
Meanings of the Maintainability Index (MI, with comments) values:
| 85 and more | good maintainability |
| 65-85 | moderate maintainability |
| < 65 | difficult to maintain with really bad pieces of code (big, uncommented, unstructured) the MI value can be even negative |
To realize the full benefit of MI, the maintenance environment must allow the rewriting of a module when it becomes measurably unmaintainable. The point of measuring the MI is to identify risk; when unacceptably risky code is identified, it should be rewritten.
Calculation of Maintainability Index
Maintainability Index is calculated on each function/class/struct, on each file and on all files together level.
Actually there are three measures:
- MIwoc: Maintainability Index without comments
- MIcw: Maintainability Index comment weight
- MI: Maintainability Index = MIwoc + MIcw
The general formulae for MI is the following:
MIwoc = 171 - 5.2 * ln(aveV) -0.23 * aveG -16.2 * ln(aveLOC)
MIcw = 50 * sin(sqrt(2.4 * perCM))
MI = MIwoc + MIcw
Where
aveV = average Halstead Volume
(CMT++/CMTJava´s V) per module
aveG = average extended cyclomatic complexity
(CMT++/CMTJava´s v(G) ) per module
aveLOC = average count of lines
(CMT++/CMTJava´s LOCphy) per module
perCM = average percent of lines of comments per Module
"module" is (in CMT++ case) a C-like function definition, a C++-like member function definition, or a class/struct definition.
further information about CMT++ and CMTJava
further information about Maintainability Index:
Kurt D. Welker, Idaho National Engineering and Environmantal Laboratory:
The Software Maintainability Index Revisited (August 2001)
last updated: 26.06.2007
© 1996-2007 Testwell Oy / 2006-2007 Verifysoft Technology GmbH
CTA++, CTC++, CMT++ and CMTJava are products of Testwell Oy, Tampere (Finland)
all other trademarks of this site are the property of their respective owners.