✅ Phase 9.75実装計画追加: - copilot_issues.txtにPhase 9.75追加(Phase 9.7と9.8の間) - Arc<Mutex>二重化問題の根本解決計画 - 段階的実装戦略(Phase A-D)定義 📚 Box設計ドキュメント完全体系化: - docs/説明書/reference/box-design/ 新設 - everything-is-box.md: 核心哲学の完全解説 - memory-management.md: Arc<Mutex>設計・fini/weak参照 - delegation-system.md: 完全明示デリゲーション仕様 - box-types-catalog.md: 全Box型の完全カタログ - ffi-abi-specification.md: FFI/ABI仕様(移動済み) 🔧 実装ノート完備: - current-issues.md: 現在進行中の設計課題 - socket-box-problem.md: Arc<Mutex>二重化問題詳細分析 - phase-9-75-redesign.md: 実装計画詳細 👥 Copilot実装ガイド作成: - phase9_75_socketbox_arc_mutex_redesign.md - SocketBox優先対応の具体的実装手順 - 完全テストスイート設計 - 段階的実装戦略(Step 1-5) 📋 CURRENT_TASK.md更新: - Box設計ドキュメント完成記録 - Phase 9.75準備完了状況 🎯 効果: - Everything is Box哲学の体系的文書化 - SocketBox問題解決の明確な道筋 - Copilot協調実装の準備完了 - 新規開発者オンボーディング改善 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
5.8 KiB
5.8 KiB
🔧 Phase 9.75: Box設計根本革命 - 実装計画詳細
📅 実施期間: 2025-08 (Phase 9.7完了後)
🎯 目標
Arc責務の二重化問題を根本的に解決し、すべてのBox型で統一的な設計を実現する。
🏗️ 新設計アーキテクチャ
Before(現在の問題設計)
// Box内部でロック管理
pub struct SocketBox {
listener: Arc<Mutex<Option<TcpListener>>>,
is_server: Arc<Mutex<bool>>,
}
// インタープリターでも二重ロック
Arc<Mutex<dyn NyashBox>>
After(新設計)
// 純粋なデータコンテナ
pub struct SocketBox {
listener: Option<TcpListener>,
is_server: bool,
}
// インタープリターが一元管理
Arc<Mutex<dyn NyashBox>>
📋 実装フェーズ
Phase A: 設計ガイドライン策定(3日)
A-1: Box実装パターンドキュメント
// ✅ 推奨パターン
pub struct MyBox {
base: BoxBase,
data: String, // シンプルなフィールド
count: usize, // Arc<Mutex>不要
items: Vec<Item>, // 直接保持
}
// ❌ アンチパターン
pub struct BadBox {
data: Arc<Mutex<String>>, // 内部ロック禁止
count: Arc<Mutex<usize>>, // 過剰な同期
}
A-2: テンプレート作成
box_template.rs- 新Box実装のひな形box_test_template.rs- テストスイートひな形- マクロによる定型処理自動化検討
A-3: 既存コードレビュー
- 15個のBox型の実装詳細調査
- 問題パターンの分類
- 修正難易度の評価
Phase B: 最優先Box修正(1週間)
B-1: SocketBox修正
// 新実装
impl NyashBox for SocketBox {
fn bind(&mut self, addr: &str, port: u16) -> Result<(), String> {
match TcpListener::bind((addr, port)) {
Ok(listener) => {
self.listener = Some(listener);
self.is_server = true;
Ok(())
}
Err(e) => Err(e.to_string())
}
}
}
B-2: HTTPServerBox修正
- SocketBoxと同様のパターンで修正
- 内部SocketBoxとの連携確認
B-3: テストスイート作成
// 状態保持テスト
test "SocketBox state persistence" {
server = new SocketBox()
assert(server.bind("127.0.0.1", 8080) == true)
assert(server.isServer() == true) // 必ず成功すること
}
// 並行アクセステスト
test "Concurrent access safety" {
// 複数スレッドからのアクセステスト
}
Phase C: ステートフルBox修正(1週間)
C-1: コレクション系Box
- ArrayBox:
Vec<Box<dyn NyashBox>>直接保持 - MapBox:
HashMap<String, Box<dyn NyashBox>>直接保持 - BufferBox: バッファ管理の簡素化
C-2: I/O系Box
- FileBox: ファイルハンドル管理
- StreamBox: ストリーム状態管理
C-3: P2P系Box
- P2PBox: ピア管理の再設計
- IntentBox: インテント処理の簡素化
Phase D: 残りのBox統一(3日)
D-1: 機械的修正
- RandomBox, DebugBox等の単純なBox
- Arc除去の機械的適用
D-2: 統合テスト
- 全Box型の動作確認
- 相互運用性テスト
- メモリリークチェック
D-3: パフォーマンス検証
- ベンチマーク実行
- ロック競合の削減確認
- メモリ使用量の改善確認
🤖 Copilot協力タスク
自動化可能な作業
-
Arc検出スクリプト
grep -r "Arc<Mutex<" src/boxes/ | wc -l # 現在: 50箇所以上 → 目標: 0箇所 -
機械的リファクタリング
Arc<Mutex<T>>→T.lock().unwrap()除去- Clone実装の簡素化
-
テストケース生成
- 各Boxの状態保持テスト
- 並行アクセステスト
- エッジケーステスト
📊 成功指標
定量的指標
- Arc使用箇所: 0個(Box内部)
- デッドロック発生: 0件
- 状態保持テスト: 100%成功
- パフォーマンス: 10%以上向上
定性的指標
- コード可読性の向上
- デバッグの容易さ
- 新規開発者の理解しやすさ
🚨 リスクと対策
リスク1: 既存コード互換性
対策:
- NyashBoxトレイトは変更しない
- 段階的移行(deprecated警告)
リスク2: パフォーマンス劣化
対策:
- 事前ベンチマーク取得
- ホットパスの最適化
リスク3: 実装工数超過
対策:
- 優先順位付け(SocketBox最優先)
- Copilot活用による自動化
📅 詳細スケジュール
Week 1:
月: Phase A-1 パターンドキュメント
火: Phase A-2 テンプレート作成
水: Phase A-3 既存コードレビュー
木: Phase B-1 SocketBox修正開始
金: Phase B-1 SocketBox修正完了
Week 2:
月: Phase B-2 HTTPServerBox修正
火: Phase B-3 テストスイート作成
水: Phase C-1 ArrayBox/MapBox修正
木: Phase C-2 FileBox/StreamBox修正
金: Phase C-3 P2PBox修正
Week 3:
月: Phase D-1 残りBox修正
火: Phase D-2 統合テスト
水: Phase D-3 パフォーマンス検証
木: ドキュメント最終化
金: リリース準備
🎉 期待される成果
-
技術的成果
- デッドロック問題の根絶
- 状態管理の信頼性向上
- パフォーマンス改善
-
開発効率向上
- 新Box実装の簡素化
- デバッグ時間の短縮
- 保守コストの削減
-
Everything is Box哲学の強化
- より純粋なBox設計
- 統一的な実装パターン
- 初学者にも理解しやすい構造
関連ドキュメント: