問題
SalesforceのISVパートナーであるCloudKicks Fitnessは、管理パッケージアプリケーションを開発しています。ユーザーはアプリケーションモジュールの1つであるBodyfatというApexクラスとcalculateBodyfat()メソッドを使用して体脂肪を計算できます。製品の所有者は、ISVのパッケージ名前空間の外部でカスタマイザーを開発するときに、アプリケーション利用者がこのメソッドにアクセスできるようにしたいと考えています。パッケージ名前空間の外部でcalculateBodyFatメソッドにアクセスできるようにするには、開発者はどの手段を取る必要がありますか。
- publicアクセス修飾子を使用してクラスとメソッドを宣言します。
- globalアクセス修飾子を使用してクラスとメソッドを宣言します。
- クラスをpublicとして宣言し、メソッドでglobalアクセス修飾子を使用します。
- クラスをpublicとして宣言し、メソッドでpublicアクセス修飾子を使用します。
正解
- publicアクセス修飾子を使用してクラスとメソッドを宣言します。
- globalアクセス修飾子を使用してクラスとメソッドを宣言します。
- クラスをpublicとして宣言し、メソッドでglobalアクセス修飾子を使用します。
- クラスをpublicとして宣言し、メソッドでpublicアクセス修飾子を使用します。
解説
以下に、Apexのアクセス修飾子について簡単にまとめます。
- private: これがデフォルトのアクセスレベルです。private修飾子がついたメソッドや変数は、それが定義されているクラス内からのみアクセス可能です。
- protected: protected修飾子がついたメソッドや変数は、そのクラスとそのクラスを継承するサブクラスからアクセス可能です。protectedは同じ名前空間内でのみ機能します。
- public: public修飾子がついたメソッドや変数は、同じアプリケーションの名前空間内で定義された他のすべてのクラスからアクセス可能です。名前空間のないパッケージでは、publicはデフォルトで@NamespaceAccessibleとして振る舞います。
- global: global修飾子がついたメソッドや変数は、任意のApexコードからアクセス可能です。これは、異なるパッケージやSalesforceの組織間で公開する場合に使用します。globalメソッドや変数を持つクラスもglobalである必要があります。
Salesforceでは、メソッドやクラスをできるだけ制限されたアクセスレベルで保持することを推奨しています。これにより、コードの疎結合が促進され、保守性が向上します。また、publicとglobalの違いは特に重要で、publicは名前空間内でのアクセスに限定されるのに対し、globalはアプリケーション間の依存関係を作成するため、慎重に使用する必要があります。
それぞれの選択肢の理由について説明します。
□ publicアクセス修飾子を使用してクラスとメソッドを宣言します。
これは不正解です。public
アクセス修飾子は、そのメソッドやクラスがパッケージの外部からアクセス可能であることを意味しません。同じ名前空間内、または無名名前空間内でのみアクセス可能です。
□ globalアクセス修飾子を使用してクラスとメソッドを宣言します。
これは正解です。global
アクセス修飾子をクラスとメソッドに使用すると、それらは名前空間に関係なく、パッケージ外部からでもアクセス可能になります。これは他のSalesforce組織でメソッドを利用するための適切なアクセスレベルです。
□ クラスをpublicとして宣言し、メソッドでglobalアクセス修飾子を使用します。
これは不正解です。クラスがpublic
である場合、そのクラスのglobal
メソッドは、パッケージの外部からアクセスできません。クラス自体もglobal
である必要があります。
□ クラスをpublicとして宣言し、メソッドでpublicアクセス修飾子を使用します。
これは不正解です。この宣言では、クラスもメソッドもパッケージの外部からはアクセスできません。パッケージの外部からアクセスするためには、クラスまたはメソッドにglobal
修飾子を使用する必要があります。
コメント