Slide 1

Slide 1 text

Salesforce 大規模開発 で留意するトピック 集 Sato Ryo @ Team spirit inc.

Slide 2

Slide 2 text

自己紹介 Sato Ryo です。 仕事: チームスピリット で チームスピリット EX を開発しています。 バックエンド(業務処理の開発担当)です。 Salesforce歴 2 年くらいの初心者です。 趣味: ネコ、サバゲー、キャンプなどなど。

Slide 3

Slide 3 text

チーム スピリット とは? https://www.teamspirit.com/ja-jp/lp/ex/

Slide 4

Slide 4 text

内容 Salesforce の大規模開発で直面した問題や生産性を上げる為の トピックを紹介します。 – パッケージの分割を最初から行う – SFDX開発でのクラスの管理方法 – テストコードでSFオブジェクトは利用しない方が良い? – 20万件のワナ

Slide 5

Slide 5 text

パッケージ分 割を最初から 行う 理由 – Apex コードの文字数は6MB までの制限がある。 – パッケージのアップグレードに失敗する恐れがある。 – パッケージ の アップグレードインストール時にインス トール時のバックアップ領域が不足することがあり、 「 Dependent class is invalid and needs recompilation」など のエラーが発生する。 – こうなると時の運でインストールができるかできないか が決まる。 – 経験的に、3MBを超えたあたりからパッケージの分割を考え た方が良い。

Slide 6

Slide 6 text

こんな感じで小ネタを挟んでいきたいと 思います。 次はSFDX でリポジトリをすっきりさせる 小技です。

Slide 7

Slide 7 text

SFDX開発で のクラスの管 理方法 – Apexクラスが増えてくると、classes/ に Apex クラスが増えて いきません? ←ここが厚くなる

Slide 8

Slide 8 text

SFDX開発で のクラスの管 理方法 – 実はフォルダ分けして配置することができます。 – Java とは違い、Apex はフォルダの位置を変更しても問題なく 動作します。

Slide 9

Slide 9 text

次:テストコードの書き方

Slide 10

Slide 10 text

テストコード でSFオブジェ クトは利用し ない方が良 い? – テストコードでこのようなコードを書く例はありませんか? @isTest static void fooTest() { TestData__c data = new TestData__c(); data.value = 'test val 1’; insert data; String actual = getfoo(); System.assertEquals(data.value, actual); }

Slide 11

Slide 11 text

テストコード でSFオブジェ クトは利用し ない方が良 い? – SFのテストオブジェクトは他のテストと共用です。 – その為、前述のテストは並列実行時にエラーが発生すること があります。 – 並列実行は解除することができますが、直列実行となる為、 その分時間がかかります。 https://developer.salesforce.com/docs/atlas.ja- jp.apexcode.meta/apexcode/apex_testing_best_practices.htm

Slide 12

Slide 12 text

テストコード でSFオブジェ クトは利用し ない方が良 い? – isTest(isParallel=true)を利用するとそのテストクラスは並列実行 が有効になります。 – リポジトリパターンを利用してテスト時はMockのリポジトリを 利用するなど、SFオブジェクトに依存しないテストを作ること も大切です。 @isTest(isParallel=true) private class fooTest { @isTest static void fooTest() { MockedData data = new MockedData(); data.value = 'test val 1’; String actual = getfoo(); System.assertEquals(data.value, actual); } }

Slide 13

Slide 13 text

ラスト、本番中に発覚しやすいバグ です。

Slide 14

Slide 14 text

20万件のワナ Q. 以下のSOQL, 問題点が分かりますか? SELECT Id FROM Account WHERE Name != ''

Slide 15

Slide 15 text

20万件のワナ – 先ほどの SOQL、非セレクティブSOQLです。

Slide 16

Slide 16 text

20万件のワナ – 非セレクティブ SOQL(効率の悪いSOQL)であり、前述の SOQLは テーブルフルスキャンが発生する。 – フルスキャンの結果、スキャンが必要なレコードが20万件を 超えると System.QueryException が発生する。 – レコードの数が増えることによって発覚するバグで、本番環 境で発生しやすいバグと言える。

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

20万件のワナ – SOQL 実行計画 を確認して、フルスキャンになる物がないか 確認しよう。 やり方 1. Help > Preferences で Enable Query Plan を有効化 2. Query タブの Query Plan をクリック

Slide 19

Slide 19 text

20万件のワナ – 上級者編 Nullが入るとフルスキャンになる。 public List getAccountByIds(List accountIds){ return [SELECT Id FROM Account WHERE Id IN :accountIds]; }

Slide 20

Slide 20 text

ありがとうございました!