php forum paris 2012: magic behind the numbers. software metrics in practice
Post on 05-Dec-2014
5.835 Views
Preview:
DESCRIPTION
TRANSCRIPT
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
top related