SlideShare a Scribd company logo
1 of 27
Download to read offline
Code metrics in PHP
From lines to code semantic
● Julio Martinez
● Developing PHP since 2001
● 1.5 years working at Ulabox
● Find me: @liopic
Code metrics in PHP: 0. Introduction
Who am I?
● El antisúper!
● 6-years-old startup
● 11 developers
● monolith & new services
● #rigor
● We are hiring!
Code metrics in PHP: 0. Introduction
What is Ulabox?
● Evaluate quality!
● We need objective, reproducible and quantifiable metrics
Could you tell me some examples of metrics?
Code metrics in PHP: 1. Looking for quality
Why do we need software metrics?
● number of bugfixes per month
● lines of code
● test coverage
● number of user stories covered
● follows clean code’s rules
● documentation lines / total of code lines
● etc
Code metrics in PHP: 1. Looking for quality
Some examples?
● Testing first!
● Code “surface”
● Lines grouping
● Code semantic
Disclaimer: I’ll discuss locally-executable tools (non SaaS)
● SaaS: Insight, Code climate, Scrutinizer, SonarQube...
Code metrics in PHP: 1. Looking for quality
Let’s start our knowledge journey...
● User stories: behat
● General testing: phpunit
○ Code coverage
○ Mutant testing (=test your tests): humbug
● Unit/spec testing: phpspec
Code metrics in PHP. Testing
Testing First!
● Code sniffer (code style, PSR2): phpcs
● Copy+paste detector (DRY): phpcpd
● Clean code & common smells:
○ phpmd (“mess detector”, a bit old)
○ Exakat (it’s SaaS but has trial download)
Code metrics in PHP: 3. Code surface
Code “surface”
● Counting lines: phploc
● Getting ratios: pdepend
Code metrics in PHP: 4. Lines grouping
Lines grouping
1. Cyclomatic complexity (paths of execution)
2. Coupling metrics (relations between “modules”)
3. Lack of cohesion, LCOM (relations between methods)
4. Halstead’s metrics (operands and operators)
5. Maintainability Index
Code metrics in PHP: 5. Code semantic
Code semantic analysis
Code metrics in PHP: 5. Code semantic
Cyclomatic complexity
abstract class BaseBird
{
private $eggs = 0;
public function makeEgg()
{
$this->eggs++;
}
public function crackEgg()
{
if ($this->eggs <=0) {
throw new NoEggsException();
}
$this->eggs--;
}
public function fly()
{
return 'flap-flap';
}
abstract public function sound();
}
class Duck extends BaseBird
{
public function sound()
{
return 'quack';
}
public function swim()
{
return 'splash';
}
}
class Parrot extends BaseBird
{
public function sound()
{
$friend = new Duck();
if($friend->sound()){
return 'Err '.$friend->sound();
}
return '';
}
}
Code metrics in PHP: 5. Code semantic
Cyclomatic complexity
abstract class BaseBird
{
private $eggs = 0;
public function makeEgg()
{
$this->eggs++;
}
public function crackEgg()
{
if ($this->eggs <=0) {
throw new NoEggsException();
}
$this->eggs--;
}
public function fly()
{
return 'flap-flap';
}
abstract public function sound();
}
class Duck extends BaseBird
{
public function sound()
{
return 'quack';
}
public function swim()
{
return 'splash';
}
}
class Parrot extends BaseBird
{
public function sound()
{
$friend = new Duck();
if($friend->sound()){
return 'Err '.$friend->sound();
}
return '';
}
}
2
2
1
● Afferent couplings (Ca) - “they use you”
● Efferent couplings (Ce) - “you use them”
● Instability, resilience to change (I): I = Ce / (Ce + Ca)
○ I=0 is a completely stable package
○ I=1 is a completely unstable package
Code metrics in PHP: 5. Code semantic
Coupling metrics
● Abstractness (A): ratio of abstract classes
○ A=0 is a completely concrete package
○ A=1 is a completely abstract package
● Examples:
○ BaseBird: Ce=1 (uses NoEggsException), Ca=0; A=1, I=1
○ Parrot, Ce=1 (uses Duck), Ca=0; A=0, I=1
○ Duck, Ce=0, Ca=0; A=0, I=0
Code metrics in PHP: 5. Code semantic
Coupling metrics
● Distance from the main sequence (D): D = |A+I-1|
○ Balance between abstractness and stability
○ Ideal packages: (I=1, A=0), (I=0, A=1)
Code metrics in PHP: 5. Code semantic
Coupling metrics: main sequence
● Groups of methods
● LCOM = 1 is ideal
Code metrics in PHP: 5. Code semantic
Lack of cohesion of methods (LCOM)
abstract class BaseBird
{
private $eggs = 0;
public function makeEgg()
{
$this->eggs++;
}
public function crackEgg()
{
if ($this->eggs <=0) {
throw new NoEggsException();
}
$this->eggs--;
}
public function fly()
{
return 'flap-flap';
}
abstract public function sound();
}
● Groups of methods
● LCOM = 1 is ideal
● BaseBird LCOM = 3
Code metrics in PHP: 5. Code semantic
Lack of cohesion of methods (LCOM)
abstract class BaseBird
{
private $eggs = 0;
public function makeEgg()
{
$this->eggs++;
}
public function crackEgg()
{
if ($this->eggs <=0) {
throw new NoEggsException();
}
$this->eggs--;
}
public function fly()
{
return 'flap-flap';
}
abstract public function sound();
}
● η1
= number of distinct operators
● η2
= number of distinct operands
● N1
= the total number of operators
● N2
= the total number of operands
● Program vocabulary: η = η1
+ η2
● Program length: N = N1
+ N2
Code metrics in PHP: 5. Code semantic
Halstead complexity measures (1977)
● Volume: V = N × log2
η (linearly with length, log with vocabulary)
● Difficulty : D = η1
/2 × N2
/η2
(half distinct operators, scarcity of operands)
● Effort: E = D × V
● Time required to program: T = E/18 seconds
● Delivered bugs:
Code metrics in PHP: 5. Code semantic
Halstead complexity measures
● University of Idaho, Oman and Hagemeister
● Volume (V), Cyclomatic Complexity (G), Lines of Code (LOC)
● Original MI = 171 - 5.2*ln(V) - 0.23*G - 16.2*ln(LOC)
Code metrics in PHP: 5. Code semantic
Maintainability Index (1991)
● phpmetrics
○ Let’s see all those indexes!
Code metrics in PHP: 5. Code semantic
Coupling + LCOM + Halstead + MI
Maintainability.................... 65.83 / 100
Accessibility for new developers... 41.03 / 100
Simplicity of algorithms........... 42.57 / 100
Volume............................. 64.90 / 100
Reducing bug's probability......... 65.57 / 100
● MUST!
○ phpcs - code sniffer - No extra effort need; always
○ phpunit - integration & unit tests - Write tests; always
● Adopt
○ phpspec - unit/specs - Write tests; always
○ behat - user stories (functional tests) - Write user stories; always
○ phpcpd - copy & paste - No effort; always
○ phpmetrics - No effort; main indexes weekly, others when refactor
● Give a try
○ humbug - test your tests - No effort; often
○ SaaS options - Customization effort; always
Code metrics in PHP: 6. Summing up!
RADAR of tools (how? when?)
Code metrics in PHP: 6. Summing up!
Questions?
Code metrics in PHP: 6. Summing up!
Thank you!

