Files
hakorune/docs/説明書/reference/box-design/implementation-notes/phase-9-75-redesign.md

231 lines
5.8 KiB
Markdown
Raw Normal View History

# 🔧 Phase 9.75: Box設計根本革命 - 実装計画詳細
## 📅 実施期間: 2025-08 (Phase 9.7完了後)
## 🎯 目標
Arc<Mutex>責務の二重化問題を根本的に解決し、すべてのBox型で統一的な設計を実現する。
## 🏗️ 新設計アーキテクチャ
### Before現在の問題設計
```rust
// Box内部でロック管理
pub struct SocketBox {
listener: Arc<Mutex<Option<TcpListener>>>,
is_server: Arc<Mutex<bool>>,
}
// インタープリターでも二重ロック
Arc<Mutex<dyn NyashBox>>
```
### After新設計
```rust
// 純粋なデータコンテナ
pub struct SocketBox {
listener: Option<TcpListener>,
is_server: bool,
}
// インタープリターが一元管理
Arc<Mutex<dyn NyashBox>>
```
## 📋 実装フェーズ
### Phase A: 設計ガイドライン策定3日
#### A-1: Box実装パターンドキュメント
```rust
// ✅ 推奨パターン
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修正
```rust
// 新実装
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: テストスイート作成
```nyash
// 状態保持テスト
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<Mutex>除去の機械的適用
#### D-2: 統合テスト
- 全Box型の動作確認
- 相互運用性テスト
- メモリリークチェック
#### D-3: パフォーマンス検証
- ベンチマーク実行
- ロック競合の削減確認
- メモリ使用量の改善確認
## 🤖 Copilot協力タスク
### 自動化可能な作業
1. **Arc<Mutex>検出スクリプト**
```bash
grep -r "Arc<Mutex<" src/boxes/ | wc -l
# 現在: 50箇所以上 → 目標: 0箇所
```
2. **機械的リファクタリング**
- `Arc<Mutex<T>>``T`
- `.lock().unwrap()` 除去
- Clone実装の簡素化
3. **テストケース生成**
- 各Boxの状態保持テスト
- 並行アクセステスト
- エッジケーステスト
## 📊 成功指標
### 定量的指標
- [ ] Arc<Mutex>使用箇所: 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 パフォーマンス検証
木: ドキュメント最終化
金: リリース準備
```
## 🎉 期待される成果
1. **技術的成果**
- デッドロック問題の根絶
- 状態管理の信頼性向上
- パフォーマンス改善
2. **開発効率向上**
- 新Box実装の簡素化
- デバッグ時間の短縮
- 保守コストの削減
3. **Everything is Box哲学の強化**
- より純粋なBox設計
- 統一的な実装パターン
- 初学者にも理解しやすい構造
---
関連ドキュメント:
- [現在の課題](current-issues.md)
- [SocketBox問題詳細](socket-box-problem.md)
- [copilot_issues.txt](../../../../../予定/native-plan/copilot_issues.txt)