This program gets statistics based on the output of the ckjm program (www.spinellis.gr/sw/ckjm) and
generates graphs in PNG format using gnuplot (V4 or later required). There
is one graph per metric, which all get stored in the current directory.
ckjm must create output using the "plain" (default) option.
To run this program:
ruby mk_ckjm_graphs.rb ckjm-text-file
ckjm plain output creates a text file with a line for each class. Each line
consists of the class name, followed by 8 numeric metrics as described
below. Values are space-separated.
com.my.ClassName WMC DIT NOC CBO RFC LCOM Ca NPM
Example:
com.vz.schedule.data.ScheduleData 15 1 0 0 20 69 3 15
The following text is from Diomidis Spinellis’ ckjm web page:
The metrics ckjm will calculate and display for each class are the
following.
- WMC - Weighted methods per class. A class‘s weighted methods
per class WMC metric is simply the sum of the complexities of its methods.
As a measure of complexity we can use the cyclomatic complexity, or we can
abritrarily assign a complexity value of 1 to each method. The ckjm program
assigns a complexity value of 1 to each method, and therefore the value of
the WMC is equal to the number of methods in the class.
- DIT - Depth of Inheritance Tree. The depth of inheritance tree (DIT)
metric provides for each class a measure of the inheritance levels from the
object hierarchy top. In Java where all classes inherit Object the minimum
value of DIT is 1.
- NOC - Number of Children. A class‘s number of children (NOC)
metric simply measures the number of immediate descendants of the class.
- CBO - Coupling between object classes. The coupling between object
classes (CBO) metric represents the number of classes coupled to a given
class (efferent couplings, Ce). This coupling can occur through method
calls, field accesses, inheritance, arguments, return types, and
exceptions.
- RFC - Response for a Class. The metric called the response for a
class (RFC) measures the number of different methods that can be executed
when an object of that class receives a message (when a method is invoked
for that object). Ideally, we would want to find for each method of the
class, the methods that class will call, and repeat this for each called
method, calculating what is called the transitive closure of the
method‘s call graph. This process can however be both expensive and
quite inaccurate. In ckjm, we calculate a rough approximation to the
response set by simply inspecting method calls within the class‘s
method bodies. This simplification was also used in the 1994 Chidamber and
Kemerer description of the metrics.
- LCOM - Lack of cohesion in methods. A class‘s lack of cohesion
in methods (LCOM) metric counts the sets of methods in a class that are not
related through the sharing of some of the class‘s fields. The
original definition of this metric (which is the one used in ckjm)
considers all pairs of a class‘s methods. In some of these pairs both
methods access at least one common field of the class, while in other pairs
the two methods to not share any common field accesses. The lack of
cohesion in methods is then calculated by subtracting from the number of
method pairs that don‘t share a field access the number of method
pairs that do. Note that subsequent definitions of this metric used as a
measurement basis the number of disjoint graph components of the
class‘s methods. Others modified the definition of connectedness to
include calls between the methods of the class. The program ckjm follows
the original (1994) definition by Chidamber and Kemerer.
- Ca - Afferent couplings. A class‘s afferent couplings is a
measure of how many other classes use the specific class. Ca is calculated
using the same definition as that used for calculating CBO (Ce).
- NPM - Number of Public Methods. The NPM metric simply counts all the
methods in a class that are declared as public. It can be used to measure
the size of an API provided by a package.