Download - Code quailty metrics demystified
![Page 1: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/1.jpg)
Code Quality Metrics Demystified@JeroenResoort @jdriven_nl
![Page 2: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/2.jpg)
What are metrics?
![Page 3: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/3.jpg)
Why use metrics?
![Page 4: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/4.jpg)
Why use metrics?To measure software quality
![Page 5: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/5.jpg)
What is software quality?
![Page 6: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/6.jpg)
Why use metrics?To measure and improve software maintainability attributes:
● Analysability
● Changeability
● Stability
● Testability
![Page 7: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/7.jpg)
How to collect metrics?
![Page 8: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/8.jpg)
How to use / collect metrics?IDE
CheckStyle
SonarQube
![Page 9: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/9.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/10.jpg)
Volume
![Page 11: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/11.jpg)
VolumeFiles / Classes
Lines
Lines of code
LoC per file
LoC per method
![Page 12: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/12.jpg)
Volumepublic int sum(int a, int b) {
return a + b;
}
![Page 13: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/13.jpg)
Volumepublic int sumToo( int a
, int b )
{
int result = a + b;
return result;
}
![Page 14: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/14.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/15.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/16.jpg)
Volumeimport java.util.List;
import java.util.ArrayList;
import java.util.Set;
import java.util.HashSet;
![Page 17: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/17.jpg)
Volumeimport java.util.*;
![Page 18: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/18.jpg)
Cyclomatic Complexity
![Page 19: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/19.jpg)
Cyclomatic ComplexityMcCabe, 1976
Control flow graph
Linearly independent paths
![Page 20: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/20.jpg)
Cyclomatic Complexity
![Page 21: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/21.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/22.jpg)
Cyclomatic ComplexityAlternative formula
M = E − N + P
After connecting exit point to entry point
![Page 23: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/23.jpg)
Cyclomatic Complexity
![Page 24: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/24.jpg)
Cyclomatic Complexitypublic int sum(int a, int b) {
return a + b;
}
![Page 25: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/25.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/26.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/27.jpg)
Cyclomatic Complexitypublic boolean checkWithdrawal(Account acc, int amount) {
if (!acc.isLocked() && acc.getBalance() >= amount) {
return true;
}
return false;
}
![Page 28: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/28.jpg)
Cyclomatic ComplexityComplexity per class
Complexity per method
![Page 29: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/29.jpg)
Fan in / Fan out
![Page 30: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/30.jpg)
Fan in / Fan outFan in: number of classes referencing you
Fan out: number classes you are referencing
![Page 31: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/31.jpg)
Package Entanglement
![Page 32: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/32.jpg)
Package Entanglement
![Page 33: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/33.jpg)
Duplication
![Page 34: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/34.jpg)
DuplicationHow to check?
Per line vs multiple lines?
Exact match or not?
![Page 35: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/35.jpg)
Unit Test coverage
![Page 36: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/36.jpg)
Unit Test coverageBad examples
![Page 37: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/37.jpg)
Unit Test coverageAre your unit tests actually testing the right things?
Mutation tests!
![Page 38: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/38.jpg)
ConclusionA lot of metrics available
Understand what they mean
Don’t use metrics as KPIs!
![Page 39: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/39.jpg)
Questions?
![Page 40: Code quailty metrics demystified](https://reader033.vdocuments.us/reader033/viewer/2022051300/58f061cb1a28ab00168b4601/html5/thumbnails/40.jpg)
Code Quailty Metrics Demystified@JeroenResoort @jdriven_nl