More Related Content

What's hot

Konfigurasi mikrotik-dasar-hotspot-dan-warnet
Konfigurasi mikrotik-dasar-hotspot-dan-warnetKonfigurasi mikrotik-dasar-hotspot-dan-warnet
Konfigurasi mikrotik-dasar-hotspot-dan-warnet
R Arju Damar
 
Dunyanin en guzel 7 vahası
Dunyanin en guzel 7 vahasıDunyanin en guzel 7 vahası
Dunyanin en guzel 7 vahası
Raci Göktaş
 

What's hot (12)

Authentication & Authorization in ASPdotNet MVC
Authentication & Authorization in ASPdotNet MVCAuthentication & Authorization in ASPdotNet MVC
Authentication & Authorization in ASPdotNet MVC
 
system requirements for android projects
system requirements for android projectssystem requirements for android projects
system requirements for android projects
 
Introduction to Flutter
Introduction to FlutterIntroduction to Flutter
Introduction to Flutter
 
Konfigurasi mikrotik-dasar-hotspot-dan-warnet
Konfigurasi mikrotik-dasar-hotspot-dan-warnetKonfigurasi mikrotik-dasar-hotspot-dan-warnet
Konfigurasi mikrotik-dasar-hotspot-dan-warnet
 
Dunyanin en guzel 7 vahası
Dunyanin en guzel 7 vahasıDunyanin en guzel 7 vahası
Dunyanin en guzel 7 vahası
 
