匿名ブロックと匿名ウィンドウの違い

Salesforceの**匿名ブロック**と**匿名ウィンドウ**はどちらもApexコードを一時的に実行する方法ですが、用途や動作の違いがあります。具体例を交えて解説します。  

---

## **1. 匿名ブロック（Anonymous Block）**
### **概要**
- Salesforce開発コンソール（Developer Console）やVS Codeの**Execute Anonymous**機能を使って、一時的にApexコードを実行できる方法。
- クラスやメソッドの定義は不要で、Apexコードを直接記述して実行可能。
- **トランザクションとして実行され、コミットされる（ロールバックは手動）**。

### **使用例**
開発コンソールで以下のコードを**匿名実行**すると、`Account` レコードが作成されます。

```apex
Account acc = new Account(Name='Test Account');
insert acc;
System.debug('Created Account ID: ' + acc.Id);
```

### **主な特徴**
✅ データベースへの変更（DML操作）は**コミットされる**。  
✅ **トランザクションは匿名実行全体を含む**（エラーが起きるとロールバックされる）。  
✅ **@TestVisible や private メソッドも実行できる**（通常はアクセス不可なprivateメンバーにもアクセス可能）。  

### **実行結果の確認**
1. **開発コンソールの「ログ」タブ** で `System.debug()` の出力を確認できる。
2. **実際にレコードが作成される**ので、 `Account` オブジェクトで新しいレコードを確認可能。

---

## **2. 匿名ウィンドウ（Anonymous Window）**
### **概要**
- **開発コンソールの「実行」メニュー → 「開発用の匿名 Apex」ウィンドウ** で開くApexコード入力画面のこと。
- **「匿名ブロックを実行するためのウィンドウ」であり、匿名ブロックと機能は同じ**。
- **実行結果（ログ）をすぐに確認できる UI が用意されている**。

### **使用例**
1. **開発コンソールを開く**
   - `設定 (⚙) > 開発コンソール` を開く
2. **「実行」メニュー > 「開発用の匿名 Apex」** を選択
3. **匿名ウィンドウにコードを記述して「実行」ボタンを押す**
   ```apex
   System.debug('Hello from Anonymous Window!');
   ```
4. **ログタブで「DEBUG」メッセージを確認**。

### **主な特徴**
✅ **匿名ブロックを実行するための専用ウィンドウ**。  
✅ **開発者が試しにコードを実行するのに便利なUIを提供**。  
✅ **ログや結果を簡単に確認できる**（ウィンドウの下部に出力される）。  
✅ **実行結果はすぐに反映されるが、セッションが切れると保持されない**。  

---

## **3. 匿名ブロック vs. 匿名ウィンドウの比較**
| 特徴 | **匿名ブロック** | **匿名ウィンドウ** |
|--------|----------------|----------------|
| 実行方法 | 開発コンソール、VS Code | 開発コンソールのUI |
| 実行内容 | Apexコード全体 | 匿名ブロックと同じ |
| トランザクション | コード全体が1トランザクション | 同じ |
| DML操作 | 可能（コミットされる） | 可能（コミットされる） |
| ログの確認 | 開発コンソールの「ログ」タブ | 匿名ウィンドウ内で表示 |
| 使いやすさ | ログを開かないと見えない | すぐに結果が見える |

---

## **4. どちらを使うべき？**
- **ログをすぐに確認したい場合** → **匿名ウィンドウ**が便利
- **VS Code や他のツールを使いたい場合** → **匿名ブロック（Execute Anonymous）**
- **データを変更するテストをしたい場合** → **どちらでもOK（DML操作が可能）**
- **privateメソッドをテスト実行したい場合** → **どちらでもOK（@TestVisibleのメソッドも実行可）**

---

## **5. 注意点**
### ✅ **本番環境（Production）では使用できない**
匿名ブロックは**Sandbox** や **Developer Edition** では実行できますが、本番環境では**管理者権限があっても使用不可**です。

### ✅ **大量データ処理には不向き**
匿名ブロックの実行は一時的なものであり、バッチ処理のように大量のレコードを処理するには適していません。

### ✅ **トランザクション管理に注意**
匿名ブロックは1つのトランザクションとして扱われるため、途中でエラーが発生すると**全体がロールバック**されます。例えば、以下のコードでは2つ目の `insert` でエラーが発生すると、1つ目の `insert` も取り消されます。

```apex
Account acc1 = new Account(Name='Test Account 1');
insert acc1;

Account acc2 = new Account(); // Name がないのでエラー
insert acc2; // ここでエラーが発生すると、acc1 の挿入も取り消される
```

**解決策：トランザクション制御を追加**
```apex
try {
    Account acc1 = new Account(Name='Test Account 1');
    insert acc1;

    Account acc2 = new Account(); // Nameがないのでエラー
    insert acc2;
} catch (Exception e) {
    System.debug('Error: ' + e.getMessage());
}
```
この方法でも `acc1` はロールバックされますが、エラー処理が可能になります。

---

## **6. まとめ**
| | **匿名ブロック** | **匿名ウィンドウ** |
|--------|----------------|----------------|
| 実行方法 | 開発コンソール / VS Code | 開発コンソール（UIあり） |
| ログ確認 | 開発コンソールのログタブ | ウィンドウ内で即時確認 |
| DML実行 | 可能（コミットされる） | 可能（コミットされる） |
| トランザクション | コード全体が1トランザクション | 同じ |
| 用途 | ちょっとしたスクリプト実行 | 手軽にコードを試す |

- **開発コンソールで「実行 → 開発用の匿名 Apex」を開くと、それが匿名ウィンドウ**  
- **匿名ウィンドウで実行するApexコードそのものが匿名ブロック**

つまり、**「匿名ウィンドウ」は「匿名ブロックを記述するためのエディタ」** という位置づけです。

開発中に一時的なコード実行をしたい場合は、**匿名ウィンドウを開いてコードを試し、デバッグを行うのが便利** です！