【Salesforce】【資格】デベロッパー勉強メモ：プロセスの自動化とロジック②

デベロッパー試験勉強時にまとめたメモ書きです。内容が間違っていたら優しくご指摘ください。
他投稿は[デベロッパー試験に関する記事](#デベロッパー試験に関する記事)からどうぞ。

**あくまでも個人のメモ書きなので信用しすぎてはいけません。**
[参考](#参考)にSalesforce公式ページを載せていますので、最新かつ正しい情報をご確認ください。

# データ型
・プリミティブデータ型
　　Blob
　　Boolean
　　Date
　　Datetime
　　Decimal
　　Double
　　ID
　　Integer
　　Long
　　String
　　Time
　　Object 　　※すべてのApexデータ型がObjectから継承される
・sObject：標準オブジェクト、カスタムオブジェクトなど
・コレクション：List、Set、Map
・列挙型：enum
・null 

# トリガコンテキスト変数
　isExecuting　Apexコードの現在のコンテキストがトリガである場合、trueを返す
　isInsert　挿入　　
　isUpdate　更新
　isDelete　削除
　isUndelete　ごみ箱から復元された後
　isBefore　レコードが保存される前
　isAfter　すべてのレコードが保存された後
　new　新しいバージョンのレコードのリストを返す
　newMap　新しいバージョンのレコードとIDのMapを返す
　old　古いバージョンのレコードのリストを返す
　oldMap　古いバージョンののレコードとIDのMapを返す

| 　 | new | newMap | old | oldMap |
|:-:|:-:|:-:|:-:|:-:|
|before insert|〇||||
|before update|〇|〇|〇|〇|
|before delete|||〇|〇|
|after insert|〇|〇|||
|after update|〇|〇|〇|〇|
|after delete|||〇|〇|
|after undelete|〇|〇|||

# DescribeSObjectResultクラスのメソッド（すべて引数無し）
　getKeyPrefix()　オブジェクトの3文字のプレフィックスコードを返す
　getLabel()　オブジェクトの表示ラベルを返す
　getName()　オブジェクトの名前を返す
　getRecordTypeInfos()　RecordTypeInfoのリストを返す
　getRecordTypeInfosByDeveloperName()　レコードタイプのAPI名とRecordTypeInfoのリストを返す
　getRecordTypeInfosById()　レコードタイプのIDとRecordTypeInfoのリストを返す
　getRecordTypeInfosByName()　レコードタイプのラベルとRecordTypeInfoのリストを返す
　getSobjectType()　同じsObjectTypeを返す
　isAccessible()などis～～のメソッド　アクセス権などを返す

# DescribeFieldResultクラスのメソッド（すべて引数無し）
　getDefaultValue()　項目のデフォルト値を返す
　getLabel()　項目の表示ラベルを返す
　getName()　項目名を返す
　getPicklistValues()　PicklistEntry（選択リスト値）のリストを返す　※選択リストでない場合ランタイムエラーを返す
　getRelationshipName()　リレーション名を返す
　getType()　DisplayType（データ型）を返す
　isAutoNumber()　自動採番の場合はtrue、そうでない場合はfalseを返す
　isCustom()　カスタム項目の場合はtrue を、標準項目の場合はfalseを返す
　isAccessible()などis～～のメソッド　アクセス権などを返す

:::note info
DescribeSObjectResultクラスとDescribeFieldResultクラスは記述方法が頻出のようです。
下記のコードはそのまま匿名実行やApexで使用できます。
:::

```
// 取引先のレコードタイプ情報のリストを取得
List<Schema.RecordTypeInfo> recordTypeInfoList =  Account.sObjectType.getDescribe().getRecordTypeInfos();
// （実行ユーザが）取引先レコードへアクセス可能か
boolean isAccessible =  Account.sObjectType.getDescribe().isAccessible();
```

```
// 取引先の評価項目の選択リスト値のリストを取得
List<Schema.PicklistEntry> ratingList = Account.Rating.getDescribe().getPicklistValues();
// （実行ユーザが）取引先の評価項目へアクセス可能か
boolean isAccessible = Account.Rating.getDescribe().isAccessible();
```

# アノテーション
　@AuraEnabled　クライアント側およびサーバ側からApexメソッドへのアクセスが可能になる
　@future ：非同期で実行するメソッドを指定する
　@InvocableMethod ：フローやプロセスビルダーから呼び出し可能になる
　@isTest ：テストに使用するコードのみを含むクラスおよびメソッドを定義する
　@testSetup：テストメソッドで使用できる一般的なテストレコードの作成に使用する。引数を取らず、値を返さない。
　@TestVisible ：非公開のメンバーやメソッドに、テストメソッドからアクセスが可能になる

# ApexクラスとJavaクラスの違い
・内部クラスは外部クラスの1つ下のレベルでのみ宣言できる
　　→複数レベル下の内部クラスは宣言不可
・静的メソッドと変数は、最上位クラスでのみ宣言できる
　　→内部クラスでは不可
・デフォルトのアクセス修飾子は private 
・publicアクセス修飾子は、このアプリケーションまたは名前空間内のすべてのApexで使用可能なことを意味する
・globalアクセス修飾子は、クラスへのアクセス権を付与されたすべてのApexコードで使用可能なことを意味する
　　※アプリケーション外から参照されるすべてのメソッドはこのアクセス修飾子を使用する必要がある
　　※メソッドまたは変数を global として宣言する場合、それを含むクラスも global として宣言する必要がある
・メソッドおよびクラスはデフォルトで final 
・インターフェースメソッドは常にglobalとなる
　　→インターフェースメソッドにアクセス修飾子の指定不可
　　※インターフェースはメソッドが実装されていないクラスのようなもの、メソッドの署名はあるが本文は空

# 継承
| 　| 継承される側 | 継承する側 |
|:-:|:-:|:-:|
|インタフェース|interface|implements|
|インタフェースのメソッド|-|-|
|クラス|virtual|extends|
|クラスのメソッド|virtual|overrid|

# 実行順序
　項目の必須・型・長さの検証
　フロー
　Beforeトリガ
　入力規則
　重複ルール
　データベースへの保存(コミットはされない)
　Afterトリガ★
　割り当てルール
　レスポンスルール
　ワークフロールール★
　プロセスビルダー★
　エスカレーションルール
　エンタイトルメントルール
　親オブジェクトの更新(積み上げ集計項目、クロスオブジェクトの項目自動更新)
　共有ルール
　コミット（DML操作）
　メール送信・TODO作成・アウトバウンドメッセージなど

　（★は同一オブジェクトに対して再度Apexトリガが実行される可能性のあるもの）

※入力規則についてInsert時は作成日・最終更新日を使用した式は無視される　→ISNEW()を使用
※ワークフロールールやプロセスビルダーは1回だけ、トリガは複数回通ることがある

# 参考
↓Salesforce公式の開発者ガイドやヘルプページなどのリンクになっています
[データ型](https://developer.salesforce.com/docs/atlas.ja-jp.232.0.apexcode.meta/apexcode/langCon_apex_datatypes_variables_intro.htm)
[トリガコンテキスト変数](https://developer.salesforce.com/docs/atlas.ja-jp.232.0.apexcode.meta/apexcode/apex_triggers_context_variables.htm)
[DescribeSObjectResult クラス](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_sobject_describe.htm)
[DescribeFieldResult クラス](https://developer.salesforce.com/docs/atlas.ja-jp.232.0.apexcode.meta/apexcode/apex_methods_system_fields_describe.htm#apex_Schema_DescribeFieldResult_getPicklistValues)
[アノテーション](https://developer.salesforce.com/docs/atlas.ja-jp.232.0.apexcode.meta/apexcode/apex_classes_annotation.htm)
[Apex クラスと Java クラスの違い](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_java_diffs.htm)

# デベロッパー試験に関する記事
[Salesforce 認定 Platform デベロッパー 合格までのあれこれ](https://qiita.com/piepie1231/items/8da91897192dc44584be)
[デベロッパー勉強メモ：Salesforceの基本](https://qiita.com/piepie1231/items/bd94f6c3780f68b89251)
[デベロッパー勉強メモ：データモデリング](https://qiita.com/piepie1231/items/1ea83e14b553698f2aff)
[デベロッパー勉強メモ：プロセスの自動化とロジック①](https://qiita.com/piepie1231/items/407aad4ef1de5da297df)
[デベロッパー勉強メモ：プロセスの自動化とロジック②](https://qiita.com/piepie1231/items/e5eeb25ae2af0f79fd58)  ←当記事
[デベロッパー勉強メモ：ユーザインタフェース](https://qiita.com/piepie1231/items/179e5a39a98d65cb238d)
[デベロッパー勉強メモ：テスト、デバッグ、リリース](https://qiita.com/piepie1231/items/b90b82ec643b0cf5715b)