【オンライン開催】Salesforce Developers Meetup #25 でのスライド資料です。
Salesforce 大規模開発で留意するトピック集Sato Ryo @ Team spirit inc.
View Slide
自己紹介Sato Ryo です。仕事:チームスピリット で チームスピリット EX を開発しています。バックエンド(業務処理の開発担当)です。Salesforce歴 2 年くらいの初心者です。趣味:ネコ、サバゲー、キャンプなどなど。
チームスピリットとは?https://www.teamspirit.com/ja-jp/lp/ex/
内容Salesforce の大規模開発で直面した問題や生産性を上げる為のトピックを紹介します。 パッケージの分割を最初から行う SFDX開発でのクラスの管理方法 テストコードでSFオブジェクトは利用しない方が良い? 20万件のワナ
パッケージ分割を最初から行う理由 Apex コードの文字数は6MB までの制限がある。 パッケージのアップグレードに失敗する恐れがある。 パッケージ の アップグレードインストール時にインストール時のバックアップ領域が不足することがあり、「 Dependent class is invalid and needs recompilation」などのエラーが発生する。 こうなると時の運でインストールができるかできないかが決まる。 経験的に、3MBを超えたあたりからパッケージの分割を考えた方が良い。
こんな感じで小ネタを挟んでいきたいと思います。次はSFDX でリポジトリをすっきりさせる小技です。
SFDX開発でのクラスの管理方法 Apexクラスが増えてくると、classes/ に Apex クラスが増えていきません?←ここが厚くなる
SFDX開発でのクラスの管理方法 実はフォルダ分けして配置することができます。 Java とは違い、Apex はフォルダの位置を変更しても問題なく動作します。
次:テストコードの書き方
テストコードでSFオブジェクトは利用しない方が良い? テストコードでこのようなコードを書く例はありませんか?@isTeststatic void fooTest() {TestData__c data = new TestData__c();data.value = 'test val 1’;insert data;String actual = getfoo();System.assertEquals(data.value, actual);}
テストコードでSFオブジェクトは利用しない方が良い? SFのテストオブジェクトは他のテストと共用です。 その為、前述のテストは並列実行時にエラーが発生することがあります。 並列実行は解除することができますが、直列実行となる為、その分時間がかかります。https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_testing_best_practices.htm
テストコードでSFオブジェクトは利用しない方が良い? isTest(isParallel=true)を利用するとそのテストクラスは並列実行が有効になります。 リポジトリパターンを利用してテスト時はMockのリポジトリを利用するなど、SFオブジェクトに依存しないテストを作ることも大切です。@isTest(isParallel=true)private class fooTest {@isTeststatic void fooTest() {MockedData data = new MockedData();data.value = 'test val 1’;String actual = getfoo();System.assertEquals(data.value, actual);}}
ラスト、本番中に発覚しやすいバグです。
20万件のワナQ. 以下のSOQL, 問題点が分かりますか?SELECT Id FROM Account WHERE Name != ''
20万件のワナ 先ほどの SOQL、非セレクティブSOQLです。
20万件のワナ 非セレクティブ SOQL(効率の悪いSOQL)であり、前述のSOQLは テーブルフルスキャンが発生する。 フルスキャンの結果、スキャンが必要なレコードが20万件を超えると System.QueryException が発生する。 レコードの数が増えることによって発覚するバグで、本番環境で発生しやすいバグと言える。
20万件のワナセレクティブSOQLの条件(公式ドキュメントから抜粋) セレクティブ SOQL クエリ条件クエリ検索条件の 1 つがインデックス付き項目にあり、そのクエリ検索条件によって結果となる行数がシステム定義のしきい値より少なくなる場合、そのクエリはセレクティブです。SOQL クエリのパフォーマンスは、WHERE 句に使用される 2 つ以上の検索条件がその条件を満たす場合に改善されます。 選択度しきい値は、初めの 100 万件のレコードの 10%、それ以降のレコードの 5% 未満の、最大 333,333 件です。インデックス付き標準項目であるクエリ検索条件がある場合など一部の状況では、しきい値が高くなる場合があります。また、選択度しきい値は変化します。https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/langCon_apex_SOQL_VLSQ.htm
20万件のワナ SOQL 実行計画 を確認して、フルスキャンになる物がないか確認しよう。やり方1. Help > Preferences で Enable Query Plan を有効化2. Query タブの Query Plan をクリック
20万件のワナ 上級者編 Nullが入るとフルスキャンになる。public List getAccountByIds(List accountIds){return [SELECT Id FROM Account WHERE Id IN :accountIds];}
ありがとうございました!