PHP Forum Paris 2012: Magic behind the numbers. Software metrics in practice

Preview:

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  

Recommended