Build beautiful native apps in record time with flutter
Build beautiful native apps in record time with flutterBuild beautiful native apps in record time with flutter
Build beautiful native apps in record time with flutter
 
Mobile security part 1(Android Apps Pentesting)- Romansh yadav
Mobile security part 1(Android Apps Pentesting)- Romansh yadavMobile security part 1(Android Apps Pentesting)- Romansh yadav
Mobile security part 1(Android Apps Pentesting)- Romansh yadav
 
Angular Material (2) - NgVikingsConf
Angular Material (2) - NgVikingsConfAngular Material (2) - NgVikingsConf
Angular Material (2) - NgVikingsConf
 
.Net Core - not your daddy's dotnet
.Net Core - not your daddy's dotnet.Net Core - not your daddy's dotnet
.Net Core - not your daddy's dotnet
 
Devportal Information Architecture: A 4-step Method
Devportal Information Architecture: A 4-step MethodDevportal Information Architecture: A 4-step Method
Devportal Information Architecture: A 4-step Method
 
Introduction to Django REST Framework, an easy way to build REST framework in...
Introduction to Django REST Framework, an easy way to build REST framework in...Introduction to Django REST Framework, an easy way to build REST framework in...
Introduction to Django REST Framework, an easy way to build REST framework in...
 
Debugging with Fiddler
Debugging with FiddlerDebugging with Fiddler
Debugging with Fiddler
 

Similar to Code metrics in PHP

Code Analysis-run time error prediction
Code Analysis-run time error predictionCode Analysis-run time error prediction
Code Analysis-run time error prediction
NIKHIL NAWATHE
 
Enforcing API Design Rules for High Quality Code Generation
Enforcing API Design Rules for High Quality Code GenerationEnforcing API Design Rules for High Quality Code Generation
Enforcing API Design Rules for High Quality Code Generation
Tim Burks
 
LINQ Inside
LINQ InsideLINQ Inside
LINQ Inside
jeffz
 

Similar to Code metrics in PHP (20)

Measuring maintainability; software metrics explained
Measuring maintainability; software metrics explainedMeasuring maintainability; software metrics explained
Measuring maintainability; software metrics explained
 
More about PHP
More about PHPMore about PHP
More about PHP
 
Improving Code Quality Through Effective Review Process
Improving Code Quality Through Effective  Review ProcessImproving Code Quality Through Effective  Review Process
Improving Code Quality Through Effective Review Process
 
Dutch PHP Conference 2013: Distilled
Dutch PHP Conference 2013: DistilledDutch PHP Conference 2013: Distilled
Dutch PHP Conference 2013: Distilled
 
Joomla Code Quality Control and Automation Testing
Joomla Code Quality Control and Automation TestingJoomla Code Quality Control and Automation Testing
Joomla Code Quality Control and Automation Testing
 
Code Analysis-run time error prediction
Code Analysis-run time error predictionCode Analysis-run time error prediction
Code Analysis-run time error prediction
 
The why and how of moving to php 8
The why and how of moving to php 8The why and how of moving to php 8
The why and how of moving to php 8
 
Machine Learning on Code - SF meetup
Machine Learning on Code - SF meetupMachine Learning on Code - SF meetup
Machine Learning on Code - SF meetup
 
The why and how of moving to php 7
The why and how of moving to php 7The why and how of moving to php 7
The why and how of moving to php 7
 
Go. why it goes v2
Go. why it goes v2Go. why it goes v2
Go. why it goes v2
 
The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6
 
The operation principles of PVS-Studio static code analyzer
The operation principles of PVS-Studio static code analyzerThe operation principles of PVS-Studio static code analyzer
The operation principles of PVS-Studio static code analyzer
 
PHP 8: Process & Fixing Insanity
PHP 8: Process & Fixing InsanityPHP 8: Process & Fixing Insanity
PHP 8: Process & Fixing Insanity
 
Enforcing API Design Rules for High Quality Code Generation
Enforcing API Design Rules for High Quality Code GenerationEnforcing API Design Rules for High Quality Code Generation
Enforcing API Design Rules for High Quality Code Generation
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy Code
 
LINQ Inside
LINQ InsideLINQ Inside
LINQ Inside
 
Standardizing on a single N-dimensional array API for Python
Standardizing on a single N-dimensional array API for PythonStandardizing on a single N-dimensional array API for Python
Standardizing on a single N-dimensional array API for Python
 
Mender.io | Develop embedded applications faster | Comparing C and Golang
Mender.io | Develop embedded applications faster | Comparing C and GolangMender.io | Develop embedded applications faster | Comparing C and Golang
Mender.io | Develop embedded applications faster | Comparing C and Golang
 
