設問
Universal Containers は、カスタム Apex コードに厳密なソフトウェアアーキテクチャを実装しました。要件の 1 つは、すべての SOQL クエリが再利用可能なクラス内に含まれていることです。Apex トランザクションのコンテキストに応じて、クエリは「共有あり」または「共有なし」のいずれかで実行できる必要があります。アーキテクトがこれらの要件を満たすことができる 2 つの方法はどれですか?(2つ選択)
選択肢
A. 再利用可能な SOQLQueries クラスを作成します。SOQLQueriesクラスで「With」または「Without Sharing」を指定しないでください。
B. 再利用可能な SOQLQueries クラスを作成します。SOQLQueriesクラスで「With」または「Without Sharing」を指定せず、runAs()メソッドを使用してコンテキストを動的に設定します。
C. 再利用可能な SOQLQueriesクラスを作成します。ユーザーコンテキストを必要とするメソッドには「共有あり」を指定し、システムコンテキストを必要とするメソッドには「共有なし」を指定します。
D. SystemSOQLQueries クラスと UserSOQLQueries クラスを作成します。UserSOQLQueries クラスに「With Sharing」キーワードを設定し、SystemSOQLQueries クラスに「Without Sharing」キーワードを設定します。
解答
C. 再利用可能なSOQLQueriesクラスでメソッド単位に共有あり/なしを制御する
D. SystemSOQLQueriesクラスとUserSOQLQueriesクラスを分けて、それぞれに共有あり/なしを指定する
解説
A. 再利用可能なSOQLQueriesクラスを作成します。クラスで「with」または「without sharing」を指定しない。
不正解です。クラスで共有指定を省略すると、呼び出し元クラスの共有コンテキストに依存する形になります。このため、意図しない共有設定でSOQLが実行されるリスクが高まり、セキュリティ事故やデータ漏洩につながる恐れがあります。特に、管理者権限で実行されるバッチクラスなどから呼び出すと、ユーザーの権限を無視してすべてのデータを取得してしまうリスクが顕在化します。エンタープライズ開発では、常に共有コンテキストを明示的に設計することが重要です。
B. 再利用可能なSOQLQueriesクラスで「with」または「without sharing」を指定せず、runAs()メソッドを使用してコンテキストを動的に設定します。
不正解です。runAs()は、テストクラス(@isTestが付いたクラス)でのみ使用可能な特殊メソッドであり、本番環境では使えません。runAs()を本番コードで使う設計をしてしまうと、デプロイ時にコンパイルエラーとなり、実行できません。この設問では本番コード設計のベストプラクティスを問うているため、B案は選択できません。動的なコンテキスト切替は「runAs()」ではなく、設計段階で共有コンテキストを適切に区別することによって実現すべきです。
C. 再利用可能なSOQLQueriesクラスを作成し、メソッド単位で共有あり/なしを指定する。
正解です。クラス自体は共有コンテキストを中立にし、必要なメソッドだけ「with sharing」または「without sharing」を付与することで、クエリの実行コンテキストを柔軟に切り替えることができます。たとえば、通常のユーザー権限でレコードを取得する場合はwith sharingメソッドを呼び、管理者権限で強制取得する場合はwithout sharingメソッドを呼ぶなど、状況に応じた適切なセキュリティ制御が可能です。ただし、メソッドごとに共有ポリシーを分けると設計の複雑さが増すため、メソッド命名規則(例:getAccountWithSharing(), getAccountWithoutSharing())を工夫する必要があります。
D. SystemSOQLQueriesクラスとUserSOQLQueriesクラスを作成し、それぞれに共有あり/なしを設定する。
正解です。「System(without sharing)」と「User(with sharing)」でクラスを明確に分ける設計は、クエリの実行コンテキストをコード構成で明示できるため非常に安全かつ堅牢です。この方法は、特に大規模プロジェクトやISVパッケージ開発(マネージドパッケージ)において好まれます。
たとえば、SystemSOQLQueriesクラスでは管理者として内部統合用データを取得し、UserSOQLQueriesクラスではユーザー権限で閲覧できる範囲だけを取得するなど、クラスレベルで明確に責任範囲を分離できます。ただしクラス数が増えるため、命名ルールとドキュメント整備が重要です。
第106問
こちらをクリック