# Nyash JSON Native Architecture > 美しさ重視のモジュラー設計 - yyjsonの最適化と対極のアプローチ ## 🎨 設計哲学 ### yyjson vs Nyash JSON | 項目 | yyjson | Nyash JSON | |------|--------|------------| | **構造** | 単一巨大ファイル | モジュラー分離 | | **最適化** | 最高速追求 | 理解しやすさ優先 | | **保守性** | 専門家向け | チーム開発向け | | **拡張性** | 困難 | 容易 | ### 80/20ルール適用 - **80%**: 美しく理解しやすい構造で動くものを作る - **20%**: 後で必要に応じて最適化(ホットパス統合等) ## 📂 モジュラー構造 ``` apps/lib/json_native/ ├── README.md # プロジェクト概要 ├── ARCHITECTURE.md # この設計ドキュメント │ ├── core/ # 🌟 核心データ構造 │ ├── node.hako # JsonNode - JSON値表現 │ ├── value.hako # JsonValue - 型安全ラッパー │ └── error.hako # JsonError - エラーハンドリング │ ├── lexer/ # 🔍 字句解析層 │ ├── tokenizer.hako # トークナイザー本体 │ ├── token.hako # トークン定義 │ └── scanner.hako # 文字スキャナー │ ├── parser/ # 🏗️ 構文解析層 │ ├── parser.hako # メインパーサー │ ├── recursive.hako # 再帰下降パーサー │ └── validator.hako # JSON妥当性検証 │ ├── utils/ # 🛠️ ユーティリティ │ ├── string.hako # 文字列処理ヘルパー │ ├── escape.hako # エスケープ処理 │ └── pretty.hako # 整形出力 │ ├── tests/ # 🧪 テストスイート │ ├── unit/ # 単体テスト │ ├── integration/ # 統合テスト │ └── performance/ # 性能テスト │ └── examples/ # 📖 使用例 ├── basic.hako # 基本的な使用例 ├── advanced.hako # 高度な使用例 └── benchmark.hako # ベンチマーク例 ``` ## 🎯 各モジュールの責務 ### Core層 - データ構造の基盤 ```nyash // core/node.hako - JSON値の抽象表現 box JsonNode { kind: StringBox // "null"|"bool"|"int"|"string"|"array"|"object" value: Box // 実際の値 meta: Box // メタデータ(位置情報等) } // core/value.hako - 型安全なアクセス box JsonValue { node: JsonNode // 内部ノード // as_string(), as_int(), as_bool() 等の型安全メソッド } // core/error.hako - エラー情報 box JsonError { code: StringBox // エラーコード message: StringBox // エラーメッセージ position: IntegerBox // エラー位置 } ``` ### Lexer層 - 文字列をトークンに分解 ```nyash // lexer/token.hako - トークン定義 box JsonToken { type: StringBox // "STRING"|"NUMBER"|"LBRACE"|"RBRACE"等 value: StringBox // トークンの値 start: IntegerBox // 開始位置 end: IntegerBox // 終了位置 } // lexer/tokenizer.hako - メイントークナイザー box JsonTokenizer { scanner: JsonScanner // 文字スキャナー tokens: ArrayBox // 生成されたトークン配列 } ``` ### Parser層 - トークンをASTに変換 ```nyash // parser/parser.hako - メインパーサー box JsonParser { tokenizer: JsonTokenizer // 字句解析器 current: IntegerBox // 現在のトークン位置 // parse() -> JsonNode } // parser/recursive.hako - 再帰下降実装 static box RecursiveParser { parse_value(tokens, pos) // 値をパース parse_object(tokens, pos) // オブジェクトをパース parse_array(tokens, pos) // 配列をパース } ``` ### Utils層 - 共通ユーティリティ ```nyash // utils/string.hako - 文字列処理 static box StringUtils { trim(s) // 空白トリム is_whitespace(ch) // 空白文字判定 is_digit(ch) // 数字判定 } // utils/escape.hako - エスケープ処理 static box EscapeUtils { escape_string(s) // JSON文字列エスケープ unescape_string(s) // JSONエスケープ解除 validate_string(s) // 文字列妥当性検証 } ``` ## 🔄 モジュール間の依存関係 ``` Core ←── Lexer ←── Parser ←── API ↑ ↑ ↑ Utils ────┴─────────┴─ (共通ユーティリティ) ``` ### 依存性の最小化 - **Core**: 他モジュールに依存しない独立基盤 - **Lexer**: CoreとUtilsのみに依存 - **Parser**: Core, Lexer, Utilsに依存 - **Utils**: 完全独立(どこからでも使用可能) ## 🚀 段階的実装戦略 ### Phase 1: Core基盤 (完了) - [x] JsonNode基本実装 - [x] 基本的なJSON生成機能 ### Phase 2: Utils基盤 - [ ] StringUtils実装 - [ ] EscapeUtils実装 - [ ] PrettyPrint実装 ### Phase 3: Lexer実装 - [ ] JsonToken定義 - [ ] JsonScanner実装 - [ ] JsonTokenizer実装 ### Phase 4: Parser実装 - [ ] RecursiveParser実装 - [ ] JsonParser統合 - [ ] エラーハンドリング ### Phase 5: 統合&テスト - [ ] 全モジュール統合 - [ ] 包括的テストスイート - [ ] 性能測定&調整 ## 💡 美しさの利点 ### 1. **理解しやすさ** - モジュール境界が明確 - 各ファイルが単一責任 - 新規開発者でもすぐ理解 ### 2. **保守性** - バグ修正が局所化 - 機能追加が容易 - リファクタリングが安全 ### 3. **テスト性** - 各モジュール独立テスト可能 - モックによる分離テスト - デバッグが簡単 ### 4. **拡張性** - 新機能を独立モジュールで追加 - 既存コードを破壊せずに拡張 - プラグイン機構の基盤 ## 🎯 美しいコードの指針 ### ファイルサイズ制限 - 各ファイル: **200行以下**を目標 - 複雑な機能は複数ファイルに分割 - 読みやすさを最優先 ### 命名規則 - **Box名**: PascalCase (JsonNode, JsonParser) - **メソッド名**: snake_case (parse_value, as_string) - **ファイル名**: snake_case (tokenizer.hako, recursive.hako) ### コメント戦略 - **なぜ**: 設計の意図を説明 - **何**: 複雑なアルゴリズムを説明 - **注意**: エッジケースや制限事項 この美しいアーキテクチャで、yyjsonとは対極のアプローチを実践し、 保守しやすく理解しやすいJSON実装を作り上げます!