コードレビューは「時間の浪費」である:IntelliJ Platform SDKで規約を“コード”に昇華させる技術
プロジェクトのテックリードとして日々レビューを行っていると、ふと気付くはずです。「また同じような命名規則の指摘をしているな」と。人間が人間に対して静的解析を行うのは、コストパフォーマンスが最悪なタスクです。
コードレビューは、ビジネスロジックやアーキテクチャの妥当性を議論するための場所です。インデントのズレや、特定の禁止APIの使用確認といった「機械的に判定可能なルール」は、IDEがリアルタイムで強制すべきです。
本稿では、IntelliJ IDEAを単なる「高機能エディタ」から「プロジェクト専用のコンパイラ」へと進化させる、カスタムインスペクションの開発手法を伝授します。
—
1. なぜ「設定」ではなく「SDKによる強制」なのか
`.editorconfig` や標準の `Checkstyle` でカバーできる範囲には限界があります。例えば、「ドメイン層のサービスから特定のレガシーなユーティリティクラスを呼び出してはならない」といった、コンテキストに依存したルールは既存ツールでは検知できません。
IntelliJ Platform SDKを用いたカスタムインスペクションを作成すると、以下のメリットが得られます。
- 即時フィードバック: コンパイルを待つ必要はありません。エディタ上で波線が引かれ、クイックフィックス(Alt+Enter)で即座に修正されます。
- 認知負荷の激減: レビュアーは「ルール違反」を探す必要がなくなり、レビュイーは指摘を受けてから修正する時間をゼロにできます。
—
2. カスタムインスペクション実装の核心(PSIの理解)
IntelliJの内部では、ソースコードは「PSI (Program Structure Interface)」と呼ばれる木構造で管理されています。カスタムルール作成とは、このPSIツリーを走査し、特定のノード(禁止されたメソッド呼び出しなど)を発見した際にエラーを投げる処理を書くことに他なりません。
実装の骨子(Java例)
`LocalInspectionTool`を継承し、`PsiElementVisitor`で特定の要素をトラップします。
public class ForbiddenApiUsageInspection extends LocalInspectionTool {
@Override
public @NotNull PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) {
return new JavaElementVisitor() {
@Override
public void visitMethodCallExpression(PsiMethodCallExpression expression) {
// メソッド呼び出しの参照を解析
PsiReferenceExpression methodExpression = expression.getMethodExpression();
String methodName = methodExpression.getReferenceName();
// 特定の禁止メソッド(例: “executeLegacyTask”)を検知
if (“executeLegacyTask”.equals(methodName)) {
// エラーとしてマークし、クイックフィックスを提示
holder.registerProblem(methodExpression, “このレガシーAPIの使用は禁止されています。”, ProblemHighlightType.ERROR);
}
}
};
}
}
このコードをプラグインとしてビルドし、チーム全員に配布するだけで、IDEが専属のコード監査官に変貌します。
—
3. 現場で「即効」効く最強のIDE設定共有化戦略
カスタムプラグインを作らずとも、プロジェクト標準化を加速させるテクニックがあります。
`.idea`ディレクトリの戦略的コミット
`workspace.xml`(個人のローカル状態)は `.gitignore` し、`.idea/inspectionProfiles/` 配下のみをGit管理下に置くのが鉄則です。これにより、チーム全体で同じ静的解析閾値を強制できます。
推奨する `Project_Default.xml` の構成例:
—
4. 開発速度を極限まで引き上げる「隠しコマンド」
優秀なエンジニアほど、マウスを触りません。以下の操作を筋肉に焼き付けてください。
- `Shift` x 2 (Search Everywhere): 設定、クラス、ファイル、IDE機能のすべてを統合検索。これを極めるとメニューバーは不要になります。
- `Alt` + `Enter` (Show Context Actions): これこそがIntelliJの真髄です。警告が出たら即座に叩き、提案を適用する。思考を止めないための唯一の術です。
- `Ctrl` + `Alt` + `Shift` + `T` (Refactor This): リファクタリングメニューの呼び出し。`Rename` (Shift+F6) は有名ですが、メソッドの抽出や引数の変更はここから行うのが最も安全です。
—
5. 絶対に入れるべき「生産性ブースト」プラグイン
市場には無数のプラグインがありますが、以下の3つは「必須」です。
1. Key Promoter X: マウスで操作した際、「今の操作、ショートカットでこうできますよ」と通知してくれます。操作の最適化を自動学習できる最強の教育ツールです。
2. SonarLint: ローカルでリアルタイムにSonarQubeの解析ルールを適用します。カスタムインスペクションと併用することで、脆弱性と規約違反を同時に封じ込めます。
3. String Manipulation: 文字列の変換(キャメルケース⇔スネークケース、エンコード/デコード)を爆速化します。地味ですが、一日の操作回数で見ると数分単位の短縮になります。
—
テックリードからの提言
ツールは「ただ入れる」だけでは意味がありません。
「なぜその設定が必要なのか」「そのルールがチームにどのような利益(レビューコストの削減、バグの未然防止)をもたらすのか」をチームメンバーと議論し、ドキュメント化し、IDEを通じて強制力を持たせる。
「環境を整えること」自体が、最大のエンジニアリングです。
まずは今日、既存の `inspectionProfiles` を見直し、チームの不満の種となっている規約を一つ、IDEの設定に落とし込んでみてください。それが、あなたのチームが「世界最高峰のチーム」へ進化する第一歩です。