0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Salesforce】Apexトリガーのベストプラクティスについて

Last updated at Posted at 2025-12-30

Udemyの現場で役に立つ Salesforceの設計・実装テクニック!
を視聴し、Apexトリガーのベストプラクティスについて学びました。
講座内容をベースにしつつ、私なりの考えを加えて内容を整理します。

1."Apexトリガー"のサンプルコード (例:商談オブジェクト)

trigger OpportunityTrigger on Opportunity (before insert, before update, before delete, after insert, after update, after delete) {
    
	// カスタムメタデータからOpportunityトリガーを無効化する
    if(TriggerSwitch__mdt.getInstance('Opportunity').DisablingTrigger__c) {
        return;
    }
    
    switch on Trigger.operationType {
        when BEFORE_INSERT {
			// 承認関連処理
			OpportunityTriggerHandlerForApproval.onBeforeInsert(Trigger.new);
            // 売上関連の計算
            OpportunityTriggerHandlerForRevenue.onBeforeInsert(Trigger.new);
        }
        when BEFORE_UPDATE {
			// 承認関連処理
			OpportunityTriggerHandlerForApproval.onBeforeUpdate(Trigger.old, Trigger.oldMap);
            // 売上関連の計算
            OpportunityTriggerHandlerForRevenue.onBeforeUpdate(Trigger.old, Trigger.oldMap);
            // フォルダ生成
            OpportunityTriggerHandlerForFolder.onBeforeUpdate(Trigger.old, Trigger.oldMap);
        }
        when BEFORE_DELETE {
			// フォルダ削除
            OpportunityTriggerHandlerForFolder.onBeforeDelete(Trigger.old);
        }
        when AFTER_INSERT {
            // 承認関連処理
            OpportunityTriggerHandlerForApproval.onAfterInsert(Trigger.new, Trigger.newMap);
        }
        when AFTER_UPDATE {
            // 承認関連処理
            OpportunityTriggerHandlerForApproval.onAfterUpdate(Trigger.old, Trigger.new, Trigger.newMap);
        }
        when AFTER_DELETE {
			// フォルダ削除
            OpportunityTriggerHandlerForFolder.onAfterDelete(Trigger.old, Trigger.oldMap);
        }
    }
}

2.コードの解説

サンプルコードの実装において、特に意識しているポイントを解説します。

①Switch文で処理を分岐する
トリガー内の処理分岐には、if文ではなくswitch文を使用します。
イベントごとに処理内容が明確になり、後からコードを見返した際にも理解しやすくなります。

②トリガーハンドラーのメソッドを static にして呼び出す
トリガーハンドラーのメソッドを static メソッドとして定義します。
インスタンス化せずに呼び出せるため、トリガーからの呼び出しがシンプルになり、可読性が向上します。

③トリガーハンドラーを機能ごとに複数作成してもよい
受講前は、トリガーハンドラーを一つだけ作成し、機能ごとにApexクラスを分ける構成にしていました。トリガーに対してトリガーハンドラーを複数作成してはいけないと言う固定観念がありました。
しかし、機能単位でトリガーハンドラーを作成したほうが、共同開発(並行開発)に向いていることが分かりました。
各機能が独立したトリガーハンドラーとして分離されているため、複数人で並行して開発・修正を行っても、コードの競合や影響範囲を最小限に抑えることができます。
また、「修正・テストの影響範囲を限定しやすい」「可読性・保守性が向上する」といった点も期待できます。
トリガーハンドラーの命名規則は、以下のように統一します。
・OpportunityTriggerHandlerFor◯◯◯

④トリガーを無効化するカスタムメタデータを用意する
【Salesforce】Apexトリガのベストプラクティス&サンプルテンプレート
を参考にしています。
レコードトリガーフローのように、UI上でトリガーを無効化できる仕組みは非常に便利です。
大量データをSalesforceに取り込む時や障害対応などの非常時に活躍します。
image.png

3.まとめ

本記事が、Apexトリガー設計のベストプラクティスを考えるうえで、開発の助けになれば幸いです。

記事の参考にしたUdemy講座1は、元Salesforce社員で認定テクニカルアーキテクトの方が講師を務めています。
講座時間は約40時間とボリュームがあり、標準機能のTipsからプログラミングの応用技術まで幅広く学ぶことができました。
要件定義の心得といった基本的な内容から、
承認プロセスの作り込み(一括承認ボタン、承認履歴リスト、添付ファイル参照リストの実装)
といった実務で役立つ技術的な内容がデモを活用して丁寧に解説されているので、
幅広いレベルのSalesforceエンジニアにおすすめします。

現在、以下のUdemy講座を作成中とのことでした。
・Salesforce導入プロジェクト必見!Salesforceの制限と回避テクニック
・試験でも現場でも役に立つ!Salesforceシステムアーキテクト講座
・試験でも現場でも役に立つ!Salesforceアプリケーションアーキテクト講座
いずれも実務に直結する内容であり、講座の公開が待ち遠しいです。

  1. 現場で役に立つ Salesforceの設計・実装テクニック!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?