231 lines
5.8 KiB
Markdown
231 lines
5.8 KiB
Markdown
|
|
# 🔧 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)
|