Upload
wyatt-coffin
View
214
Download
1
Tags:
Embed Size (px)
Citation preview
1
A Graph-Based Metamodelfor Object-Oriented
Software Metrics
A Graph-Based Metamodelfor Object-Oriented
Software Metrics
Tom Mens ([email protected])
Postdoctoral Fellow – Fund for Scientific Research (Flanders)
Vrije Universiteit Brussel, Belgium
2ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
GoalGoal
use graphs as an underlying formalism/representation to define a formal framework for OO metrics independent of
the programming language (e.g., Smalltalk, Java, or C++) the life-cycle phase (e.g., design or implementation)
identify a minimal set of primitive functions to cover an as wide variety of OO metrics as possible
implement open and customisable metrics tools easy to add new OO metrics easy to incorporate new language features easy to use and customise at different levels of abstraction
3ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
ApproachApproach
top-down improve existing metrics tools
CodeCrawler SoulMetrics
bottom-up develop generic graph-based formalism
validate on a variety of OO metrics suites on a significant number of different programs
4ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Tool support: CodeCrawlerTool support: CodeCrawler
a language independent reverse engineering tool combines metrics and software visualization based on the FAMIX language-independent metamodel implemented in VisualWorks 3.0 Smalltalk runs on every major platform
6ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Tool support: CodeCrawlerTool support: CodeCrawler
7ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Tool support: SoulMetricsTool support: SoulMetrics
a generic logic-programming-based metrics tool defined in SOUL, a logic meta-programming environment on top of Smalltalk VisualWorks 7 a collection of logic predicates fully integrated in the Smalltalk GUI (browser) runs on every major platform
8ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Tool support: SoulMetricsTool support: SoulMetrics
10ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Tool support: SoulMetricsTool support: SoulMetrics
11ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Represent software as graphsRepresent software as graphs
Directed attributed multi-graphs
publicclassc4
protectedclassc3
privateclassc1
protectedclassc2
publicclass
c
e6uses
e3uses
e4uses
publicpackage
p1e1
uses
e8inherits
e5uses private
packagep2
e2imports
e7inherits
e12uses
e9inherits
e10inherits
e11inherits
12ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Primitive graph functionsPrimitive graph functions
pred: Node PF(Node) predecessor nodes
succ: Node PF(Node) successor nodes
fanIn: Node PF(Edge) incoming edges
fanOut: Node PF(Edge) outgoing edges
path: Node Node PF(Edge) edge paths
+ iterative versions predi, pred+, pred*, succi, succ+, succ*
13ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Primitive graph functionsPrimitive graph functions
pred(c4)
publicclassc4
protectedclassc3
privateclassc1
protectedclassc2
publicclass
c
e6uses
e3uses
e4uses
publicpackage
p1e1
uses
e8inherits
e5uses private
packagep2
e2imports
e7inherits
e12uses
e9inherits
e10inherits
e11inherits
14ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Primitive graph functionsPrimitive graph functions
succ(c4)
publicclassc4
protectedclassc3
privateclassc1
protectedclassc2
publicclass
c
e6uses
e3uses
e4uses
publicpackage
p1e1
uses
e8inherits
e5uses private
packagep2
e2imports
e7inherits
e12uses
e9inherits
e10inherits
e11inherits
15ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Primitive graph functionsPrimitive graph functions
fanIn(c3)
publicclassc4
protectedclassc3
privateclassc1
protectedclassc2
publicclass
c
e6uses
e3uses
e4uses
publicpackage
p1e1
uses
e8inherits
e5uses private
packagep2
e2imports
e7inherits
e12uses
e9inherits
e10inherits
e11inherits
16ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Primitive graph functionsPrimitive graph functions
fanOut(c3)
publicclassc4
protectedclassc3
privateclassc1
protectedclassc2
publicclass
c
e6uses
e3uses
e4uses
publicpackage
p1e1
uses
e8inherits
e5uses private
packagep2
e2imports
e7inherits
e12uses
e9inherits
e10inherits
e11inherits
17ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Primitive graph functionsPrimitive graph functions
path(c2,c)
publicclassc4
protectedclassc3
privateclassc1
protectedclassc2
publicclass
c
e6uses
e3uses
e4uses
publicpackage
p1e1
uses
e8inherits
e5uses private
packagep2
e2imports
e7inherits
e12uses
e9inherits
e10inherits
e11inherits
18ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Qualified graph functionsQualified graph functions
pred: NodeNodeConstraintEdgeConstraint PF(Node) idem for predi, pred+, pred*, succi, succ+, succ*
fanIn: NodeEdgeConstraint PF(Edge) idem for fanOut
path: NodeNodeNodeConstraintEdgeConstraint PF(Edge+)
begin is defined in terms of pred* calculates all nodes that have no predecessors
end is defined in terms of succ* calculates all nodes that have no successors
19ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Qualified graph functionsQualified graph functions
fanIn(c,isNoUsesEdge)
publicclassc4
protectedclassc3
privateclassc1
protectedclassc2
publicclass
c
e6uses
e3uses
e4uses
publicpackage
p1e1
uses
e8inherits
e5uses private
packagep2
e2imports
e7inherits
e12uses
e9inherits
e10inherits
e11inherits
20ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Qualified graph functionsQualified graph functions
pred(c,isClassNode,isUsesEdge)
publicclassc4
protectedclassc3
privateclassc1
protectedclassc2
publicclass
c
e6uses
e3uses
e4uses
publicpackage
p1e1
uses
e8inherits
e5uses private
packagep2
e2imports
e7inherits
e12uses
e9inherits
e10inherits
e11inherits
21ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Object-oriented inheritance metricsObject-oriented inheritance metrics
Let nNode such that isClassNode(n)subclasses(n) := pred(n,isClassNode,isInheritsEdge)
descendants(n) := pred+(n,isClassNode,isInheritsEdge)
leafClasses(n) := start(n,isClassNode,isInheritsEdge)
inheritanceToRoot(n) := path(n,m,isClassNode,isInheritsEdge)
mend(n,isClassNode,isInheritsEdge)
NOS(n) = |subclasses(n)|
NOD(n) = |descendants(n)|
NOL(n) = |leafClasses(n)|
DIT(n) = average(inheritanceToRoot(n),map(length))
22ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Object-oriented inheritance metricsObject-oriented inheritance metrics
subclasses(c) NOS(c)=2
publicclassc4
protectedclassc3
privateclassc1
protectedclassc2
publicclass
c
e6uses
e3uses
e4uses
publicpackage
p1e1
uses
e8inherits
e5uses private
packagep2
e2imports
e7inherits
e12uses
e9inherits
e10inherits
e11inherits
23ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Object-oriented inheritance metricsObject-oriented inheritance metrics
descendants(c) NOD(c)=4
publicclassc4
protectedclassc3
privateclassc1
protectedclassc2
publicclass
c
e6uses
e3uses
e4uses
publicpackage
p1e1
uses
e8inherits
e5uses private
packagep2
e2imports
e7inherits
e12uses
e9inherits
e10inherits
e11inherits
24ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Object-oriented inheritance metricsObject-oriented inheritance metrics
leafClasses(c) NOL(c)=2
publicclassc4
protectedclassc3
privateclassc1
protectedclassc2
publicclass
c
e6uses
e3uses
e4uses
publicpackage
p1e1
uses
e8inherits
e5uses private
packagep2
e2imports
e7inherits
e12uses
e9inherits
e10inherits
e11inherits
25ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Object-oriented inheritance metricsObject-oriented inheritance metrics
inheritanceToRoot(c2) DIT(c2)=2
publicclassc4
protectedclassc3
privateclassc1
protectedclassc2
publicclass
c
e6uses
e3uses
e4uses
publicpackage
p1e1
uses
e8inherits
e5uses private
packagep2
e2imports
e7inherits
e12uses
e9inherits
e10inherits
e11inherits
26ICGT, 10 October 2002, Barcelona © Tom Mens, Vrije Universiteit Brussel
Ratio MetricsRatio Metrics
MethodHidingFactor(n)= 1 – Ratio(succ,isMethodNode,isPublicNode,isContainsEdge)(n)
= 1- |succ(n,isMethodNodeisPublicNode,isContainsEdge)|
|succ(n,isMethodNode,isContainsEdge)|
AbstractSubclassRatio(n)= 1 – Ratio(pred,isClassNode,isAbstractNode,isInheritsEdge)(n)
LeafclassRatio(n)= 1 – Ratio(pred*,isClassNode,isInheritanceLeaf,isInheritsEdge)(n)