メトリクス閾値の静的解析をエディタ非依存で回す(Checkstyle / PMD / ESLint)

一言まとめ

IDE のコードインスペクションの本質は「メソッド長・複雑度・ネスト深さ・パラメータ数の閾値違反を検出すること」で、Java なら Checkstyle + PMD、TypeScript なら ESLint の max-* 系ルールで CLI から再現できる。正攻法は CI で回して PR に注釈し、エディタは LSP 診断で補助する二層構成。

作成 · 更新 · #design#static-analysis#checkstyle#pmd#eslint
目次 6 sections
  1. 01 中核ツール(Java)
  2. 02 二層構成(CI + LSP)
  3. 03 エディタごとの状況
  4. 04 TypeScript / JavaScript への応用
  5. 05 関連
  6. 06 更新履歴

調査時点: 2026-06。デフォルト閾値やエディタ拡張の成熟度はこの時点のもの。

中核ツール(Java)#

IDE インスペクションの「閾値チェック」は Checkstyle + PMD でほぼ再現できる。「閾値をデフォルトより小さくする」運用は、各ルールの max プロパティを締めることに対応する。

指標ツール / ルールデフォルト閾値
循環的複雑度Checkstyle CyclomaticComplexity / PMD CyclomaticComplexity10
認知的複雑度PMD CognitiveComplexity15
メソッド長Checkstyle MethodLength / PMD NcssCount150 行 / method 60
ネスト深さCheckstyle NestedIfDepth / PMD AvoidDeeplyNestedIfStmts1 / 3
パラメータ数Checkstyle ParameterNumber / PMD ExcessiveParameterList7 / 10
クラスサイズCheckstyle JavaNCSS(class 300 行) / PMD TooManyMethods(10)、TooManyFields(15)—
NPath 複雑度Checkstyle NPathComplexity / PMD NPathComplexity200

役割の違うツール。

  • SpotBugs: バイトコードを対象にバグパターン(null 参照・型誤用・脆弱性)を検出。メトリクス閾値は本来の用途ではないので PMD と併用する
  • error-prone: コンパイラプラグインとしてバグパターンを検出。メトリクスは対象外
  • ArchUnit: パッケージ依存・レイヤ境界を JUnit テストで検証。メソッド単位のサイズメトリクスには不向き
Terminal window
# PMD CLI
pmd check -d src/main/java -R rulesets/java/design.xml -f text
# Gradle 組み込みプラグイン
./gradlew pmdMain checkstyleMain

PMD は XML ルールセットで閾値を上書きし、build/reports/pmd/ に HTML を出す。

二層構成(CI + LSP)#

Checkstyle / PMD / SpotBugs はすべて CLI・Gradle / Maven プラグインとして動き、JVM があれば OS・エディタを問わず同じ解析ができる。IDE 組み込みの解析は IDE のバージョンと設定に依存するが、Gradle 経由なら CI とローカルを完全に一致させられる。

Layer 1 (CI / PR) : Gradle → PMD + Checkstyle + SpotBugs → GitHub Actions → PR 注釈
Layer 2 (エディタ) : LSP 診断 → JDTLS(型) + SonarLint(VSCode 公式 / Zed は非公式)

GitHub Actions の例(PMD 公式 Action)。

- uses: pmd/pmd-github-action@v2
with:
rulesets: 'rulesets/java/quickstart.xml,config/pmd/custom-rules.xml'
analyzeModifiedFilesOnly: true # PR の変更ファイルのみ
createGitHubAnnotations: true # PR に行コメント注釈

違反数は violations 出力で取れ、閾値超過でビルドを失敗させられる。SARIF を GitHub Code scanning に連携できる。Checkstyle も jwgmeligmeyling/checkstyle-github-action で Check Run 注釈になる。pre-commit でも実行できるが JVM 起動コストがかかる。

この構成の利点は、再現性(ローカルと CI が同一ルール・同一バージョン)、エディタ切替への耐性、PR 上でレビューと静的解析が一体化することの 3 点。

エディタごとの状況#

  • Zed: Java サポートは Eclipse JDTLS。補完・リファクタ・型診断は出るが、メトリクスのインスペクション相当はない。Zed 公式の IntelliJ 移行ガイド自身が「インスペクションは別ステップで実行するか、Checkstyle・PMD・SpotBugs などのスタンドアロンツールを使う」と書いている。SonarLint(SonarQube for IDE)は公式非対応で、コミュニティ拡張(sonarqube-zed-extension、zed-sonarlint)は未成熟
  • VSCode: Checkstyle for Java(shengchen.vscode-checkstyle)が編集中リアルタイム診断と Quick Fix を提供。SonarQube for IDE は Java 500 超のルールをリアルタイム診断し、Connected Mode で組織の SonarQube サーバの品質ゲートを同期できる。PMD 専用の成熟した拡張は確認できなかった

TypeScript / JavaScript への応用#

ESLint がメトリクス系を網羅する。

ESLint ルール相当する指標デフォルト締める目安
complexity循環的複雑度2010 程度
max-depthネスト深さ4
max-lines-per-functionメソッド長50
max-paramsパラメータ数3
max-statements関数内の文数10

Biome は complexity/noExcessiveCognitiveComplexity(既定 15)を持つが、ネスト深さなどは 2026-06 時点で未実装。閾値を細かく締めたいなら ESLint になる。Python では ruff の C901(mccabe)や PLR09xx(pylint の too-many-*)が同じ役割を持つ。

関連#

更新履歴#

  • 2026-06-19: 初版(ローカル調査ノート)
  • 2026-10-17: Wiki へ移植、概念ページとして再構成

出典

  1. https://pmd.github.io/pmd/pmd_rules_java_design.html
  2. https://checkstyle.sourceforge.io/checks/metrics/cyclomaticcomplexity.html
  3. https://checkstyle.sourceforge.io/checks/sizes/methodlength.html
  4. https://github.com/pmd/pmd-github-action
  5. https://zed.dev/docs/migrate/intellij
  6. https://eslint.org/docs/latest/rules/complexity
  7. https://biomejs.dev/linter/rules/no-excessive-cognitive-complexity/
  8. https://github.com/binkley/modern-java-practices/wiki/Use-static-analysis

同じトピック — ソフトウェア設計