diff --git a/docs/_data/sidebars/pmd_sidebar.yml b/docs/_data/sidebars/pmd_sidebar.yml index ec27173726..9587ef1247 100644 --- a/docs/_data/sidebars/pmd_sidebar.yml +++ b/docs/_data/sidebars/pmd_sidebar.yml @@ -135,6 +135,12 @@ entries: - title: Writing XPath Rules url: /pmd_devdocs_writing_xpath_rules.html output: web, pdf + - title: Using code metrics in custom rules + url: /pmd_devdocs_metrics_howto.html + output: web, pdf + - title: Index of code metrics + url: /pmd_devdocs_metrics_index.html + output: web, pdf - title: Making Rulesets url: /pmd_devdocs_making_rulesets.html output: web, pdf diff --git a/docs/pages/pmd/devdocs/metrics_howto.md b/docs/pages/pmd/devdocs/metrics_howto.md new file mode 100644 index 0000000000..9eb3294a0b --- /dev/null +++ b/docs/pages/pmd/devdocs/metrics_howto.md @@ -0,0 +1,16 @@ +--- +title: Using code metrics in custom rules +tags: [customizing] +summary: "PMD was recently enhanced with the ability to compute code metrics on Java code (the so-called Metrics +Framework). This framework provides developers with a straightforward interface to use code metrics in their rules, and +to extend the framework with their own custom metrics." +last_updated: July 20, 2017 +sidebar: pmd_sidebar +permalink: pmd_devdocs_metrics_howto.html +folder: pmd/devdocs +--- +# Using code metrics in custom rules + +## Using the metrics framework + +## Writing custom metrics \ No newline at end of file diff --git a/docs/pages/pmd/devdocs/metrics_index.md b/docs/pages/pmd/devdocs/metrics_index.md new file mode 100644 index 0000000000..4f558f2a63 --- /dev/null +++ b/docs/pages/pmd/devdocs/metrics_index.md @@ -0,0 +1,111 @@ +--- +title: Index of code metrics +tags: [customizing] +summary: "Index of the code metrics available out of the box to Java rule developers." +last_updated: July 20, 2017 +sidebar: pmd_sidebar +permalink: pmd_devdocs_metrics_index.html +folder: pmd/devdocs +toc: + minimumHeaders: 8 +--- +# Index of code metrics + +## Access to Foreign Data (ATFD) + +*Operation metric, class metric.* + +### Description + + +## Cyclomatic Complexity (CYCLO) + +*Operation metric.* Can be calculated on any non-abstract method. + +### Description + +Number of independent paths through a block of code \[[Lanza05](#Lanza05)\]. +Formally, given that the control flow graph of the block has n vertices, e edges and p connected components, the +Cyclomatic complexity of the block is given by `CYCLO = e - n + 2p` \[[McCabe76](#McCabe76)\]. In practice it can be +calculated by counting control flow statements following the standard rules given below. + +The standard version of the metric complies with McCabe's original definition: + +* Methods have a base complexity of 1. +* +1 for every control flow statement (`if`, `case`, `catch`, `throw`, `do`, `while`, `for`, `break`, `continue`) and +conditional expression (`?:`) \[[Sonarqube](#Sonarqube)\]. Notice switch cases count as one, but not the switch itself: the point is that + a switch should have the same complexity value as the equivalent series of `if` statements. +* `else`, `finally` and `default` don't count; +* +1 for every boolean operator (`&&`, `||`) in the guard condition of a control flow statement. That's because +Java has short-circuit evaluation semantics for boolean operators, which makes every boolean operator kind of a +control flow statement in itself. + +### Versions + +* Version `CycloVersion#IGNORE_BOOLEAN_PATHS`: Boolean operators are not counted, nor are empty + fall-through cases in `switch` statements. You can use this version to get results + similar to those of the old `StdCyclomaticComplexityRule`, which is to be replaced. + + +## Lines of Code (LoC) + +*Operation metric, class metric.* Can be calculated on any of those nodes. + +### Description + +Simply counts the number of lines of code the operation or class takes up in the source. This metric doesn't discount + comments or blank lines. + + +## Non-commenting source statements (NCSS) + +*Operation metric, class metric.* Can be calculated on any of those nodes. + +### Description + +Number of statements in a class or operation. That's roughly equivalent to counting the number of semicolons and +opening braces in the program. Comments and blank lines are ignored, and statements spread on multiple lines count as + only one (e.g. `int\n a;` counts a single statement). + +The standard version of the metric is based off JavaNCSS's version \[[JavaNcss](#JavaNcss)\]: + +* +1 for any of the following statements: `if`, `else`, `while`, `do`, `for`, `switch`, `break`, `continue`, `return`, +`throw`, `synchronized`, `catch`, `finally`. +* +1 for each assignment, variable declaration (except `for` loop initializers) or statement expression. We count +variables declared on the same line (e.g. `int a, b, c;`) as a single statement. +* Contrary to Sonarqube, but as JavaNCSS, we count type declarations (class, interface, enum, annotation), +and method and field declarations \[[Sonarqube](#Sonarqube)\]. +* Contrary to JavaNCSS, but as Sonarqube, we do not count package declaration and import declarations as statements. +This makes it easier to compare nested classes to outer classes. Besides, it makes for class metric results that +actually represent the size of the class and not of the file. If you don't like that behaviour, use the `JAVANCSS` +version. + + +### Versions + +* Version `NcssVersion#JAVANCSS`: Import and package statements are counted as well. This version fully complies with + JavaNCSS. + + +## Weighted Method Count (WMC) + +*Class metric.* Can be computed on classes and enums + +### Description + +Sum of the statistical complexity of the operations in the class. We use [CYCLO](#cyclomatic-complexity-cyclo) to +quantify the complexity of an operation \[[Lanza05](#Lanza05)\]. + +### Versions + +WMC uses the same versions as CYCLO, which have the effect of summing that version of CYCLO to calculate the metric. + +# References + +Lanza05: Lanza, Marinescu; Object-Oriented Metrics in Practice, 2005. + +McCabe76: McCabe, A Complexity Measure, in Proceedings of the 2nd ICSE (1976). + +Sonarqube: [Sonarqube online documentation.](https://docs.sonarqube.org/display/SONAR/Metric+Definitions) + +JavaNcss: [JavaNCSS online documentation.](http://www.kclee.de/clemens/java/javancss/) \ No newline at end of file