Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Salesforce 大規模開発で留意するトピック集
Search
CLB
April 19, 2021
1.3k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Salesforce 大規模開発で留意するトピック集
【オンライン開催】Salesforce Developers Meetup #25 でのスライド資料です。
CLB
April 19, 2021
More Decks by CLB
See All by CLB
Salesforce Functions (Java)で実装はどう変わるか
altyjp
0
550
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
4k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
360
KATA
mclloyd
PRO
35
16k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.2k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
830
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Technical Leadership for Architectural Decision Making
baasie
3
600
We Have a Design System, Now What?
morganepeng
55
8.4k
Music & Morning Musume
bryan
48
7.4k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.1k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Transcript
Salesforce 大規模開発 で留意するトピック 集 Sato Ryo @ Team spirit inc.
自己紹介 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オブジェ クトは利用し ない方が良 い? テストコードでこのようなコードを書く例はありませんか? @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); }
テストコード で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 { @isTest static 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<Account> getAccountByIds(List<Id> accountIds){ return [SELECT
Id FROM Account WHERE Id IN :accountIds]; }
ありがとうございました!