Code quailty metrics demystified

40
Code Quality Metrics Demystified @JeroenResoort @jdriven_nl

Transcript of Code quailty metrics demystified

Page 1: Code quailty metrics demystified

Code Quality Metrics Demystified@JeroenResoort @jdriven_nl

Page 2: Code quailty metrics demystified

What are metrics?

Page 3: Code quailty metrics demystified

Why use metrics?

Page 4: Code quailty metrics demystified

Why use metrics?To measure software quality

Page 5: Code quailty metrics demystified

What is software quality?

Page 6: Code quailty metrics demystified

Why use metrics?To measure and improve software maintainability attributes:

● Analysability

● Changeability

● Stability

● Testability

Page 7: Code quailty metrics demystified

How to collect metrics?

Page 8: Code quailty metrics demystified

How to use / collect metrics?IDE

CheckStyle

SonarQube

Page 9: Code quailty metrics demystified

How to collect metrics?docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 sonarqube

mvn sonar:sonar

Page 10: Code quailty metrics demystified

Volume

Page 11: Code quailty metrics demystified

VolumeFiles / Classes

Lines

Lines of code

LoC per file

LoC per method

Page 12: Code quailty metrics demystified

Volumepublic int sum(int a, int b) {

return a + b;

}

Page 13: Code quailty metrics demystified

Volumepublic int sumToo( int a

, int b )

{

int result = a + b;

return result;

}

Page 14: Code quailty metrics demystified

Volumepublic List<Integer> calculate(List<Integer> numbers) {

return numbers.stream().map(i -> i * i).filter(i -> i % 2 == 0).collect(Collectors.toList());

}

Page 15: Code quailty metrics demystified

Volumepublic List<Integer> calculateFormatted(List<Integer> numbers) {

return numbers.stream().

map(i -> i * i).

filter(i -> i % 2 == 0).

collect(Collectors.toList());

}

Page 16: Code quailty metrics demystified

Volumeimport java.util.List;

import java.util.ArrayList;

import java.util.Set;

import java.util.HashSet;

Page 17: Code quailty metrics demystified

Volumeimport java.util.*;

Page 18: Code quailty metrics demystified

Cyclomatic Complexity

Page 19: Code quailty metrics demystified

Cyclomatic ComplexityMcCabe, 1976

Control flow graph

Linearly independent paths

Page 20: Code quailty metrics demystified

Cyclomatic Complexity

Page 21: Code quailty metrics demystified

Cyclomatic ComplexityThe complexity M is defined as

M = E − N + 2P,

where

E = the number of edges of the graph.

N = the number of nodes of the graph.

P = the number of connected components.

Page 22: Code quailty metrics demystified

Cyclomatic ComplexityAlternative formula

M = E − N + P

After connecting exit point to entry point

Page 23: Code quailty metrics demystified

Cyclomatic Complexity

Page 24: Code quailty metrics demystified

Cyclomatic Complexitypublic int sum(int a, int b) {

return a + b;

}

Page 25: Code quailty metrics demystified

Cyclomatic Complexitypublic int sum(int[] amounts) {

int result = 0;

for (int i = 0; i < amounts.length; i++) {

result += amounts[i];

}

return result;

}

Page 26: Code quailty metrics demystified

Cyclomatic Complexitypublic boolean checkWithdrawal(Account account, int amount) {

boolean result = false;if (account.getBalance() >= amount) {

result = true;}if (account.isLocked()) {

result = false;}return result;

}

Page 27: Code quailty metrics demystified

Cyclomatic Complexitypublic boolean checkWithdrawal(Account acc, int amount) {

if (!acc.isLocked() && acc.getBalance() >= amount) {

return true;

}

return false;

}

Page 28: Code quailty metrics demystified

Cyclomatic ComplexityComplexity per class

Complexity per method

Page 29: Code quailty metrics demystified

Fan in / Fan out

Page 30: Code quailty metrics demystified

Fan in / Fan outFan in: number of classes referencing you

Fan out: number classes you are referencing

Page 31: Code quailty metrics demystified

Package Entanglement

Page 32: Code quailty metrics demystified

Package Entanglement

Page 33: Code quailty metrics demystified

Duplication

Page 34: Code quailty metrics demystified

DuplicationHow to check?

Per line vs multiple lines?

Exact match or not?

Page 35: Code quailty metrics demystified

Unit Test coverage

Page 36: Code quailty metrics demystified

Unit Test coverageBad examples

Page 37: Code quailty metrics demystified

Unit Test coverageAre your unit tests actually testing the right things?

Mutation tests!

Page 38: Code quailty metrics demystified

ConclusionA lot of metrics available

Understand what they mean

Don’t use metrics as KPIs!

Page 39: Code quailty metrics demystified

Questions?

Page 40: Code quailty metrics demystified

Code Quailty Metrics Demystified@JeroenResoort @jdriven_nl