Apex-trigger-design-pattern
Apex-トリガーデザインパターン
設計パターンは、コードをより効率的にし、ガバナーの制限に達しないようにするために使用されます。 多くの場合、開発者はオブジェクトのインスタンス化を繰り返す非効率的なコードを作成できます。 これにより、非効率でパフォーマンスの低いコードが発生し、ガバナーの制限に違反する可能性があります。 これは、トリガーで最も一般的に発生します。トリガーは一連のレコードに対して操作できるためです。
この章では、いくつかの重要な設計パターン戦略について説明します。
バルクトリガーのデザインパターン
実際のビジネスケースでは、一度に数千のレコードを処理する必要がある場合があります。 トリガーがそのような状況を処理するように設計されていない場合、レコードの処理中に失敗する可能性があります。 トリガーを実装する際に従うべきベストプラクティスがいくつかあります。 デフォルトでは、すべてのトリガーは一括トリガーであり、一度に複数のレコードを処理できます。 一度に複数のレコードを処理することを常に計画する必要があります。
多数のレコードを処理する必要があり、以下に示すようにトリガーを記述したビジネスケースを考えます。 これは、顧客ステータスが非アクティブからアクティブに変更されたときに請求書レコードを挿入するために取った同じ例です。
ループブロック用にDMLステートメントが書き込まれていることがわかります。これは、少数のレコードのみを処理する場合に機能しますが、数百のレコードを処理する場合は、トランザクションごとのDMLステートメントの制限である governor limit 。 ガバナー制限の詳細については、後続の章で説明します。
これを回避するには、一度に複数のレコードを処理するためにトリガーを効率的にする必要があります。
次の例は、同じことを理解するのに役立ちます-
このトリガーはリストを操作し、リストには変更が必要なすべてのレコードがあるため、1つのDMLステートメントのみを起動します。
この方法により、DMLステートメントガバナーの制限を回避できます。
トリガーヘルパークラス
トリガーでコード全体を書くことも良い習慣ではありません。 したがって、以下に示すように、Apexクラスを呼び出して、トリガーからApexクラスに処理を委任する必要があります。 トリガーヘルパークラスは、トリガーのすべての処理を行うクラスです。
請求書レコードの作成例をもう一度考えてみましょう。
ヘルパークラス
これでは、すべての処理がヘルパークラスに委任され、新しい機能が必要な場合は、トリガーを変更せずに単純にコードをヘルパークラスに追加できます。
各sObjectでの単一のトリガー
オブジェクトごとに常に単一のトリガーを作成します。 同じオブジェクトで複数のトリガーが発生すると、ガバナーの制限に達すると競合とエラーが発生する可能性があります。
コンテキスト変数を使用して、要件に応じてヘルパークラスからさまざまなメソッドを呼び出すことができます。 前の例を考えてみましょう。 createInvoiceメソッドは、レコードが更新され、複数のイベントが発生したときにのみ呼び出されると仮定します。 その後、次のように実行を制御できます-