Table of Contents
POM
POM stands for Primitives, Operations, Metrics and is a framework built to compute software metrics on PADL models. A paper introducing POM has been published by Zaidi, Guéhéneuc, and Sahraoui and can be used as reference. Metrics can be a several kinds:
- Unary or binary, depending on whether they take as input one or two IFirstClassEntity(ies);
- Context dependent or independent, depending on whether they can be computed by considering given IFirstClassEntity(ies) independently of the rest of the model.
Metrics Definition
| Names | Definitions |
|---|---|
| ACAIC | Ancestor Class-Attribute Import Coupling |
| ACMIC | Ancestors Class-Method Import Coupling |
| AID | Average Inheritance Depth of an entity |
| ANA | Average number of entities from which an entity inherits informations wrt. to the total number of entities in a model |
| CAM | Relatedness among methods of an entity based on the parameter list of its methods |
| CBO | Coupling Between Objects of one entity |
| CBOingoing | Coupling Between Objects of one entity (in-going coupling only, towards the entity) |
| CBOoutgoing | Coupling Between Objects of one entity (out-going coupling only, from the entity) |
| CIS | Number of public methods in a class |
| CLD | Class to Leaf Depth of an entity |
| cohesionAttributes | Percentage of fields (declared and inherited) used by the declared methods of one entity wrt. all its fields |
| connectivity | Number of couples of methods that use each other |
| CP | Number of packages that depend on the package containing the entity |
| DAM | Ratio of the number of private (and protected) fields wrt. the total number of fields declared in an entity |
| DCAEC | Descendants Class-Attribute Export Coupling of one entity |
| DCCdesign | Number of classes that a class is directly related to (by attribute and parameter declarations) |
| DCCimplementation | Number of classes that a class is directly related to (by attribute declarations and message passing) |
| DCMEC | Descendants Class-Method Export Coupling of one entity |
| DIT | Depth of Inheritance Tree of an entity |
| DSC | Number of top-level entities in a model |
| EIC | Number of inheritance relationships in which super-entities are in external packages |
| EIP | Number of inheritance relationships where the super-entity is in the package containing the entity and the sub-entites is in another package |
| FanOut | Number of methods and fields used by one entity |
| ICHClass | Complexity of an entity as the sum of the complexities of its declared and inherited methods |
| IR | Number of calls from the methods of an entity to the methods and fields declared in its super-entities |
| LCOM1 | Lack of COhesion in Methods of an entity |
| LCOM2 | Lack of COhesion in Methods of an entity |
| LCOM5 | Lack of COhesion in Methods of an entity |
| LOC | Sum of the numbers of lines of code in the methods of an entity |
| McCabe | Sum of the cyclomatic complexities of the operations of an entity |
| MFA | Ratio of the number of methods inherited by an entity wrt. the number of methods accessible by member methods of the entity |
| MLOCsum | Sum of the numbers of lines of code in the methods of an entity. Same as LOC |
| MOA | Number of data declarations whose types are user-defined entities |
| NAD | Number of Attributes Declared by an entity |
| NADextended | Number of Attributes Declared by an entity and in its member entities |
| NCM | Number of Changed Methods of an entity wrt. its hierarchy |
| NCP | Number of Classes Package containing an entity, i.e., the “depth” of the package containment |
| NMA | Number of Methods Added by an entity wrt. its hierarchy |
| NMD | Number of Methods Declared by an entity |
| NMDextended | Number of Methods Declared by an entity and its member entities |
| NMI | Number of Methods Inherited by an entity. Constructors or not considered as method, they are not counted in the result of the metric |
| NMO | Number of Methods Overridden by an entity |
| NOA | Number Of Ancestors of an entity |
| NOC | Number Of Children of an entity |
| NOD | Number of descendents of an entity |
| NOF | Number Of Fields declared by an entity |
| NOH | Number Of Hierarchies in a model |
| NOM | Number Of Methods declared by an entity |
| NOP | Number Of Parents of an entity |
| NOParam | Number of parameters of the methods of an entity |
| NOPM | Number Of Polymorphic Methods in an entity wrt. its hierarchy |
| NOTC | Number of invocations of JUnit assert methods that occur in the code of a test case |
| NOTI | Number Of Transitive Invocation among methods of a class. See the Law of Demeter for a definition |
| NPrM | Number protected members of an entity |
| oneWayCoupling | Coupling Between Objects of one entity (out-going coupling only, from the entity). Same as CBOoutgoing |
| PIIR | Number of inheritance relationships existing between entities in the package containing an entity |
| PP | Number of provider packages of the package containing an entity |
| REIP | EIP divided by the sum of PIIR and EIP |
| RFC | Response for class: number of methods of an entity and of methods of other entities that are invoked by the methods of the entity |
| RFCextended | Response for class: number of methods of an entity and of methods of other entities that are invoked by the methods of the entity plus number of methods declared by that entity |
| RFP | Number of references from entities belonging to other packages to entities belonging to the package containing an entity |
| RPII | PIIR divided by the sum of PIIR and EIP |
| RRFP | RFP divided by the sum of RFP and the number of internal class references |
| RRTP | RTP divided by the sum of RTP and the number of internal class references |
| RTP | Number of references from entities in the package containing an entity to entities in other packages |
| SIX | Specialisation IndeX of an entity |
| TestCaseLOC | Number of lines of code of all the methods of a test case |
| TLOC | Number of lines of code of all the methods of an entity. Same as LOC |
| VGSum | Sum of the cyclomatic complexities of the operations of an entity. Same as McCabe |
| WMC1 | Weight of an entity considering the complexity of each of its method as being 1. (Default constructors are considered even if not explicitely declared) |
| WMCinvocations | Weight of an entity considering the complexity of each of its method as being the numbers of invocations that they perform. (Default constructors are considered even if not explicitely declared). |
| WMCmccabe | Weight of an entity considering the complexity of each of its method as being their McCabe cyclomatic complexity. (Default constructors are considered even if not explicitely declared). |
Metrics Computation
Computing POM metrics using PADL is made easy by the helper class pom.helper.MetricsGenerator. After having installed CPL, PADL, and POM, just go into the POM Tests project and have a look at this class. It provides a main method with snippets of code to call one of the three methods:
computeMetricsFromDirectorycomputeMetricsFromEclipsecomputeMetricsFromJARs
which can be used to compute automatically metrics from various input sources. Also have a look at the constant array listing the metrics that must be computed or avoided: METRICS_TO_AVOID and METRICS_TO_COMPUTE. As other repositories, POM makes it easy to access the different kinds of metrics.
