Comprehensive and Detailed Explanation From Exact Extract: When preventing the creation of records using business logic in an Apex trigger, it's crucial to do it in a before insert trigger context so the records are not committed to the database. The method should be called using trigger.new (case-sensitive) which references the list of new records being inserted. Reference: Triggers and Order of Execution Apex Trigger Context Variables
最新のコメント (最新のコメントはトップにあります。)
generativeAI - 2025-11-22
正解は **A** です。
### 正解の解説
**A. `trigger RequestTrigger on Request__c (before insert) { RequestLogic.validateRecords(Trigger.new); }`**
**B. `RequestLogic.validateRecords(trigger.new);`** * Apexは大文字と小文字を区別しないため、技術的には A と同じ動作をしますが、試験の選択肢として A(標準的な `Trigger` クラスの大文字表記)と並んでいる場合、コーディング規約的に正しい A が優先されます。(または、元の問題文で `Trigger.old` などの誤ったコンテキスト変数が使われているパターンの引っ掛けである可能性がありますが、提示されたコード上は A が最も適切です)。
最新のコメント (最新のコメントはトップにあります。)
正解は **A** です。
### 正解の解説
**A. `trigger RequestTrigger on Request__c (before insert) { RequestLogic.validateRecords(Trigger.new); }`**
この実装が正しい理由は、**「トリガーハンドラパターン」** と **「バリデーションの実行タイミング」** の2点に基づいています。
1. **実行タイミング (`before insert`):**
* レコードがデータベースに保存される「前」に検証を行い、作成を阻止する必要があります。
* `before insert` トリガー内で `addError()` メソッドを使用すると、そのレコードの保存処理はキャンセルされ、ユーザーにエラーが表示されます。これがバリデーションの標準的な実装場所です。
2. **ロジックの委譲 (Trigger Handler):**
* トリガー内には複雑なロジックを書かず、外部のクラス(ここでは `RequestLogic`)に処理を任せるのがベストプラクティスです。
* `RequestLogic.validateRecords(Trigger.new)` のように、挿入されようとしているレコードのリスト (`Trigger.new`) を引数として渡すことで、クラス側でループ処理と条件判定、エラーの付与 (`record.addError()`) を行います。
---
### 不正解の解説
**B. `RequestLogic.validateRecords(trigger.new);`**
* Apexは大文字と小文字を区別しないため、技術的には A と同じ動作をしますが、試験の選択肢として A(標準的な `Trigger` クラスの大文字表記)と並んでいる場合、コーディング規約的に正しい A が優先されます。(または、元の問題文で `Trigger.old` などの誤ったコンテキスト変数が使われているパターンの引っ掛けである可能性がありますが、提示されたコード上は A が最も適切です)。
**C. `if (RequestLogic.isValid(Request__c)) ...`**
* これは **構文エラー** です。
* `RequestLogic.isValid(Request__c)`: 引数に特定のレコード変数ではなく、オブジェクトの型 (`Request__c`) を渡そうとしています。
* `Request.addError(...)`: `Request` という変数が定義されていません。トリガー内で個別のレコードにエラーを追加するには、`Trigger.new` をループして各レコードインスタンスに対して `addError` を呼ぶ必要があります。
**D. `trigger ... (after insert)`**
* **タイミングが不適切:** `after insert` はレコードが保存された「後」に動くため、作成を阻止するバリデーションには不向...