パステル色な日々

気ままに綴るブログ

Apexコードを書くのに必要な知識は何

Apex

Apexは強く型付けされたオブジェクト指向プログラミング言語です。構文はJavaライクであり、Force.com プラットフォームサーバで処理を描く時に使用します。Apex を使うと、ボタンクリック、関連レコードの更新などのほとんどのシステムイベントにビジネスロジックを追加できます。

Lightning ComponentがクライアントサイドでApexがサーバサイドと言う理解でも良いと思います。 Lightning Componentからのリクエストをサーバサイドで処理できるようになります。 Lightning Componentから $A キーワードを利用することでエンドポイントの呼び出しができるので調べてみてください。

SOQL (Salesforce Object Query Language)

Force.com プラットフォームのデータベース操作に利用するクエリ言語です。SQLのような構文で書く事ができますが両者は違うものです。例えばSOQLでは SELECT * が出来ません。Salesforceはマルチテナント環境にありますが、マルチテナント環境では全員が「データベースを共有」しているようなものであるため、 * などのワイルドカード文字を使用すると問題が発生するからです。

ガバナ制限

これがApexコード格上での曲者。実はApexにはマルチテナント環境ゆえの制限事項が幾つかあります。

実行ガバナと制限 - Salesforce Developers

実行プロセスが共有リソースを独占しないように制限しており、超えた場合は 処理できない実行時例外 がthrowされるようになっています。何度も updateinsert 命令を発行したりすると簡単にSOQLの制限に引っかかってしまいます。 他にもforループで上記クエリを発行するのは絶対にやめましょう。

Apex開発で押さえておきたいポイント - Qiita

SOQLの制限で困ったときには実行したいトランザクションがどこからどこまでなのか把握してクエリを削減することに勤めましょう。トランザクションが分割可能であれば分割しましょう。

Apexトリガ

Salesforce のレコードに対するイベント (挿入、更新、削除) の前または後に処理できるApexプログラムです。 やたら操作の多いSalesforce上の仕事を自動化する際に利用できます。 これもガバナ制限には注意が必要です。特にトリガが原因で他のトリガを誘発してしまうことがあります。 例えば Opportunity のトリガは OpportunityLineItem の変更にも反応してしまうので、 OpportunityLineItem のトリガを作る際には Opportunity のトリガ内容にも注意しなくてはいけません。 先に書いてしまいましたがトリガは一つのsObject(Opportunity...etc.)に関連付けます。

Apex開発で押さえておきたいポイント - Qiita

Salesforce Developers

Apex一括処理

どうしてもガバナ制限を超えるような大規模ジョブを行う必要がある時にはApex一括処理を利用しましょう。

Apex 一括処理の内部的なしくみは次のとおりです。Apex 一括処理を使用して 100 万件のレコードを処理するとします。一括処理クラスの実行ロジックは、処理するレコードのバッチごとに 1 回コールされます。一括処理クラスを呼び出すたびに、ジョブは Apex ジョブキューに置かれ、別個のトランザクションとして実行されます。この機能には 2 つの大きな利点があります。

  • トランザクションは新しいガバナ制限のセットで開始されるため、コードをガバナ実行制限内に抑えやすくなります。
  • いずれかのバッチが処理に失敗しても、他のすべての正常に処理された一括処理トランザクションロールバックされません。

Apex 一括処理の使用 単元 | Salesforce Trailhead

単体テスト

Salesforceのリリース時には変更セットという機能を使ってリリースするのですが、この際には必ず単体テストが実行されます。 失敗すればリリースできないですし、 コードカバレッジ も75%なければエラー扱いとなりリリースできません。 なので単体テストは必ず書きましょう。テストしやすいように疎結合なコードを書くことももちろん大切ですよ。

まとめ

かなり簡素に大切なことだけ書きました。 逆にもっと細かいけどメモとして残していた知識がいくつかあるのでそちらは別途記事にします。