# 機能設計書 47-三項演算子スタイル（experimentalTernaries）

## 概要

本ドキュメントは、Prettierの実験的三項演算子スタイル機能（experimentalTernaries）の設計仕様を定義する。

### 本機能の処理概要

experimentalTernariesオプションは、三項演算子（条件演算子）のフォーマットスタイルを制御する。従来のスタイルでは疑問符と条件式が同じ行に配置されるが、この実験的オプションを有効にすると「curious ternary」スタイルが適用され、疑問符が条件式の後に配置される新しいフォーマットスタイルが使用される。

**業務上の目的・背景**：
三項演算子の可読性は、特にネストした場合や複雑な条件を扱う場合に課題となることがある。この実験的機能は、三項演算子をより読みやすくフォーマットするための新しいアプローチを提供する。条件式と疑問符を同じ行に配置することで、条件と結果の関係がより明確になる。実験的機能として提供されており、将来のバージョンで変更される可能性がある。

**機能の利用シーン**：
1. 複雑な三項演算子を読みやすくフォーマットしたい場合
2. ネストした三項演算子の可読性を向上させたい場合
3. 新しいフォーマットスタイルを試したい場合
4. チームで三項演算子のスタイルを統一したい場合

**主要な処理内容**：
1. experimentalTernariesオプションの値取得（true/false）
2. ConditionalExpressionノードの検出
3. 新旧スタイルの分岐判定
4. curious ternaryスタイルでのフォーマット
5. ネスト三項演算子の適切なインデント処理

**関連システム・外部連携**：
- JavaScript/TypeScriptパーサー
- 三項演算子プリンター
- CLI、API、エディタプラグインからの呼び出し

**権限による制御**：
特になし。全てのユーザーが同一の機能を使用可能。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 2 | Playground | 補助機能 | サイドバーから実験的三項演算子を設定 |
| 19 | Configuration - Options | 主機能 | experimentalTernariesオプションの詳細説明 |

## 機能種別

設定オプション / フォーマット制御

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| experimentalTernaries | boolean | No | 実験的三項演算子スタイルを使用するかどうか | true/falseのみ |

### 入力データソース

- 設定ファイル（.prettierrc、prettier.config.js、package.json等）
- CLI引数（--experimental-ternaries）
- API呼び出し時のオプションオブジェクト

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| formatted | string | 三項演算子スタイルが適用されたフォーマット済みコード |

### 出力先

- 標準出力（CLIの場合）
- ファイル（--write オプション使用時）
- API戻り値

## 処理フロー

### 処理シーケンス

```
1. オプション解析
   └─ experimentalTernariesオプションの値を取得（デフォルト: false）
2. ConditionalExpression検出
   └─ 三項演算子ノードを特定
3. スタイル分岐
   └─ experimentalTernaries ? printTernary : printTernaryOld
4. curious ternaryスタイル適用（true時）
   └─ 条件式の後に疑問符を配置
5. ネスト処理
   └─ 入れ子の三項演算子に対して適切なインデント
```

### フローチャート

```mermaid
flowchart TD
    A[ConditionalExpression検出] --> B{experimentalTernaries?}
    B -->|false| C[printTernaryOld]
    B -->|true| D[printTernary - curious style]
    C --> E[従来スタイル出力]
    D --> F{ネストあり?}
    F -->|Yes| G[ネスト対応フォーマット]
    F -->|No| H[単純フォーマット]
    G --> I[出力]
    H --> I
    E --> I
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-47-01 | デフォルト設定 | デフォルトではfalse（従来スタイル） | experimentalTernaries未指定 |
| BR-47-02 | 従来スタイル | falseでは疑問符とconsequentが同じ行 | experimentalTernaries: false |
| BR-47-03 | curiousスタイル | trueでは疑問符が条件式の後 | experimentalTernaries: true |
| BR-47-04 | ネスト処理 | ネストした三項演算子は適切にインデント | 常に適用 |
| BR-47-05 | 実験的機能 | 将来変更される可能性あり | 常に適用 |

### 計算ロジック

スタイル分岐ロジック:
```javascript
function printTernary(path, options, print, args) {
  if (!options.experimentalTernaries) {
    return printTernaryOld(path, options, print);
  }
  // curious ternary style implementation
  // ...
}
```

## データベース操作仕様

### 操作別データベース影響一覧

該当なし（本機能はデータベース操作を行わない）

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | バリデーションエラー | experimentalTernariesに不正な値が指定された場合 | 正しいboolean値を指定する |

### リトライ仕様

該当なし

## トランザクション仕様

該当なし

## パフォーマンス要件

- 処理時間への影響は軽微
- ネストした三項演算子の処理は再帰的に行われる

## セキュリティ考慮事項

特になし

## 備考

- 実験的機能のため、将来のバージョンで動作が変更される可能性あり
- TypeScriptのConditionalType（TSConditionalType）にも適用される
- 複雑なネスト三項演算子では可読性が大幅に向上する可能性あり

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

オプション定義を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | options.js | `src/language-js/options.js` | experimentalTernariesオプションの定義（56-64行目） |

**読解のコツ**: experimentalTernariesはboolean型でデフォルトfalse。descriptionとoppositeDescriptionの両方が定義されている。

#### Step 2: 三項演算子出力処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | ternary.js | `src/language-js/print/ternary.js` | printTernary関数（153-428行目） |

**主要処理フロー**:
1. **154-156行目**: experimentalTernariesがfalseなら従来関数を呼び出し
2. **158-172行目**: ノード情報の取得
3. **230-248行目**: shouldBreak判定
4. **311-358行目**: テストと結果の出力
5. **367-404行目**: 代替部分の出力

#### Step 3: 従来スタイルを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | ternary-old.js | `src/language-js/print/ternary-old.js` | printTernaryOld関数 |

### プログラム呼び出し階層図

```
format() / formatWithCursor()
    │
    ├─ core.formatWithCursor()
    │      └─ printToDoc()
    │             └─ printer.print()
    │                    │
    │                    └─ printTernary() [ternary.js]
    │                           │
    │                           ├─ options.experimentalTernaries チェック
    │                           │
    │                           ├─ printTernaryOld() [ternary-old.js]
    │                           │      └─ 従来スタイル
    │                           │
    │                           └─ curious ternary style処理
    │                                  └─ ネスト処理
```

### データフロー図

```
[入力]                        [処理]                    [出力]

options.experimentalTernaries ──▶ printTernary() ────▶ formatted ternary
                               │
ConditionalExpression ─────────┘
                               │
                               ├─ false → printTernaryOld()
                               │
                               └─ true → curious style
                                        │
                                        └─ ネスト処理
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| options.js | `src/language-js/options.js` | ソース | experimentalTernariesオプション定義 |
| ternary.js | `src/language-js/print/ternary.js` | ソース | 三項演算子出力処理（新スタイル） |
| ternary-old.js | `src/language-js/print/ternary-old.js` | ソース | 三項演算子出力処理（従来スタイル） |
| handle-comments.js | `src/language-js/comments/handle-comments.js` | ソース | コメント処理（三項演算子関連） |
| needs-parentheses.js | `src/language-js/parentheses/needs-parentheses.js` | ソース | 括弧の必要性判定 |
| assignment.js | `src/language-js/print/assignment.js` | ソース | 代入式での三項演算子処理 |
| return-statement.js | `src/language-js/print/return-statement.js` | ソース | return文での三項演算子処理 |
