Syst0m
Decision Support Systems 13 (1995) 241-262
ELSEVIER
A software complexity model of object-oriented systems
D a v i d P. T e g a r d e n
a, * S t e v e n D . S h e e t z b D a v i d E . M o n a r c h i c
a The R.B. Pamplin College of Business, Virginia Tech, Blacksburg, VA 24061-0101, USA
b Graduate School of Business, University of Colorado, Boulder, CO 80309-0419, USA
c Graduate School of Business, University of Colorado, Boulder, CO 80309-0419, USA
Abstract
A model for the emerging area of software complexity measurement of OO systems is required for the integration
of measures defined by various researchers and to provide a framework for continued investigation. We present a
model, based in the literature of OO systems and software complexity for structured systems. The model defines the
software complexity of OO systems at the variable, method, object, and system levels. At each level, measures are
identified that account for the cohesion and coupling aspects of the system. Users of OO techniques perceptions of
complexity provide support for the levels and measures.
Keywords: Object-oriented systems; Software metrics; Software measurement; Software quality
I. Introduction
Among the many claimed benefits of ObjectOriented (OO) systems are faster development,
higher quality, easier maintenance, reduced costs,
increased scalability, better information structures, and increased adaptability [51]. One of the
primary reasons for these claims is that OO approaches control complexity of a system by supporting hierarchical decomposition through both
data and procedural abstraction [7]. However, as
Brooks points out, " T h e complexity of software is
an essential property, not an accidental one" [10].
The O O decomposition process merely helps
control the inherent complexity of the problem; it
does not reduce or eliminate the complexity.
Measurement of the software complexity of OO
* Corresponding author.
systems has the potential to aid in the realization
of these expected benefits.
Measurement of software complexity has been
of great interest to researchers in software engineering for some time [6,22,35]. Software complexity has been shown to be one of the major
contributing factors to the cost of developing and
maintaining software [20]. According to Coad and
Yourdon [15], a good OO design is one that
allows trade-offs of analysis, design, implementation and maintenance costs throughout the lifetime of the system so that the total lifetime costs
of the system are minimized. Software complexity
measurement can contribute to making these cost
trade-offs in two ways. These are:
(1) To provide a quantitative method for predicting how difficult it will be to design, implement, and maintain the system.
(2) To provide a basis for making the cost tradeoffs necessary to reduce costs over the lifetime of the system.
0167-9236/95/$09.50 © 1995 Elsevier Science B.V, All rights reserved
SSDI 0167-9236(93)E0045-F
242
D.P. Tegarden et aL / Decision Support Systems 13 (1995) 241-262
System
Level
Complexity
Object
Level
Complexity
Vaziable
Level
Complexity
Method
Level
Complexity
Contributes To
40,47,52]. These researchers have applied traditional complexity metrics to O O systems [52],
identified new metrics for O O systems
[13,31,40,44,47], or considered both approaches
[37,38,39]. The proposed model and measures fall
into the last category. Measures that correspond
to those identified by these researchers are included in the set of proposed measures. What has
been lacking in the previous research is a framework for the organization and investigation of the
identified measures. The levels defined in the
proposed model specifically address this issue.
Work in other areas of OO system measurement includes measures of object reuse [5,23,24,
34], measures of OO CASE effectiveness [1,2],
and planning and estimation models [28,32].
The next section of the paper provides background for the model and measures. The following section presents the model and the set of
measures identified for each level. The final section contains a summary and identifies future
research directions.
Fig. 1. Model of software complexity of object-oriented systems.
2. Background
We propose a model of the software complexity of O O systems described at four levels: variable, method, object, and system. Fig. 1 shows the
levels and the relationships between the levels.
At each level, measures are identified to account
for the cohesion (intra) and coupling (inter) aspects of the system at that level. The measures
account for both procedural and data characteristics of an O O system, and are applicable throughout the lifetime of an O O system. Together the
measures provide analysts, designers, and programmers using OO techniques the ability to
identify which components of an O O system are
the most complex, and may therefore require
additional analysis, design, or testing.
1.1. Related work
Traditional systems have been the focus for
most of the past work on software complexity
measurement [16,22,35,54]. Recently there has
been increasing interest in software complexity
measurement of O O systems [11,13,31,37,38,39,
2.1. Definition of software complexity
Software complexity measurement is an area
of software engineering concerned with the measurement of factors that affect the cost of developing and maintaining software. Zuse [54] states
that the term "software complexity" is poorly
defined and that software complexity measurement is a misnomer. He offers a definition of
software complexity that is consistent with our
approach:
The true meaning of software complexity is the
difficulty to maintain, change and understand software. It deals with the psychological complexity of
programs. [54]
Three specific types of psychological complexity that affect a programmer's ability to comprehend software have been identified [12,16]: problem complexity, system design complexity, and
procedural complexity.
Problem complexity is a function of the problem domain. Simply stated, it is assumed that
D.P. Tegarden et aL / Decision Support Systems 13 (1995) 241-262
complex problems are more difficult for a programmer to comprehend than simple problems.
Since this type of complexity is impossible to
control, it generally is ignored in software engineering.
System design complexity addresses the mapping of a problem space into a given representation. Structural complexity and data complexity
are the two types of system design complexity
defined for structured systems [12]. Structural
complexity addresses the concept of coupling.
Coupling measures the interdependence of modules of source code, e.g., C functions calling other
C functions. It is assumed that the more coupling
between modules, the more difficult it is for a
programmer to comprehend a given module.
Data complexity addresses the concept of cohesion. Cohesion measures the intradependence
of a module. In this case, it is assumed that the
more cohesive a module, the easier it is for a
programmer to comprehend the module [49].
Structural and data complexity measures are
based on the module's fan-in, fan-out, and number of i n p u t / o u t p u t variables [3,11,25].
The complexity of a system is based on the
sum of the structural and data complexity for all
modules in the system [12]. These measures address information system complexity at the system
and module levels. This multiple level approach
with an emphasis on cohesion and coupling provides a basis in traditional software measurement
for the proposed software complexity model of
OO systems.
Procedural complexity is associated with the
logical structure of a program. This approach to
complexity measurement assumes that the length
of the program (number of tokens or the lines of
code) [22] or the number of logical constructs
(sequences, decisions, or loops) [35] that a program contains determines the complexity of the
program [12].
In this paper, we address system design complexity for O O systems.
2.2. Desirable properties o f software measures
Many authors propose desirable properties of
measures for effective evaluation of software
243
complexity [18,35,53]. We believe two essential
properties should be used to c~eate a set of
measures of software and designs. First, the measures should be applicable throughout the system
development process. Many procedural complexity measures, such as lines of source code, that
have an inherent dependence on completing significant portions of the development effort before
the measure can be applied ignore potential opportunities to control software complexity in the
early phases of the development process. Second,
the measures should be intuitive in nature. By
intuitive, we mean that analysts, designers, and
programmers can agree on the reasonableness of
both aggregate and component measures.
2.3. Characteristics o f good O 0 systems design
Criteria for a good OO design have been identified using the concepts of coupling, cohesion,
reuse, clarity, depth of the generalization-specialization hierarchy, simplicity, and size [15]. Other
researchers have identified the need for measures
for the evaluation of an object. The measures
identified include the concepts of coupling, cohesion, sufficiency, completeness, and primitiveness
[7]. Clarity, simplicity, sufficiency, completeness,
and primitiveness are associated with the comparison of a design or software to the problem domain requirements and therefore, problem complexity. It is not clear how they can be measured
from available static representations (source code
or designs); therefore, we do not address them
further.
Two types of coupling (interaction and inheritance) and three types of cohesion (service, class,
and generalization-specialization) have been
identified [15]. In this paper, we propose measures of interaction coupling, inheritance coupling, service cohesion, and class cohesion. Generalization-specialization cohesion requires domain specific knowledge and, therefore, is associated with problem complexity, not system design
complexity. In addition, measures of the depth
and size of the generalization-specialization hierarchy for an O O system are proposed. Each of
these measures can be calculated from the available static representations of an OO system.
244
D.P. Tegarden et al. / Decision Support Systems 13 (1995) 241-262
2. 4. Software design fundamentals emphasized by
O 0 systems
OO systems emphasize three software design
fundamentals that are useful in controlling software complexity: polymorphism, encapsulation,
and inheritance. Each of these is described below.
This increases the difficulty of understanding the
employee objects. When used this way, polymorphism can lead to the same type of software
engineering problems created by the unconstrained use of goto statements [42]. The key to
controlling an OO system's complexity through
the use of polymorphism is to ensure that all
operations with the same name are semantically
consistent.
2. 4.1. Polymorphism
Polymorphism means having the ability to take
several forms. In OO systems, polymorphism allows the implementation of a given operation to
be dependent on the object that "contains" the
operation. For example, a "compute-pay" operation can be implemented differently based on the
employee's object type, e.g., part-time, hourly, or
salaried. When a new type of employee is created, e.g., student, the programmer simply creates a new type of employee object and a new
"compute-pay" operation in the new object. The
"compute-pay" operations of the other types of
employee are not affected by the payment operation implementation required for the new type of
employee. This reduces complexity by isolating
the effect of changes and providing highly consistent semantics across the interfaces to all employee objects. Thus, polymorphism is a mechanism that can be used to control the complexity
of an OO system. In contrast, structured systems
often have all compute pay operations contained
in one program. The program must be capable of
differentiating between the different types of employees and applying the appropriate operation.
Adding new types of employees may require existing code to be changed.
The use of polymorphism also can increase the
complexity of an OO system [42]. For example, if
the "compute-pay" operation in one type of employee object is implemented to print employee
descriptive information or some other function,
i.e., not compute the pay of the employee, then
semantic consistency across the interfaces of the
employee objects no longer exists. The programmer may no longer assume that all operations
with the same name perform the same generic
function. The semantics of each individual implementation of an operation must be determined.
2. 4.2. Encapsulation (information hiding)
OO systems integrate both the structural (data)
and behavioral (procedural) aspects of a program,
while structured systems force an artificial separation of the structure from behaviour. According
to Brodie and Ridjanovic [9],
The separate treatment of structure and behaviour complicates design, specification, modification, and semantic integrity analysis.
Encapsulation allows programmers to modify
the implementation of an object while avoiding
the creation of unwanted side effects in other
objects by hiding the implementation detail behind a public interface (protocol). This reduces
complexity by ensuring that changes to the internal operations of an object, i.e., those that do not
modify the public interface, are contained within
that object.
2.4.3. Inheritance
An inheritance mechanism is considered important due to the potential for reuse. Inheritance allows programmers to define objects incrementally by reusing previously defined objects as
the basis for new objects. There have been many
different types of inheritance mechanisms associated with OO systems [33]. The most common
inheritance mechanisms include different forms
of single and multiple inheritance.
Single inheritance allows a subclass to have
only a single parent class. The subclass extends
the parent's definition. For example, when defining a new type of employee, e.g., student, the new
employee type can inherit the common characteristics of being an employee from a generic type of
employee. Using this approach, the programmer
only needs to be concerned with the difference
between student employees and generic employ-
D.P. Tegarden et al. /Decision Support Systems 13 (1995) 241-262
ees. Existing programming languages and O O
methodologies permit extending the parent's definition including the redefinition of some or all of
the parent's properties [8,14,21,27,29,36,41,45,51].
With redefinition capabilities, it is possible to
introduce an inheritance conflict, i.e., a property
of a subclass with the same name as a property of
a parent class.
Multiple inheritance occurs when a subclass
may inherit from more than one parent class. In
this situation, the types of inheritance conflicts
are multiplied. In addition to the possibility of
having an inheritance conflict between the subclass and one (or more) of its parent classes, it is
now possible to have conflicts between two (or
more) parent classes. Inheritance conflicts increase the difficulty of understanding an inheritance structure and individual objects in the
structure. Thus, there is a risk of increasing the
complexity of an O O system, instead of decreasing it, through the use of inheritance.
Snyder [48,49] points out that the underlying
cause of the inheritance conflict problem is that
most inheritance mechanisms violate encapsulation. For example, when the definition of a superclass is modified, all of its subclasses are affected.
This may introduce additional inheritance conflicts in one (or more) of the superlcass's subclasses. Therefore, programmers must be aware
of the effects of the modification not only in the
superclass, but in each subclass that inherits the
modification.
Rumbaugh, et al., [45] suggest the following
rules when using inheritance.
- Query operations should not be redefined;
- Operations should only be redefined if the
overriding operation restricts the semantics of
the inherited operation;
Redefining operations should never change the
protocol or the underlying semantics of the
inherited operation;
However, as they point out, " T h e implementation and use of many existing object-oriented
languages violates these principles." [45,p. 65]
Thus, inheritance conflicts caused by redefinition
capabilities and multiple inheritance mechanisms
must be addressed when considering the overall
complexity of an individual object or OO system.
-
245
Another concern related to using inheritance
occurs when a subclass does not utilize all of its
superclass(es)' properties. It has been suggested
that this may indicate a subclass that has been
misclassified in the inheritance network [15]. This
also demonstrates that the use of inheritance may
work to increase the complexity of an O O system.
2.5. Measures based on information flow and data
bindings
Measures that address system design complexity for structured systems that also are consistent
with the characteristics of good OO systems design, the desirable properties of software measures, and the software design fundamentals presented above are based on information flow and
data bindings. The measures defined by research
on information flow and data bindings include
fan-in and fan-out [3,25], data bindings [26], inp u t / o u t p u t variables [11], and intra- and intermodule complexity [12].
Fan-in is the number of modules that call a
module; fan-out is the number of modules that a
module calls. It has been stated that the complexity of a structured system is proportional to the
number of connections between modules in the
system [3,25], i.e., the higher the coupling of
modules in a system the more complex the system.
The complexity of a system also has been
described as a function of the amount of work
that the system's individual modules perform.
Data bindings and the number of i n p u t / o u t p u t
variables describe the amount of work an individual module performs [11,26]. These measures address the cohesion of a module.
Card and Agresti [11] state that a system's
complexity is best described by combining the
above. This combination results in an intra-module (data) and inter-module (structural) complexity for each module in a system. The overall
complexity of a structured system is then defined
as the sum of the average complexities (intra- and
inter-) of each module. By identifying both module level complexity and system level complexity,
the overall amount of complexity can be represented for a given system [12].
246
D.P. Tegarden et al. / Decision Support Systems 13 (1995) 241-262
3. Model of complexity for O 0 systems
The four level model explicitly addresses the
inherent components of OO systems including
variables, methods, and objects, as well as the
overall system. The proposed measures account
for the cohesion (intra-) and coupling (inter-)
aspects of the system at each level (see Fig. 1).
The combined set measures from all levels results
in a representation of OO system software complexity applicable throughout the lifetime of an
OO system. Variable level complexity and method
level complexity contribute to, i.e., influence by
increasing or decreasing, the complexity measured at the object level. Complexity at the object
level influences complexity at the system level.
3.1. Levels of software complexity for O0 systems
Similar to the system and module levels of
software complexity defined for structured systems [12], the complexity of OO systems can be
represented by a set of measures defined at different levels. For OO systems the variable,
method, object, and system levels are necessary.
The linear model of system design complexity for
structured systems provides support for the existence of a similar model of OO systems complexity.
3.1.1. Definitions of the levels
Variable level complexity is associated with the
definition and use of variables throughout the
system. Method level complexity is associated with
the definition and use of methods throughout the
system. Object level complexity combines variable
and method complexity with measures of the
inheritance structure. System level complexity
provides high level representations of OO system
size and organization. Aggregate measures for
each level should provide the basis for complexity
tradeoffs. However, due to the lack of a theory of
OO software construction and evolution, aggregate measures and operational rules for making
complexity tradeoffs must be determined empirically [19,45].
3.1.2. Justification of the levels
Each level of complexity can be justified from
the literature on OO systems, the literature on
software measures, and the perceptions of users
of OO techniques. The literature of OO systems
and software measures was presented in the
background sections of this paper (See Section 2)
and are mentioned only briefly here. The perceptions of users of OO techniques are discussed in
more detail.
First, many OO analysis and design techniques
identify variables, methods, and objects as components of OO systems [7,14,15,45] because each
of these concepts is inherent to OO systems.
Assuming that some combination of these components is a "system", all four levels are justified
from the literature on OO systems.
Second, as stated above, previous literature on
software measurement provides support for the
idea of levels of complexity [11,12]. This literature
also identifies measures of data bindings [26],
module cohesion and coupling [3,25], and summation across structure diagrams [25]. These ideas
correspond directly to the variable, method, and
object levels of the proposed model. Abstraction
of these concepts to the system level is also
reasonable based on software measures developed for structured systems [11,12].
Finally, a study of users of OO techniques
perceptions of OO software complexity was undertaken. Seven graduate students in information
systems who had completed a course in OO techniques that required analysis, design, and programming participated in the study. The group
identified 148 concepts that they believed contributed to the complexity of OO systems. Classification of the 148 concepts by the authors, using
a content analysis approach [17,30], identified 11
concepts that contained a reference to the variable level, 17 concepts that contained a reference
to the method level, 41 concepts that contained a
reference to the object level, and 13 concepts that
contained a reference to the system level.
From the 148 concepts the group identified 10
categories that organized the concepts by similarity. The categories were then ranked by their
importance to OO system complexity. Group
agreement on category importance was moder-
D.P. Tegarden et al. / Decision Support Systems 13 (1995) 241-262
ately-high, Kappa coefficient of concordance K =
.70, p = .10. The categories are ranked in order of
importance and presented, with their definitions,
in Table 1. Each participant then was asked to
place each concept in the category that he or she
believed it belonged.
High levels of agreement, 6 or 7 participants,
existed on 40% (59) of the concepts and most
concepts, 80% (118), were placed in the ten categories by 4 or more participants, showing a high
degree of face validity. Only 4 of the 148 concepts
were not assigned to some category by all participants. The overall K, Kappa coefficient of agreement for all concept categorizations, score is.50
indicating a moderate level agreement about the
categorization of the concepts. This result is significantly different from 0 agreement, with a calculated Z = 69.23, p < .001.
247
Review of the definitions in Table 1 shows that
the class design, structure, method design, and
message passing are associated with the static
representations of OO systems. The class design
and method design categories contain concepts
that apply to the variable level; the method design and message passing categories contain concepts that apply to the method level; the class
design, message passing, and structure categories
contain concepts that apply to the object level;
and the structure, class design, and message passing categories contain concepts that apply to the
system level. These categories were ranked in the
top half of categories on importance to OO system complexity (see Table 1).
It should be noted that some categories, (i.e.,
maintenance, project management, methodology
and tools, problem domain, reusability, and solu-
Table 1
Perceptions of complexity categories
Category name (code)
Definition
Class design (CD)
Encapsulation, intra class complexity, proper placement of methods and attributes, choice of class
protocol. Labels or names of attributes and methods. Number of attributes, etc. Use of global
variables, polymorphism, or information hiding.
Structure (ST)
Relationships between classes, objects, and instances. The static structure of the system. Includes "a
kind of" and "a part of" structures.
Problem domain (PD)
Constrains within the domain. Clarity of the requirements document. Interpretation of the problem
domain, have you covered all the domain. Stability of the problem. How this domain fits into future
problem domains.
Solution domain (SD)
Graphical user interface, programming language, platform (hardware and software), and network.
Method design (MD)
The length of the method in lines of code, number of arguments, and placement of the methods in
appropriate classes within the class hierarchy.
Message passing (MP)
Dynamic relationships between objects. Communication.
Reusability (RE)
Reusing existing stuff in this application.
Project management (PM)
Project management constraints, people management, choice of standards, consistency of conventions,
and selection of methodologies and tools.
Methodology/Tools (MT)
The analysis and design notation, debugging and navigation tools, etc. Testing tools, documentation,
general programming tools.
Maintenance (MA)
Modification after release.
248
D.P. Tegarden et al. / Decision Support Systems 13 (1995) 241-262
tion domain), contain few concepts that apply to
the proposed levels. This is an indication that the
group perceived OO system complexity as consisting of components that involve all aspects of the
development process. The current model involves
only those categories that apply to static representations of OO systems, i.e., designs and code.
So, the notion of levels of complexity is supported by the literature on OO systems, the literature on software measures, and the perceptions
of potential users of OO software complexity
measures.
3.1.3. Usefulness of the levels
The model shows relationships that provide
the basis for suggesting that a rationale exists for
making complexity tradeoffs between levels to
rearrange (and thereby reduce) the complexity of
an OO system. Complexity tradeoffs involve increasing complexity in one level (or measure) to
reduce complexity in another level (or measure).
The ability to measure in what part of the system
the complexity inherent to a problem exists is
essential to controlling the complexity of OO
systems and the development of complexity
tradeoff criteria.
The model provides measures for making two
types of complexity tradeoffs throughout the development of an OO system: design and implementation. Design tradeoffs are associated with
design decisions of the system. Tradeoffs of this
type include manipulating object, variable, and
method levels to move complexity from the object
level to the variable and method levels (or vice
versa), controlling inter-object measures, and determining the number of abstract versus concrete
classes at the system level. Decisions to have
many classes with few methods and variables or
few classes with many methods and variables in
each, or to have deep versus broad inheritance
structures are examples of design tradeoffs. These
tradeoffs affect the measures, which should reflect the complexity of the design representations
of OO systems.
Implementation tradeoffs occur when coding
details are decided. These tradeoffs include controlling intra-object measures. The number of
properties to inherit is an example of an imple-
mentation complexity tradeoff. Implementation
tradeoffs allow control of the complexity of code
representations of OO systems.
The levels also provide a framework for the
classification of measures defined by previous
and future research on the software complexity of
OO systems. Measures defined by previous research [13,37,38,39] are included at the appropriate levels in the model.
3.1.4. Justification of measures at the levels
Each measure at each level can be justified
from the literature on OO systems, the literature
on software measures, a n d / o r the perceptions of
complexity held by users of OO techniques. For
example, intra- and inter-complexity can be justified in the following ways.
First, as stated earlier the concept of encapsulation is important in OO systems. An encapsulation focus results in both an intra- (within the
module, i.e., method or object) and inter-orientation. This is due to "hiding" things inside the
method or object (intra-) and allowing communication between methods or objects (inter-) only
through message passing with arguments. When
combined with the focus on variables, methods,
and objects inherent to OO approaches it seems
reasonable that an intra- and inter-approach
should be applied to the evaluation of the complexity associated with each level. As presented
above various concepts of cohesion and coupling
have been proposed for OO systems [15]. Software measures have been proposed for OO systems [37,38,39] and individual objects [13]. This is
additional support for the system and object levels, and for the need of an overall model to aid
the investigation of OO system complexity.
Second, structural complexity (inter-module
complexity) [12] has been identified as an important component of the complexity of a structured
system. Fan-in and fan-out, as defined for modules, have been used by several researchers
[3,12,25] to examine the flow of information
through a module. Increases in fan-in and fan-out
have been associated with increases in software
complexity [12,25]. Extension of these ideas to
OO systems seems appropriate. Third, in the
study of users perceptions of OO system complex-
D.P. Tegarden et al. / Decision Support Systems 13 (1995) 241-262
249
Table 2
Measures and supporting concepts
VARIABLE LEVEL
CATEGORY CODES
CD
Variable polymorphism
synonyms in labels for objects,
attributes,....
polymorphism and information hiding
Variable fan-in
use of class variables
Variable fan-out
use of class variables
Variable fan-down
class vs instance variables-what to
put in each
levels of inheritance
Intra-variable complexity
not supported
Inter-variable complexity
not supported
METHOD LEVEL
Method polymorphism
polymorphism and information hiding
overloading methods
Method fan-in
message passing within or between class
structures
Method fan-out
message passing within or between class
structures
use of class variables
class vs instance variables-what to
put in each
Method fan-down
overwriting methods
overloading methods
Arguments passed to method
number of arguments in a method
Objects returned to method
number of arguments in a method
Arguments passed by method
not supported
Objects returned by method
not supported
Object variables accessed
use of class variables
class vs instance variables-what to
put in each
Intra-method complexity
length of methods
length of methods-how much does it do?
Inter-method complexity
message path length-number of methods
to go through to get something done
message passing within or between class
structures
MA
MP
MD
PROPORTION
MT
PD
PM
RE
SD
ST
AGREEMENT
7
1.000
5
0.476
6
0.714
6
0.714
5
0.524
1
0.476
NA
NA
5
1
1
1
0.476
(/.476
0.714
0.714
6
5
0.714
0.524
1
1
0.714
0.476
1
0.714
1
0.714
NA
NA
6
5
0.714
0.524
1
1
0.714
0.714
1
0.476
0.714
250
D.tL Tegarden et al. /Decision Support Systems 13 (1995) 241-262
Table 2 (continued)
VARIABLE LEVEL
CATEGORY CODES
CD
OBJECT LEVEL
Object polymorphism
Polymorphism and information hiding
Used
not supported
Uses
not supported
Object fan-in
message passing within or between class
structures
Object fan-out
message passing within or between class
structures
Object fan-down
overwriting methods
overloading methods
horizontal vs vertical organization
multiple inheritance-conflict
resolution
where to put the objects within the
hierarchy
Object fan-up
overwriting methods
overloading methods
horizontal vs vertical organization
multiple inheritance-conflict
resolution
where to put the objects within the
hierarchy
arguments passed to subject
not supported
Objects returned to object
not supported
Arguments passed by object
not supported
Objects returned by object
not supported
Object to root depth
depth of class hierarchy
Depth of hierarchies
levels of inheritance
where to put the objects within the
hierarchy
Object to leaf depth
depth of class hierarchy
Depth of hierarchies
levels of inheritance
where to put the objects within the
hierarchy
Local to parent conflict
overwriting methods
Parent to parent conflict
multiple inheritance-conflict
resolution
MA
MP
MD
PROPORTION
MT
PD
PM
RE
SD
ST
AGREEMENT
0.476
NA
NA
0.714
0.714
0.714
0.476
0.714
0.714
0.524
0.714
0.476
0.714
0.714
0.524
NA
NA
NA
NA
1
1
1
2
1
0.714
0.714
0.476
0,524
0.714
0.714
0.476
0.524
0.714
0.714
D.P. Tegarden et al./Decision Support Systems 13 (1995) 241-262
251
Table 2 (continued)
VARIABLE LEVEL
CATEGORY CODES
CD
Intra-object complexity
length of the method-short vs long:
how much does it do?
length of methods
low cohesion within a class
Inter-object complexity
message path length-number of methods
to go through to get something done
message passing within or between class
structures
SYSTEM LEVEL
Classes
not supported
Concrete classes
not supported
Abstract classes
not supported
Max depth of inheritance hierarchy
horizontal vs vertical organization of
classes
depth of class hierarchy
Depth of hierarchies
levels of inheritance
Max Breadth of inheritance hierarchy
breadth of class hierarchy
horizontal vs vertical organization of
classes
levels of inheritance
Inheritance links
breadth of class hierarchy
horizontal vs vertical organization of
classes
levels of inheritance
depth of class hierarchy
Depth of hierarchies
Uses links
following the flow of control
message passing within or between class
structures
Messages
following the flow of control
message passing within or between class
structures
Methods
number of methods per class
Size of object classes
MA
MP
PROPORTION
MD
MT
PD
PM
RE
SD
ST
AGREEMENT
1
(I.714
1
5
0.714
0.476
1
0.476
0.714
NA
NA
NA
1
6
0.714
1
1
1
6
6
5
0.714
0.714
0.476
2
1
5
6
0.524
0.714
1
5
0.476
2
1
5
6
0.524
0.714
1
1
1
5
6
6
0.476
0.714
0.714
1
0.714
0.714
1
0.714
0.714
1
1
0.714
0.714
6
6
ity, 95 of the 148 concepts (64%) were placed in
the same category by 5 or more of the 7 participants (71%). That is, the participants agreed that
t h e s e c o n c e p t s b e l o n g e d in o n e c a t e g o r y v e r s u s
the other categories. This implies that the group
h a d a c o m m o n u n d e r s t a n d i n g of the c o n c e p t indi-
D.P. Tegarden et al. / Decision Support Systems 13 (1995) 241-262
252
cating that the concept was important. Of these
95 concepts, 28 were placed in categories associated with the designs and software of an OO
system. These concepts from the class design,
structure, method design, and message passing
categories were mapped to the variable, method,
object, and system levels measures by the authors
using a content analysis approach [17,30]. If the
concept contained a word or phrase that was also
in the definition of the measure, the concept was
said to support the measure. This provides additional justification for the measures identified.
The mapping is presented in Table 2 and referred to throughout the following discussion of
the measures at each level of the model.
3.2. Variable level measures for O 0 systems
Data management and manipulation represent
a large percentage of activities required of most
information systems. Measures at this level identify an important component of the software complexity of an O O system, i.e., the amount of use
and sharing of data throughout the system. Measures of polymorphism, fan-in, fan-out, and fandown are defined to describe complexity at the
variable level (see Table 3).
Usually polymorphism is not associated with
variables. However, the potential for semantic
consistency problems is just as high for variables
as it is for methods. A simple technique for
counting variable polymorphism is to create a
variable polymorphism matrix (VPM). In a VPM
Table 3
Variable level m e a s u r e definitions
Measure
Definition
Variable polymorphism
T h e n u m b e r of objects in which
the variable n a m e is defined.
Fan-in
T h e n u m b e r of methods that
access the variable.
Fan-out
T h e n u m b e r of different kinds
of objects or pointers to objects that can
be accessed through the variable.
Fan-down
T h e n u m b e r subclasses that
inherit the variable.
the rows are identified by unique variable name
without the object name prefix and the columns
are identified by the object name. Each cell contains a one if the variable name of the row is
defined in the object of the column, otherwise it
contains a zero. The sum of the cells in the row is
variable polymorphism. If variable polymorphism
is greater than one, the variable is polymorphic.
The higher the value of this measure the more
important it is for developers to ensure that polymorphism is used appropriately, i.e., with semantic consistency.
Measures representing the use of the variable
by methods and the objects that the variables can
reference also are required. These measures consist of the fan-in and fan-out of the variable (see
Table 3). Fan-in can be calculated through the
creation of the method-to-variable connection
matrix (MVCM). In the MVCM the rows are
identified by the combination of object name and
method name and the columns are identified by
the combination of object name and variable
name. Each cell of the matrix contains a one if
the method of the row accesses the variable of
the column. The sum of the cell values down each
column is the fan-in of the variable. A simple
technique for calculating fan-out is through the
creation of a variable-to-object connection matrix
(VOCM). In a VOCM, the rows are identified by
the combination of object name and variable
name. The columns of the VOCM are identified
by the objects that make up the system. Each cell
of the matrix contains a one if the variable of the
row can be assigned a value from the domain of
the object of the column. The sum of the cell
values across each row results in the fan-out of
the variable.
Inheritance of a variable requires a programmer to consider those objects that inherit the
variable when developing or maintaining method(s) that access the variable contained in those
objects. Fan-down can be measured through the
creation of a variable inheritance matrix (VIM).
Each row of the VIM is identified by the combination of object name and variable name, and
each column of the matrix is identified by object
name. Each cell of the matrix contains a one if
the variable of the row is inherited by the object
D.P. Tegarden et al. /Decision Support Systems 13 (1995) 241-262
253
of the column, otherwise it contains a zero. Fandown is the sum of the cells across the row of the
variable.
O t h e r research on the m e a s u r e m e n t of O O
software complexity has not p r o p o s e d measures
of the complexity of variables. This an i m p o r t a n t
c o m p o n e n t of O O systems that should be part of
a comprehensive software complexity model for
O O systems.
of interaction coupling [15]. Intervariable complexity (coupling) for variables is m e a s u r e d by the
fan-in, fan-out, and variable polymorphism measures. The complexity m e a s u r e d by the fan-in and
fan-out measures increase intervariable complexity and the variable polymorphism measure decreases intervariable complexity.
3.2.1. Effects on uariable leuel cohesion and coupling
As stated above the concept of variable level
complexity in an O O system seems reasonable.
The measures defined for this level should be
consistent with those defined at the m e t h o d and
object levels. Encapsulation is important in O O
systems and provides support of the intra- (within
the module, i.e., m e t h o d or object) and interorientation.
First, given the p r o m i n e n c e of variables in
many O O a p p r o a c h e s it seems reasonable that an
intra- and inter-approach should be applied to
the evaluation of the complexity associated with
variables. F u r t h e r m o r e , an increase in the number of methods that use a variable (variable fan-in)
should be associated with these constructs.
Second, structural complexity (inter-module
complexity) [12] has been identified as an important c o m p o n e n t of the complexity of a structured
system. Fan-in and fan-out, as defined for mod-
The concepts of cohesion and coupling are not
normally defined for variables in structured systems. Possibly, due to the focus on the processes
that the system must perform. However, measures of this type are important for variables in
O O systems due to the p r o m i n e n c e of the role of
variables in O O analysis and design.
F o r variables, cohesiveness is the degree to
which the variable is used for a single purpose.
Intravariable complexity (cohesion) is m e a s u r e d
by the fan-out, fan-down, and variable polymorphism measures. F u r t h e r m o r e , the complexity
c a p t u r e d by all three measures increases intravariable complexity and therefore reduce the
amount of cohesiveness of the variable.
If two variables are accessed by the same
method(s), they are connected. This is a m e a s u r e
3.2.2. Justification o f measures o f t,ariable lez~el
complexity
Table 4
Method level measure definitions
Measure
Definition
Method polymorphism
The number of objects in which a method name is defined.
Fan-in
The number of methods that send messages to the method.
Fan-out
The number of methods that receive messages from the current method,
regardless of where the receivingmethod is defined.
Input/output variables
Arguments passed to method
The number of arguments passed to the method as part of a message.
Arguments returned to method
The number of messages sent by the method that result in an object being returned.
Arguments passed by method
The number of arguments passed as part of a message by the method to other methods.
Objects returned by method
The number of messages that the method returns an object to as a result of the method.
Object variables accessed
The number of object variables accessed by the method.
Fan-down
The number of subclasses that inherit the method.
254
D.P. Tegarden et al. / Decision Support Systems 13 (1995) 241-262
ules, have been used by several researchers
[3,12,25]. Extension of these ideas to variables in
an O O system seems appropriate and straightforward. The number of methods that use a variable
(variable fan-in) is very similar to the number of
modules that call a module (fan-in) and the number of objects that are accessed through a variable (variable fan-out) is similar to the number
modules called by a module (fan-out).
Third, in the study of users perceptions of OO
system complexity one concept (use of class variables) was identified that is associated with variable fan-in and variable fan-out. This shows that
users of OO techniques consider the use of variables to be important. The group provided no
indication as to whether an increase in the use of
class variables increased or decreased the complexity of the system.
The participants identified other concepts that
apply to measures at the variable level. The measures and concepts are presented in Table 2.
3.3. Method level measures for O 0 systems
All operations performed by the system are
implemented as methods. At the method level
the measures of method polymorphism, fan-in,
fan-out, the number of i n p u t / o u t p u t variables
accessed, and fan-down are defined to describe
the complexity of a method (see Table 4). The
measures are calculated with a set of matrices
similar to those presented at the variable level.
Method polymorphism is defined and calculated similar to variable polymorphism. If method
polymorphism is greater than one then the
method is polymorphic.
Methods that use other methods in the same
object in which the method is defined versus
using methods defined in other objects require
different programmer actions. This differentiation is important due to the increased amount of
effort required by a programmer to use methods
that are defined in objects that are not part of the
current object. At the minimum, the programmer
must obtain the public interface of the object that
contains the method, select a message from the
interface, and determine what available variables
are appropriate arguments for the message.
Therefore, it is more difficult to use a method
defined outside the current object. This is similar
to differentiating between the use of local functions versus shared library functions in traditional
systems. This differentiation is not common
among measures of structured systems. However,
given the extensive nature of and the reuse intended for most O O class libraries, a distinction
between these types of messages is appealing. To
account for this increase in complexity we rely on
the idea that sending a message to another object
requires a pointer to that object. The value of this
pointer must be contained in a variable; therefore, fan-out at the variable level captures additional complexity involved with sending messages
to other objects.
The number of i n p u t / o u t p u t variables accessed for OO systems at the method level consists of five parts: the number of arguments passed
to the method, the number of messages that
return an object to the method, the number of
arguments passed to other methods, the number
of messages that require the method to return an
object, and the number of object variables accessed (see Table 4). These measures can be
organized into three groupings: input, output,
and object variables. Together these measures
represent the flow of information through the
method.
The input variable grouping is composed of
the number of arguments passed to the method
as part of an invoking message and the number of
messages sent by the method that result in an
object being returned. The arguments passed to
the method contain the data from the sending
method that the receiving method needs to perform the operation for which it was defined. Each
of these arguments becomes a local variable
within the method providing the basis for calculation and flow of control. In addition to the data
passed to the method as part of the message,
additional data may be required to complete the
operations defined in the method. These data
may be obtained by sending messages to another
object. The objects returned to the method as a
result of these messages also are inputs to the
method.
To obtain a response from the messages sent,
D.P. Tegardenet al. / Decision Support Systems 13 (1995) 241-262
the messages must include the arguments required by the receiving methods. The method
sending the message must provide these arguments. The output variable grouping addresses
this need. It is composed of the number of arguments passed by the method as part of a message
and the number of messages received by the
method that require an object be returned.
In addition to the data passed to and returned
by the method, variables defined as part of the
object can be accessed. With the assumption that
the programmer must understand the entire object to modify the methods contained in the object, there is no need to differentiate between
inputs and outputs for object variables as the
complexity associated with the variable must be
overcome only the first time the variable is used
or assigned.
Like the variable level, the method level also
must address the use of inheritance. This is done
through the fan-down measure. Fan-down (see
Table 4) at the method level is defined and
calculated in the same manner as at the variable
level. We assume that when a method will be
inherited and used by other objects, a programmer must consider those objects when developing
or maintaining the method.
Other research on the measurement of O O
software complexity has proposed procedural
complexity measures for methods in OO systems
[40], including cyclomatic complexity [35] and lines
of code. Viewing methods from a design perspective is an important component of OO systems
that should be part of a comprehensive software
measurement model of OO systems.
3.3.1. Effects on method level cohesion and coupling
The set of measures defined for intra-method
complexity applies to the concept of service cohesion [15]. These measures include an extension of
data complexity [12] to OO systems and other
measures defined at the method level. The complexity measured by method polymorphism, fandown, and the number of i n p u t / o u t p u t variables
increase the intra-method complexity of the
method. This is due to the requirement that the
programmer must maintain consistent semantics
255
across the system when polymorphism is used.
The effects of changing the current method on
objects lower in the object hierarchy and all inp u t / o u t p u t variables used by the method must
be understood. Furthermore, the complexity
measured by fan-out decreases intra-method
complexity. It reduces intra-method complexity
by deferring work to other methods through message passing in the same manner as calling a
module defers the work of a module in structured
systems. Intra-method complexity incorporates
polymorphic characteristics, data access requirements, and the amount of work deferred for a
method to create a value for the internal complexity of each method.
Connections between methods are established
through message-passing. A measure of intermethod complexity consists of the complexity
measured by number of i n p u t / o u t p u t variables,
fan-in, fan-out, and method polymorphism. An
increase in these measures indicates an increase
in inter-method complexity. Fan-in and fan-out
have greater effects on inter-method complexity
than does the number of i n p u t / o u t p u t variables,
and method polymorphism has the least effect.
Inter-method complexity is a measure of service
coupling [15]. A possible measure of service coupling, applied directly from the literature on software measures for structured systems [25], is the
product of fan-in and fan-out. However, this calculation does not take into account parameter
passing (see I n p u t / O u t p u t Variables), polymorphism (method polymorphism), or inheritance
(fan-down). 1
3.3.2. Justification of measures of method level
complexity
Justifications for the method level measures
are similar to those presented for the intra- and
inter-measures at all levels and for the specific
measures at the variable level. However, the use
of measures for modules in structured systems as
measures for methods in OO systems is even
1 Another possible measure to consider the effects of inheritance is Moreau's shortest path to method definition [37,39].
256
D.P. Tegarden et al. /Decision Support Systems 13 (1995) 241-262
more straight-forward than for variables, i.e., substitute messages for calls.
Counting of input and output arguments is
also consistent with measures defined for structured systems [11,12,26]. Together these measures
represent a detailed view of the complexity of
each method in a system.
Most method level measures are supported by
concepts identified by the perceptions study (see
Table 2). This provides additional justification for
measures defined at the method level.
3. 4. Object level measures for O 0 systems
At the object level measures are defined to
account for the complexity of an individual ob-
ject. These measures are described in six groups:
polymorphism, message passing, i n p u t / o u t p u t
variables, inheritance structure, inheritance conflicts, and property definitions (see Table 5). The
measures are calculated with a set of matrices
similar to those presented at the variable level.
Each of these object level groupings and measures associated with individual objects, identified
by other researchers, are presented below.
Polymorphism at the object level is a measure
of the extent to which polymorphism has been
used within the object. This measure is calculated
from the variable polymorphism and the method
polymorphism measures defined above.
Fan-in, used-by, fan-out, and uses at the object
level measure the use of the object and the ob-
Table 5
Object level measure definitions
Measure
Definition
Object polymorphism
The normalized sum of method and variable polymorphism for each method and variable
in the object.
Message passing
Used-by
The number of objects that use the object.
Uses
The number of objects that are used by the object.
Fan-in
The number of unique messages sent from all other objects to the object.
Fan-out
The number of unique messages that the object sends to all other objects.
Input/output variables
Arguments passed to object
The number of arguments passed to the object as part of a message.
Arguments returned to object
The number of messages sent by the object that result in an object being returned.
Arguments passed by object
The number of arguments passed as part of a message by the object to other objects.
Objects returned by object
The number of messages received that require the object to return an object.
Inheritance structure
Fan-down
The number of objects below the object in the object hierarchy, i.e., number of subclasses.
Fan-up
The number of objects above the object in the object hierarchy, i.e. the number
of superclasses.
Object-to-root depth
The maximum number of levels in the object hierarchy that are above the object.
Object-to-leaf depth
The maximum number of levels in the object hierarchy that are below the object.
Inheritance conflicts
Local-to-parent conflicts
The number of properties defined in the object which have the same name
as an inherited property.
Parent-to-parent conflicts
The number of properties defined in multiple parents of the object which have the same name.
D.P. Tegardenet al. /Decision Support Systems 13 (1995) 241-262
ject's use of other objects through message passing (see Table 5). The fan-in and fan-out measures are identical to the message domain size
and the message vocabulary size measures proposed by M o r e a u [38].
The next category, i n p u t / o u t p u t variables,
consists of two groups: input and output. Each
group at the object level is computed in a m a n n e r
similar to the corresponding group at the method
level, except that the object is the focus. The
n u m b e r of arguments passed to the object and
the n u m b e r of messages that return an object to
the object are the n u m b e r of input variables. The
number of output variables consists of the number of arguments that the object must pass to
other objects as part of sending messages and the
number of messages received by the object that
require an object be returned to a sending object
(see Table 5). Together, the n u m b e r of i n p u t /
output variables represent the amount of information that flows through the object.
The measures of fan-down, fan-up, object-toroot depth, and object-to-leaf depth address the
complexity of the inheritance structure (see Table
5). Fan-down and fan-up are identical to the
number of descendants in the inheritance lattice
and the n u m b e r of parents in the inheritance
lattice measures proposed by Moreau [37]. The
number of immediate children measure proposed
by Chidamber and K e m e r e r [13] is similar to
fan-down and depth of inheritance tree measures
[13,31] are similar to object-to-root depth and
object-to-leaf depth.
The effects of inheritance conflicts also are of
interest. An inheritance conflict occurs when a
method or variable in one object has the same
name as a method or variable in a super object.
This is called a conflict because the p r o g r a m m e r
must decide which of the methods or variables to
use. This requires additional effort as c o m p a r e d
to using methods or variables that have no conflicts. We define two measures that address the
two types of inheritance conflicts: local-to-parent
and parent-to-parent (see Table 5).
Due to the importance of inheritance in controlling the complexity of an O O system, we also
include measures that differentiate between local, inherited, and subclass properties. These
257
Table 6
Object measure effect on intra-object complexity(cohesion)
Measure
Increase
Decrease
Object polymorphism
X
Fan-out
X
Unique messages sent
X
Arguments passed to object
X
Objects returned to object
X
Arguments passed by object
X
Objects returned by object
X
Fan-down
X
Fan-up
X
Object-to-root depth
X
Object-to-leaf depth
X
Local-to-parent conflict
X
Parent-to-parent conflict
X
measures include the number of properties (variables and methods) defined in the object, the
interaction between them, the n u m b e r of properties that are inherited by the object, inherited
properties use of local properties, inherited properties use of other inherited properties, local
property use of inherited properties, the number
of properties defined in subclasses of the object,
subclass properties use of local properties, and
local property use of subclass properties.
3.4.1. Effects on object level cohesion and coupling
Cohesion (intra-object complexity) is a function of the object level measures presented in
Table 6; coupling (inter-object complexity) is a
function of the object level measures presented in
Table 7. The tables show the effect (increases or
decreases) that the complexity associated with
each measure has on software complexity at the
object level. For example, the complexity measured by object polymorphism increases the
intra-complexity of an object, but decreases the
inter-complexity of an object. Since polymorphism allows multiple properties with the same
name, the p r o g r a m m e r must ensure that the semantics of the polymorphic properties be essentially the same. The additional work associated
with ensuring similar semantics is internal to the
object (intra-object). At the same time, due to
encapsulation, the p r o g r a m m e r does not have to
worry about syntactical name conflicts between
objects. Therefore, the complexity measured by
258
D.P. Tegardenet al. / Decision Support Systems 13 (1995) 241-262
Table 7
Object measure effects on inter-object complexity(coupling)
Measure
Increase
Decrease
Object polymorphism
X
Fan-in
X
Fan-out
X
Unique messages received
X
Unique messagessent
X
Arguments passed to object
X
Objects returned to object
X
Arguments passed by object
X
Objects Returned by Object
X
Fan-down
X
Fan-up
X
Object-to-rootdepth
X
Object-to-leafdepth
X
Local-to-parentconflict
X
Parent-to-parent conflict
X
object polymorphism decreases inter-object complexity. Similar arguments can be made for each
of the proposed measures.
The measures of local, inherited, and subclass
properties provide a basis for the definition of
aggregate measures of class cohesion, inheritance
coupling, and interaction coupling at the object
level.
Three measures are representative of class cohesion [15]. The first is the ratio of actual interconnections between local properties and the potential interconnections between local properties,
i.e., the number of references by locally defined
methods to locally defined properties (variables
and methods) to the potential references by locally defined methods to locally defined properties. The higher the value of this ratio, the more
tightly coupled the locally defined properties are
and thus the more cohesive the individual object.
However, this ratio suffers from its lack of ability
to identify isolated sets of properties, i.e., it does
not address the possibility of having distinct subsets of interconnections between properties in an
object. One measure that addresses this problem
is lack of cohesion in methods (LCOM) metric
[13,40]. L c o M is based on the number of distinct
subsets of interconnections between methods and
variables. However, LCOM cannot be used to
show how dense the interconnections are between properties, nor does it address the inter-
connections between different methods. Furthermore, LCOM is unable to "distinguish between
the case where each of the methods operates on
unique sets of instance variables and the case
where only one method operates on a unique set
of variables." [13, p.203] A third potential measure for class cohesion is the number of variables
and methods that have no references to them.
The more isolated properties, the less cohesive
the class [15].
Measures of inheritance coupling [15] include
fan-up, fan-down, object-to-root depth, and object-to-leaf depth (see Table 5). In addition to
these inheritance structure measures, a ratio of
the number of actual interconnections between
the local properties and the actual number of
interconnections between all of the object's properties [local method references to all properties
(local, inherited, or subclass) and inherited and
subclass method references to local properties] is
possible. This ratio has a range of 0 to 1, with 0
indicating high coupling to the inheritance structure. The one exception to this interpretation is if
no methods (local, inherited, or subclass) reference any local property. In this case, the ratio is
undefined, and a question is raised about the
need for the local properties. This ratio also
could be viewed as a measure of class cohesion,
e.g., at a value of 1 only local methods access
local properties and therefore the class is highly
cohesive.
Interaction coupling [15] at the object level can
be measured partially by computing the product
of fan-in and fan-out. However, this calculation
does not take into account parameter passing
(see i n p u t / o u t p u t variables), polymorphism (object polymorphism), or inheritance (fan-down or
fan-up). One possible way to include inheritance
is to use a distance measure, based on where the
method is defined (locally or inherited), as a
weighting factor. This distance factor could be
based on Moreau's shortest path to the method
definition metric [37,39].
3.4.2. Justification o f measures o f object level complexity
Justifications for the object level measures are
similar to those presented for the intra- and
D.P. Tegarden et al. /Decision Support Systems 13 (1995) 241-262
inter-measures at all levels and for the specific
measures at the variable and method levels. In
addition, the focus of most previous literature on
O O software complexity measures has been on
objects.
The concepts of inherited versus local variables and methods is implied throughout the O O
literature [8,15]. The extension of these concepts
to inherited and local referencers, i.e., those
methods that use the variables or methods, provides for the definition of the cohesion and coupling ratios defined above. Together these measures represent a detailed view of the complexity
of each object in a system. Most object level
measures are supported by concepts identified by
the perceptions study (see Table 2). This provides
additional justification for these measures.
3.5. System level measures for O 0 systems
Measures defined at the system level include
the number of classes in the system (total, concrete, and abstract), maximum depth and breadth
of the object hierarchy, the number of inheritance and uses links in the system, the number of
unique messages sent between objects in the system, and the number of methods in the system
(see Table 8). All of these measures except the
number of concrete classes, the number of abstract classes, the number of unique messages,
259
and the number of methods defined in the system
have been identified by Moreau [37]. Chidamber
and Kemerer [13] also identified depth of the
hierarchy as an important measure of O O systems.
We have identified a set of measures of software complexity at the system level that can be
derived from the measures identified in Table 8.
These include the ratio of abstract classes to
concrete classes, the average number of inheritance links per object, the average number of
uses links per object, the average number of
unique messages sent per object, and the average
number of methods per object. We have also
identified a set of software complexity measures
based on measures identified at the object level.
For example, the average inter-method complexity for the individual methods defined within all
objects (average service coupling) and the average
inter-object complexity for the individual objects
defined within the system (average interaction
coupling). We also can look at the average level
of inheritance coupling and class cohesion contained in an O O system.
3.5.1. Justification o f measures o f system level complexity
Justifications for the system level measures
also are supported by O O literature, software
measure literature, and the perceptions of users
Table 8
System level measure definitions
Measure
Definition
Classes
The number of classes in the system.
Concrete classes
The number of classes that can be instantiated in the system.
Abstract classes
The total number of classes minus the number of concrete classes in the system.
Max depth of inherit hierarchy
The number of levels from the root(s) of the object inheritance hierarchy to the leaf
that is the furthest away.
Max breadth of inherit hierarchy
The maximum number of classes at any one level in the object hierarchy.
Inheritance links
The number of inheritance links in the system.
Uses links
The number of uses links in the system.
Messages
The number of unique messages sent between objects in the system.
Methods
The number of methods defined in the system.
260
D.P. Tegarden et al. / Decision Support Systems 13 (1995) 241-262
of OO techniques. Extension of the arguments at
the variable, method, and object levels apply at
the system level. Together these measures represent an overall view of the complexity of an OO
system.
Most system level measures are supported by
concepts identified by the perceptions study (see
Table 2). This provides additional justification for
these measures.
4. Concluding remarks
In this paper we presented a model of software complexity of OO systems. The model identified four levels at which OO systems software
complexity can be described: variable, method,
object, and system. At each level measures were
identified which account for the cohesion and
coupling aspects of the system at that level. Most
measures identified by previous research
[13,37,38,39] on the measurement of software
complexity are represented in the model. These
measures are consistent with the characteristics
of good OO design, the desirable properties of
software measures, the three software design fundamentals of OO systems, and the perceptions of
software complexity. Based on the simplicity and
the comprehensiveness of these measures, additional research activities are warranted, i.e., statistical validation of the measures, and the determination of relationships between the measures
and between the levels of complexity of an OO
system.
This research provides a basis for the definition of appropriate aggregate measures and operationalization of complexity tradeoffs between
those measures. This includes the development of
the criteria and methodology to guide the tradeoffs of OO system complexity between the levels
of the model, the tradeoffs between the measures
within the levels, and the development of planning and estimation approaches based on the
model. The ultimate goal of this research is to
develop a theoretically based software engineering methodology that provides the minimum OO
system complexity solution for a given OO system.
References
[1] R.D. Banker, R.J. Kauffman, R. Kumar, Output Measurement Metrics in an Object-Oriented Computer Aided
Software Engineering (CASE) Environment: Critique,
Evaluation and Proposal, in: J.F. Nunamaker, Jr., Ed.,
Proceedings of the Twenty-Fourth Hawaii International
Conference on System Sciences, Vol. III (IEEE Computer Society Press, Jan. 1991; ISBN: 0-8186-2121-4).
[2] R.D. Banker, R.J. Kauffman, R. Kumar, An Empirical
Test of Object-based Output Measurement Metrics in a
Computer Aided Software Engineering (CASE) Environment, Journal of Management Information Systems, Vol.
8 (Winter 1991-92) 127-50.
[3] L.A. Belady and C.J. Evangelisti, System Partitioning and
its Measure, The Journal of Systems and Software, vol. 2
(1981) 23-29.
[4] R. Ben-Haten, Making All Types Typedefed, ACM Sigsoft Software Engineering Notes, vol. 17, no. 2 (Apr
1992) 72-3.
[5] J.M. Bieman, Deriving Measures of Software Reuse in
Object-Oriented Systems, Technical Report CS-91-112,
Department of Computer Science, Colorado State University (July 1991).
[6] B.W. Boehm, Software Engineering, IEEE Transactions
on Software Engineering, vol. C-25 (Dec. 1976) 12211241.
[7] G. Booch, Object-Oriented Design with Applications
(The Benjamin/Cummings Publishing Company, Redwood City, CA, 1991; ISBN: 0-8053-0091-0).
[8] D.L. Brandl, Quality Measures in Design: Finding Problems Before Coding, ACM Sigsoft Software Engineering
Notes, vol. 15, no. l(Jan 1990) 68-72.
[9] M.L. Brodie and D. Ridjanovic, On the Design and
Specification of Database Transactions, in: M.L. Brodie,
J. Mylopoulos, and J.W. Schmidt, Eds., On Conceptual
Modelling: Perspectives from Artificial Intelligence,
Databases, and Programming Languages (Springer Verlag, New York, 1984; ISBN: 0-387-90842-0).
[10] F.P. Brooks, No Silver Bullets: Essence and Accidents of
Software Engineering, Computer, Vol. 20, No. 4 (Apr
1987) 10-19.
[11] D.N. Card and W.W. Agresti, Measuring Software Design Complexity, The Journal of Systems and Software,
vol. 8 (1988) 185-197.
[12] D.N. Card and R.L. Glass, Measuring Software Design
Quality (Prentice Hall, Englewood Cliffs, NJ, 1990; ISBN:
0-13-568-593-1).
[13] S.R. Chidamber and C.F. Kemerer, Towards a Metrics
Suite for Object Oriented Design, in: A. Paepcke, Ed.,
OOPSLA '91 Conference Proceedings, ACM SigPlan
Notices Vol 26, No. 11 (Nov 1991) 197-211.
[14] P. Coad and E. Yourdon, Object-Oriented Analysis 2nd
Ed. (Yourdon Press, Englewood Cliffs, NJ, 1991; ISBN:
0-13-629981-4).
[15] P. Coad and E. Yourdon, Object-Oriented Design
D.P. Tegarden et al. /Decision Support Systems 13 (1995) 241-262
[16]
[17]
[18]
[19]
[20]
[21]
[22]
[23]
[24]
[25]
[26]
[27]
[28]
[29]
[30]
[31]
[32]
[33]
(Yourdon Press, Englewood Cliffs, NJ, 1991; ISBN: 0-13630070-7).
S.D. Conte, H.E. Dunsmore and V.Y. Shen, Software
Engineering Metrics and Models (The Benjamin/
Cummings Publishing Company, Redwood City, CA,
1986; ISBN: 0-8053-2162-4).
C.W. Emory and D.R. Cooper, Business Research Methods, 4th Ed. (Irwin, Homewood, IL, 1991, ISBN: 0-25609265-6).
L.O. Ejiogu, Software Engineering with Formal Metrics
(QED Technical Publishing Group, Boston, MA, 1991;
ISBN: 0-89435-329-2).
N.E. Fenton, Software Metrics: Theory, Tools, and Validation, Software Engineering Journal, Vol. 5, No. 1
(January 1990) 65-84.
R.B. Grady, Practical Software Metrics for Project Management and Process Improvement (Prentice Hall, Englewood Cliffs, NJ, 1992; ISBN: 0-13-720384-5).
A. Goldberg and D. Robson, Smalltalk-80: The Language (Addison-Wesley, Reading, MA, 1989, isbn: 0-20113688-0).
M.H. Halstead, Elements of Software Science (NorthHolland, New York, 1977; ISBN: 0-444-00205-7).
B. Henderson-Sellers, Some Metrics for Object-Oriented
Software Engineering, in: J. Potter, M. Tokoro, and B.
Meyer, Eds., TOOLS6 (Prentice-Hall, Englewood Cliffs,
N J, 1991, ISBN: 0-13-926940-1).
B. Henderson-Sellers, Managing and Measuring ObjectOriented Information Systems Development, Workshop
on Object-Oriented Software Engineering Practice, Denver, CO (Feb 1992).
S.M. Henry, and D,G. Kafura, Software Structure Metrics Based on Information Flow, IEEE Transactions on
Software Engineering, vol, SE-7 (Sep. 1981) 510-518.
D.H. Hutchens and V.R. Basili, System Structure Analysis: Clustering With Data Bindings, IEEE Transactions
on Software Engineering, vol. SE-11 (Aug. 1985)749-575.
I. Jacobson, M. Christerson, P. Jonsson, and G. Overgaard, Object-Oriented Software Engineering: A Use
Case Driven Approach (ACM Press/Addison-Wesley,
Reading, MA, 1992, ISBN: 0-201-54435-0).
R.L. Jenson and J.W. Bartley, Parametric Estimation of
Programming Effort: An Object-Oriented Model, Journal of Systems Software, vol. 15 (1991) 107-114.
S.E. Keene, Object-Oriented Programming in Common
Lisp: A Programmer's Guide to CLOS (Addison-Wesley,
Reading, MA, 198992, ISBN: 0-201-17589-4).
Kerlinger, Foundations of Behavioral Research (Holt,
Rinehart, and Winston, New York, NY, 1964, ISBN:
03-085642-8).
J. Keyes. New Metrics Needed for New Generation,
Software Magazine, Vol. 12, No. 6 (May 1992) 42-56.
L.A. Laranjeira, Software Size Estimation of Object-Oriented Systems, IEEE Transactions on Software Engineering, vol. 16 (May 1990) 510-22.
M. Lenzerini, D. Nardi, and M. Simi, Inheritance Hierar-
[34]
[35]
[36]
[37]
[38]
[39]
[40]
[41]
[42]
[43]
[44]
[45]
[46]
[47]
[48]
261
chies in Knowledge Representation and Programming
Languages (John Wiley and Sons, West Sussex, England,
1991; ISBN: 0-471-92741-4).
J.A. Lewis, S.M. Henry, D.G. Kafura, and R.S. Schulman, An Empirical Study of the Object-Oriented
Paradigm and Software Reuse, in: A. Paepcke, Ed,,
OOPSLA '91 Conference Proceedings, ACM SigPlan
Notices Vol. 26, No. 11 (Nov 1991) 184-196.
T.J. McCabe, A Complexity Measure, 1EEE Transactions
on Software Engineering, vol. SE-2 (Dec. 1976) 308-320.
B. Meyer, Eiffel: The Language (Prentice Hall, Englewood Cliffs, NJ, 1991, ISBN: 0-13-247925-7).
D.R. Moreau, A Programming Environment Evaluation
Methodology for Object-Oriented Systems, unpublished
Ph.D. Dissertation, University of Southwestern Louisiana
(1987).
D.R. Moreau and W.D. Dominick, Object-Oriented
Graphical Information Systems: Research Plan and Evaluation Metrics, The Journal of Systems and Software,
vol. 10 (1989) 23-28.
D.R. Moreau and W.D. Dominick, A Programming Environment Evaluation Methodology for Object-Oriented
Systems: Part I - The Methodology, Journal of ObjectOriented Programming, vol. 3 (May/Jun. 1990) 38-52.
K.L. Morris, Metrics for Object-Oriented Software Development Environments, unpublished Masters Thesis,
M.I.T., Cambridge, MA (1988).
L.J. Pinson and R.S. Wiener, Objective-C: Object-Oriented Programming Techniques (Addison-Wesley, Reading, MA, 1991, ISBN: 0-201-50828-1).
C. Ponder and B. Bush. Polymorphism Considered
Harmful, ACM SigPlan Notices, Vol. 27, No. 6 (June
1992) 76-79.
C. Rajaraman and M.R. Lyu, A Study of Coupling in
C+ + Programs, TOOLS8 (In Press).
J. Rumbaugh, M. Blaha, W. Premerlani, F. Eddy, and W.
Lorensen, Object-Oriented Modelling and Design (Prentice Hall, Englewood Cliffs, NJ, 1991; ISBN: 0-13629481-9).
N.F. Schneidewind, Methodology For Validating Software Metrics, IEEE Transactions on Software Engineering, Vol. 18, No. 5, (May 1992) 410-422.
S.D. Sheetz, D.P. Tegarden, I. Zigurs, and K.A. Kozar,
Group Support Systems: An Application to Cognitive
Mapping, University of Colorado, College of Business
and Administration, Faculty Working Paper Series 92-05
(June 1992).
A. Snyder, Encapsulation and Inheritance in Object-Oriented Programming Languages, in: N. Meyrowitz, Ed.,
OOPSLA '86 Conference Proceedings, ACM SigPlan
Notices, Vol. 21, No. 11 (Nov. 1986).
A. Snyder, Inheritance and the Development of Encapsulated Software Components, in: B. Shriver and P. Wegner, Eds., Research Directions in Object-Oriented Programming (The MIT Press, Cambridge, MA, 1987: ISBN:
0-262-19264-0).
262
D.P. Tegarden et al. /Decision Support Systems 13 (1995) 241-262
[49] W.P. Stevens, G.J. Myers, and L.L. Constantine, Structural Design, IBM Systems Journal, vol. 13, no. 2 (Jun.
1976) 113-129.
[50] B. Stroustrup, The C + + Programming Language, 2nd
Ed. (Addison-Wesley, Reading, MA, 1991; ISBN: 0-20153992-6).
[51] D.A. Taylor, Object-Oriented Technology: A Manager's
Guide (Addison-Wesley, Reading, MA, 1990; ISBN: 0201-56358-4).
[52] D.P. Tegarden, S.D. Sheetz, and D.E. Monarchi, The
Effectiveness of Traditional Metrics For Object-Oriented
Systems, in: J.F. Nunamaker, Jr. and R.H. Sprague, Eds.,
Proceedings of the Twenty-Fifth Hawaii International
Conference on System Sciences, Vol. IV (IEEE Computer Society Press, Jan. 1992; ISBN: 0-8186-2435-3).
[53] E. Weyuker, Evaluating Software Complexity Measures,
IEEE Transactions on Software Engineering, vol. 14 (Sep.
1988) 1357-1365.
[54] H. Zuse, Software Complexity Measures and Models (de
Gruyter and Co., New York, NY, 1990; ISBN: 0-89925640-6).