Upload
sebastian-marek
View
5.835
Download
0
Embed Size (px)
DESCRIPTION
We use static code analysis tools more often these days that create great reports and funky graphs. But do we understand what it all means? Software metrics tends to be magic numbers for a lot of people, but they don’t really have to be. Seb will introduce you to a few basic, the most popular software metrics and tools. He will explain to you what they mean and how you can use them to produce better software.
Citation preview
Sebas&an Marek, So.ware Architect
Magic behind the numbers
So.ware metrics in prac&ce
@proofek
• a Pole living in Sheffield • over 12 years in
development • Pascal, C++, PHP, perl,
python, Java • co-‐author of 2 PHP books • big fan of process
automa&on • TDD and CI • occasionally contributes to
open source projects • wants to be a knight
Agenda
• What I will be talking about • Code metrics • Design metrics
• What I will not be talking about • Project metrics
Most effec&ve code quality measure
What is a metric?
“It is the mapping of a particular
characteristic of a measured entity to a numerical value”
Source: Object-Oriented Metrics in Practice
So.ware design
“Good design quality metrics are not necessarily indicative of good designs. Likewise, bad design quality metrics are
not necessarily indicative of bad designs”
Source: Jdepend Docs
System maintenance
• Obsolete documenta&on
• Convoluted design
• Intensive patch mechanism (hacking)
• Large size
• Severe duplica&on
• Obsolete parts (dead code)
• Long build &mes
• Loss of original developers
Simple metrics
• CLOC – comment lines of code
• ELOC – executable lines of code
• LOC – lines of code
• NCLOC – non comment lines of code
• NOP – number of packages
• NOC – number of classes
• NOM – number of methods
Cycloma&c Complexity (CYCLO)
Cyclomatic complexity measures the amount of decision logic in a single software module
Cycloma&c Complexity Number (CCN)
Condi3onal statements: • ? • case • elseif • for • foreach • if • while
CCN2
Condi3onal statements: • ? • case • elseif • for • foreach • if • while
• && • || • or • and • xor
Cycloma&c Complexity
Condi3onal statements: • ? • case • elseif • for • foreach • if • while
• && • || • or • and • xor • catch
Cycloma&c complexity -‐ example
class Foo { public function example() { if ($a == $b) { if ($a1 == $b1) { fiddle(); } elseif ($a2 == $b2) { fiddle(); } else { fiddle(); } } elseif ($e == $f) { for ($n = 0; $n < $h; $n++) { fiddle(); } } else { fiddle(); } } }
Cycloma&c complexity -‐ example
class Foo { public function example() { 1 if ($a == $b) { 2 if ($a1 == $b1) { 3 fiddle(); } elseif ($a2 == $b2) { 4 fiddle(); } else { fiddle(); } } elseif ($e == $f) { 5 for ($n = 0; $n < $h; $n++) { 6 fiddle(); } } else { fiddle(); } } }
phploc
phploc 1.6.1 by Sebastian Bergmann.Directories: 6Files: 20Lines of Code (LOC): 5478 Cyclomatic Complexity / Lines of Code: 0.13Comment Lines of Code (CLOC): 2143Non-Comment Lines of Code (NCLOC): 3335Namespaces: 0Interfaces: 1Classes: 18 Abstract: 2 (11.11%) Concrete: 16 (88.89%) Average Class Length (NCLOC): 191Methods: 151 Scope: Non-Static: 143 (94.70%) Static: 8 (5.30%) Visibility: Public: 116 (76.82%) Non-Public: 35 (23.18%) Average Method Length (NCLOC): 22 Cyclomatic Complexity / Number of Methods: 3.72Anonymous Functions: 0Functions: 2Constants: 4 Global constants: 3 Class constants: 1
Cycloma&c complexity -‐ thresholds
Low Avg High V.High
Complexity 1-‐4 5-‐7 8-‐10 > 11
JAVA
Metric Low Avg High V.High
CYCLO/Line of code 0.16 0.20 0.24 0.36
LOC/Method 7 10 13 19.5
NOM/Class 4 7 10 15
Source: Object-‐Oriented Metrics in Prac5ce (based on 45 Java projects)
C++
Metric Low Avg High V.High
CYCLO/Line of code 0.20 0.25 0.30 0.45
LOC/Method 5 10 16 24
NOM/Class 4 9 15 22.5
Source: Object-‐Oriented Metrics in Prac5ce (based on 37 C++ projects)
WMC and AMW
Weighted Method Count – total complexity of a class
Average Method Weight – average complexity of a method
JAVA
Source: Object-‐Oriented Metrics in Prac5ce (based on 45 Java projects)
Metric Low Avg High V.High
WMC 5 14 31 47
AMW 1.1 2.0 3.1 4.7
LOC/Class 28 70 130 195
C++
Source: Object-‐Oriented Metrics in Prac5ce (based on 37 C++ projects)
Metric Low Avg High V.High
WMC 4 23 72 108
AMW 1.0 2.5 4.8 7.0
LOC/Class 20 90 240 360
Coverage report
Coverage report
C.R.A.P
C.R.A.P
Change Risk Analysis and Predic&ons
C.R.A.P formula
Code coverage = 100%
Code coverage = 0%
C.R.A.P thresholds
NPATH – acyclic execu&on path complexity
“NPATH is an objective measure of software complexity related to the ease with which software
can be comprehensively tested”
Edgar H. Sibley
NPATH – acyclic execu&on path complexity
expressions Number of && and || operators in expression if NP(<if-range>)+NP(<expr>)+1 if-else NP(<if-range>)+NP(<else-range>)+NP(<expr>) while NP(<while-range>)+NP(<expr>)+1 for NP(<for-range>)+NP(<expr1>)+NP(<expr2>)+ NP(<expr3>)+1 break 1 continue 1 return 1 sequential 1 function call 1
NPATH – example
class Foo { public function example() {
if ($a == $b) { if ($a1 == $b1) { fiddle(); } else { fiddle(); } }
if ($e == $f && $g == $z) { for ($n = 0; $n < $h; $n++) { fiddle(); } }
return true; } }
NPATH – example
class Foo { public function example() {
if ($a == $b) { if ($a1 == $b1) { fiddle(); } else { 3 fiddle(); } }
if ($e == $f && $g == $z) { for ($n = 0; $n < $h; $n++) { fiddle(); 4 } }
return true; 1 } }
PHP Depend
PHP_Depend 0.10.6 by Manuel PichlerParsing source files:.................... 20Executing CyclomaticComplexity-Analyzer:............. 261Executing ClassLevel-Analyzer:............ 247Executing CodeRank-Analyzer:. 28Executing Coupling-Analyzer:............. 267Executing Hierarchy-Analyzer:............ 246Executing Inheritance-Analyzer:. 30Executing NPathComplexity-Analyzer:.............. 283Executing NodeCount-Analyzer:........ 174Executing NodeLoc-Analyzer:.......... 205Generating pdepend log files, this may take a moment.Time: 00:05; Memory: 25.50Mb
PHP Mess Detector
Overview pyramid
Size and complexity – direct metrics
Size and complexity – computed propor&ons
System coupling – direct metrics
System coupling – computed propor&ons
System inheritance
Complete Overview Pyramid
PHP
Metric Low Avg High
CYCLO/LOC 0.16 0.20 0.24
LOC/NOM 7 10 13
NOM/NOC 4 7 10
NOC/NOP 6 17 26
CALLS/NOM 2.01 2.62 3.2
FANOUT/CALLS 0.56 0.62 0.68
ANDC 0.25 0.41 0.57
AHH 0.09 0.21 0.32
hBp://pdepend.org/
Metrics visualisa&on with Sonar
Metrics visualisa&on with Sonar
Viola&ons repor&ng
SIG Maintainability Model
-‐-‐ -‐ 0 + ++
Very bad Bad Average Good Very good
Technical Debt
Summary
“We believe that soIware metrics, in general, are just tools. No single metric can tell the whole story; it’s just one more data point. “
“Metrics are meant to be used by developers, not the other way around – the metric should work for you, you should not have to work
for the metric. “
“Metrics should never be an end unto themselves. Metrics are meant to help you think, not to do the thinking for you.”
• Alberto Savoia
Resources
• PHP Depend -‐ hmp://pdepend.org/ • PHP Mess Detector -‐ hmp://phpmd.org/ • Manuel’s home page -‐ hmp://manuel-‐pichler.de/ • PHPUnit -‐ hmp://www.phpunit.de/ • phploc -‐ hmp://sebas&anbergmann.github.com/phploc/ • Sonar -‐ hmp://www.sonarsource.org/
Object-‐Oriented Metrics in Prac&ce
“Object-‐Oriented Metrics in Prac&ce” by Michele Lanza and Radu Marinescu (ISBN 978-‐3540244295)
Thanks to…
• hmp://www.flickr.com/photos/romainguy/102073478/ • hmp://www.flickr.com/photos/shanafin/615680234/ • hmp://www.flickr.com/photos/pahudson/3080270873/ • hmp://www.flickr.com/photos/smohundro/2243554264/ • hmp://www.flickr.com/photos/m_a_melendez/5956157581/ • hmp://www.flickr.com/photos/elkit/7182541802/ • hmp://www.flickr.com/photos/rickyromero/4209571303/
Ques&ons?
Ques&ons?
hmps://joind.in/6445