Towards Developing a Repository of Logical Errors Observed in Parallel Code t...
Towards Developing a Repository of Logical Errors Observed in Parallel Code t...Towards Developing a Repository of Logical Errors Observed in Parallel Code t...
Towards Developing a Repository of Logical Errors Observed in Parallel Code t...
 
Php training100%placement-in-mumbai
Php training100%placement-in-mumbaiPhp training100%placement-in-mumbai
Php training100%placement-in-mumbai
 

More from Julio Martinez (8)

Buscando un trabajo en un pajar
Buscando un trabajo en un pajarBuscando un trabajo en un pajar
Buscando un trabajo en un pajar
 
Customer segmentation scbcn17
Customer segmentation scbcn17Customer segmentation scbcn17
Customer segmentation scbcn17
 
Remote working effectively
Remote working effectivelyRemote working effectively
Remote working effectively
 
Conclusion of the Seminary UPC 2017
Conclusion of the Seminary UPC 2017Conclusion of the Seminary UPC 2017
Conclusion of the Seminary UPC 2017
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to Docker
 
Some OOP paradigms & SOLID
Some OOP paradigms & SOLIDSome OOP paradigms & SOLID
Some OOP paradigms & SOLID
 
Introduction to Clean Code
Introduction to Clean CodeIntroduction to Clean Code
Introduction to Clean Code
 
Professional development
Professional developmentProfessional development
Professional development
 

Recently uploaded

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Recently uploaded (20)

Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 

