Salesforceが提供しているSalesforce DX向けのプラグインはいくつかあります。
先日コラムで紹介した「高機能データ移行ツール(SFDMU)」もそのひとつです。
【参考記事】高機能データ移行ツール(SFDMU)使ってみた!
今回はその中から「コード解析プラグイン(Salesforce Code Analyzer)」を使ってみました。
コード解析プラグイン「Salesforce Code Analyzer」とは
Salesforce Code Analyzerはクイックリファレンスで以下の通り解説されています。
ソースコードの静的解析を、複数の言語(Apexを含む)で、一貫したコマンドラインインターフェースとレポート出力で実現する統一ツールです。現在、PMDルールエンジン、PMD Copy Paste Detector、ESLint、およびRetireJSをサポートしています。今後、さらに多くのルールエンジンのサポートを追加する可能性があります。
Salesforce Code Analyzer Plug-inは、問題を特定した際に「ルール違反」を作成します。開発者はこの情報をフィードバックして、コードを修正します。
このプラグインをCI/CDソリューションに統合することで、ルールを強制し、高品質のコードを期待することができます。
要するに「ソースコードにまずそうなところがあれば検知してくれるよ」というものですね。SonarQubeとかCheckmarxとかに似たやつです。
Salesforce Code Analyzerを使ってみる
それではSalesforce Code Analyzerを実際に使ってみましょう。
Salesforce Code Analyzerの導入
Salesforce Code AnalyzerはSFDXのプラグインなので、以下のコマンドでインストールできます。
# Salesforce Code Analyzerをインストール
$ sfdx plugins:install @salesforce/sfdx-scanner
「Installing plugin @salesforce/sfdx-scanner… installed vx.xx.x」(xxはバージョン値)
こんなメッセージが出ていればOKです。
スキャン対象のコードを作る
コード分析なので、ひっかかりそうなコードを作成します。
public with sharing class KSCDSample {
public void sample01(Integer dataCount){
for(Integer i = 0; i < dataCount; i++){
Account acc = [SELECT Id, Name FROM Account][0];
}
for(Integer j = 0; j < dataCount; j++){
insert new Account(
Name = 'aaa'
);
}
}
}
Salesforceのガバナ制限をご存知の方が見れば一発でわかりますね、ヤバいコードです。
ループ処理の中でSOQLやDMLを発行すると大変なことになりかねません。
Salesforce Code Analyzerの実行
スキャン対象のコードを作成したので、実際にスキャンしてみましょう。
実行コマンドは以下のようになります。
$ sfdx scanner:run -t "force-app/main/default/classes/KSCDSample.cls" -f=html > ~/report.html
今回は結果をHTMLで吐き出させるようにしました。
実行結果
実際に出力された結果はこんな感じでした。
思ってたよりいっぱい違反箇所がありましたね…、紐解いてみましょう。
【Missing ApexDoc comment】
「ApexDocのコメントが見つかりません」と言われてます。
ApexDocはApexコードのドキュメント作成ツールのことで、これを使ったときに上手く出力できませんよということでしょうか。
【Avoid Soql queries(DML statements) inside loops】
「ループ内でのSOQLクエリ(DMLステートメント)の発行は避けてください」と言われてます。
これはわざと埋め込んだところですね。ちゃんと検出されているようです。
【Avoid operations in loops that may hit governor limits】
「ループ内でガバナに抵触する可能性のある操作は避けてください」と言われてます。
これもわざと埋め込んでいるところです。言ってることは殆ど同じな気はします。
【Validate CRUD permission before SOQL/DML operation or enforce user mode】
「SOQL/DML操作の前にCRUD権限を検証するか、ユーザモードを強制してください」と言われてます。
操作しようとしている項目等について、CRUD権限が適切であるかどうかの確認が必要らしいです。
こんな感じで確認するそうです。
// Make sure we can update the database before even trying
if (!Schema.sObjectType.Contact.fields.Status__c.isUpdateable()) {
return null;
}
【Variable ‘acc’ defined but not used】
「変数’acc’が定義されていますが、使われていません」と言われてます。
不必要な変数は定義しないようにしましょうということですね。
最後に
使ってみた感想ですが、結構ガチガチに見てくれるんだなという印象を受けました。
必ずしも全部対応する必要はないと思いますが、コード修正の参考にできるんじゃないかと思います。
最後に、弊社にはSalesforceのスペシャリストが多数在籍しております。
何かお困りごとがございましたら、下記ボタンからお気軽にご相談くださいませ。
お問い合わせはこちら