Code metrics in PHP

  • 1. Code metrics in PHP From lines to code semantic
  • 2. ● Julio Martinez ● Developing PHP since 2001 ● 1.5 years working at Ulabox ● Find me: @liopic Code metrics in PHP: 0. Introduction Who am I?
  • 3. ● El antisúper! ● 6-years-old startup ● 11 developers ● monolith & new services ● #rigor ● We are hiring! Code metrics in PHP: 0. Introduction What is Ulabox?
  • 4. ● Evaluate quality! ● We need objective, reproducible and quantifiable metrics Could you tell me some examples of metrics? Code metrics in PHP: 1. Looking for quality Why do we need software metrics?
  • 5. ● number of bugfixes per month ● lines of code ● test coverage ● number of user stories covered ● follows clean code’s rules ● documentation lines / total of code lines ● etc Code metrics in PHP: 1. Looking for quality Some examples?
  • 6. ● Testing first! ● Code “surface” ● Lines grouping ● Code semantic Disclaimer: I’ll discuss locally-executable tools (non SaaS) ● SaaS: Insight, Code climate, Scrutinizer, SonarQube... Code metrics in PHP: 1. Looking for quality Let’s start our knowledge journey...
  • 7. ● User stories: behat ● General testing: phpunit ○ Code coverage ○ Mutant testing (=test your tests): humbug ● Unit/spec testing: phpspec Code metrics in PHP. Testing Testing First!
  • 8. ● Code sniffer (code style, PSR2): phpcs ● Copy+paste detector (DRY): phpcpd ● Clean code & common smells: ○ phpmd (“mess detector”, a bit old) ○ Exakat (it’s SaaS but has trial download) Code metrics in PHP: 3. Code surface Code “surface”
  • 9. ● Counting lines: phploc ● Getting ratios: pdepend Code metrics in PHP: 4. Lines grouping Lines grouping
  • 10. 1. Cyclomatic complexity (paths of execution) 2. Coupling metrics (relations between “modules”) 3. Lack of cohesion, LCOM (relations between methods) 4. Halstead’s metrics (operands and operators) 5. Maintainability Index Code metrics in PHP: 5. Code semantic Code semantic analysis
  • 11. Code metrics in PHP: 5. Code semantic Cyclomatic complexity abstract class BaseBird { private $eggs = 0; public function makeEgg() { $this->eggs++; } public function crackEgg() { if ($this->eggs <=0) { throw new NoEggsException(); } $this->eggs--; } public function fly() { return 'flap-flap'; } abstract public function sound(); } class Duck extends BaseBird { public function sound() { return 'quack'; } public function swim() { return 'splash'; } } class Parrot extends BaseBird { public function sound() { $friend = new Duck(); if($friend->sound()){ return 'Err '.$friend->sound(); } return ''; } }
  • 12. Code metrics in PHP: 5. Code semantic Cyclomatic complexity abstract class BaseBird { private $eggs = 0; public function makeEgg() { $this->eggs++; } public function crackEgg() { if ($this->eggs <=0) { throw new NoEggsException(); } $this->eggs--; } public function fly() { return 'flap-flap'; } abstract public function sound(); } class Duck extends BaseBird { public function sound() { return 'quack'; } public function swim() { return 'splash'; } } class Parrot extends BaseBird { public function sound() { $friend = new Duck(); if($friend->sound()){ return 'Err '.$friend->sound(); } return ''; } } 2 2 1
  • 13. ● Afferent couplings (Ca) - “they use you” ● Efferent couplings (Ce) - “you use them” ● Instability, resilience to change (I): I = Ce / (Ce + Ca) ○ I=0 is a completely stable package ○ I=1 is a completely unstable package Code metrics in PHP: 5. Code semantic Coupling metrics
  • 14. ● Abstractness (A): ratio of abstract classes ○ A=0 is a completely concrete package ○ A=1 is a completely abstract package ● Examples: ○ BaseBird: Ce=1 (uses NoEggsException), Ca=0; A=1, I=1 ○ Parrot, Ce=1 (uses Duck), Ca=0; A=0, I=1 ○ Duck, Ce=0, Ca=0; A=0, I=0 Code metrics in PHP: 5. Code semantic Coupling metrics
  • 15. ● Distance from the main sequence (D): D = |A+I-1| ○ Balance between abstractness and stability ○ Ideal packages: (I=1, A=0), (I=0, A=1) Code metrics in PHP: 5. Code semantic Coupling metrics: main sequence
  • 16. ● Groups of methods ● LCOM = 1 is ideal Code metrics in PHP: 5. Code semantic Lack of cohesion of methods (LCOM) abstract class BaseBird { private $eggs = 0; public function makeEgg() { $this->eggs++; } public function crackEgg() { if ($this->eggs <=0) { throw new NoEggsException(); } $this->eggs--; } public function fly() { return 'flap-flap'; } abstract public function sound(); }
  • 17. ● Groups of methods ● LCOM = 1 is ideal ● BaseBird LCOM = 3 Code metrics in PHP: 5. Code semantic Lack of cohesion of methods (LCOM) abstract class BaseBird { private $eggs = 0; public function makeEgg() { $this->eggs++; } public function crackEgg() { if ($this->eggs <=0) { throw new NoEggsException(); } $this->eggs--; } public function fly() { return 'flap-flap'; } abstract public function sound(); }
  • 18. ● η1 = number of distinct operators ● η2 = number of distinct operands ● N1 = the total number of operators ● N2 = the total number of operands ● Program vocabulary: η = η1 + η2 ● Program length: N = N1 + N2 Code metrics in PHP: 5. Code semantic Halstead complexity measures (1977)
  • 19. ● Volume: V = N × log2 η (linearly with length, log with vocabulary) ● Difficulty : D = η1 /2 × N2 /η2 (half distinct operators, scarcity of operands) ● Effort: E = D × V ● Time required to program: T = E/18 seconds ● Delivered bugs: Code metrics in PHP: 5. Code semantic Halstead complexity measures
  • 20. ● University of Idaho, Oman and Hagemeister ● Volume (V), Cyclomatic Complexity (G), Lines of Code (LOC) ● Original MI = 171 - 5.2*ln(V) - 0.23*G - 16.2*ln(LOC) Code metrics in PHP: 5. Code semantic Maintainability Index (1991)
  • 21. ● phpmetrics ○ Let’s see all those indexes! Code metrics in PHP: 5. Code semantic Coupling + LCOM + Halstead + MI Maintainability.................... 65.83 / 100 Accessibility for new developers... 41.03 / 100 Simplicity of algorithms........... 42.57 / 100 Volume............................. 64.90 / 100 Reducing bug's probability......... 65.57 / 100
  • 22.
  • 23.
  • 24.
  • 25. ● MUST! ○ phpcs - code sniffer - No extra effort need; always ○ phpunit - integration & unit tests - Write tests; always ● Adopt ○ phpspec - unit/specs - Write tests; always ○ behat - user stories (functional tests) - Write user stories; always ○ phpcpd - copy & paste - No effort; always ○ phpmetrics - No effort; main indexes weekly, others when refactor ● Give a try ○ humbug - test your tests - No effort; often ○ SaaS options - Customization effort; always Code metrics in PHP: 6. Summing up! RADAR of tools (how? when?)
  • 26. Code metrics in PHP: 6. Summing up! Questions?
  • 27. Code metrics in PHP: 6. Summing up! Thank you!