Files
hakorune/docs/archive/cleanup/DUPLICATION_INDEX.md

300 lines
9.0 KiB
Markdown
Raw Permalink Normal View History

Status: Historical
# コードベース重複・共通化調査 - インデックス
Hakorune Rustコードベースにおける重複コードの特定と、DRY原則に基づく改善計画のドキュメントハブです。
**調査日**: 2025-11-06
**実施**: Claude Code Agent
**調査種別**: 重複パターン分析・共通化機会の特定
---
## 📚 ドキュメント一覧
### 🎯 まず読むべきドキュメント
1. **[クイックリファレンス](./QUICK_REFERENCE.md)** ⭐ おすすめ
- 1ページで全体像を把握
- Before/After コード例
- 今すぐ始められる実装手順
2. **[実行サマリー](./CLEANUP_SUMMARY_2025-11-06.md)**
- エグゼクティブサマリー
- 数値で見る重複の実態
- Q&A
### 📖 詳細ドキュメント
3. **[詳細分析レポート](./DUPLICATION_ANALYSIS_REPORT.md)**
- 9章構成の包括的分析
- 全重複パターンの詳細
- リスク評価と期待効果
- 付録(ファイルサイズ一覧)
4. **[Phase 1実装ガイド](./PHASE1_IMPLEMENTATION_GUIDE.md)**
- Step-by-Step実装手順
- コピペで使えるコード例
- テスト戦略
- トラブルシューティング
---
## 🎯 調査結果サマリー
### 重複の規模
- **総重複箇所**: 260箇所以上
- **削減可能行数**: 500-800行15-20%削減)
- **優先対応**: Phase 1で270-380行削減可能
### 主要な重複パターンTop 5
| パターン | 箇所数 | 削減見込み | 優先度 |
|---------|--------|----------|--------|
| Destination書き込み | 49 | 150-200行 | ⭐⭐⭐ 最高 |
| 引数検証 | 55 | 100-150行 | ⭐⭐ 高 |
| エラー生成 | 95 | 200-300行 | ⭐⭐⭐ 最高 |
| Receiver変換 | 5 | 20-30行 | ⭐⭐ 高 |
| PHI挿入 | 13 | 50-100行 | ⭐ 中 |
---
## 🚀 アクションプラン
### Phase 1: 即効対応(推奨: 即時実施)
**目標**: 低リスク・高効果のヘルパー関数実装
- **期間**: 5-8時間
- **削減**: 270-380行
- **リスク**: 低
- **詳細**: [Phase 1実装ガイド](./PHASE1_IMPLEMENTATION_GUIDE.md)
**実装内容**:
1. Destination書き込みヘルパー`write_result`, `write_void` など)
2. 引数検証ヘルパー(`validate_args_exact`, `validate_args_range`
3. Receiver変換ヘルパー`convert_to_box`
### Phase 2: 基盤整備Phase 1完了後
**目標**: エラー処理とPHI挿入の統一
- **期間**: 5-7時間
- **削減**: 250-400行
- **リスク**: 低
### Phase 3: 抜本改革(将来課題)
**目標**: Box Handler群の統合
- **期間**: 1-2週間
- **削減**: 300-400行
- **リスク**: 中-高
---
## 📈 期待される効果
### 定量的効果
```
現状: 3,335行Handlers
↓ Phase 1
2,965行 (-11%, -370行)
↓ Phase 2
2,715行 (-19%, -620行)
↓ Phase 3
2,415行 (-28%, -920行)
```
### 定性的効果
- ✅ 保守性向上変更が1箇所で完結
- ✅ 可読性向上(意図が明確な関数名)
- ✅ バグ削減(共通ロジックの一元管理)
- ✅ 開発速度向上(ボイラープレート削減)
- ✅ テスト容易性(単体テストで広範囲カバー)
---
## 📂 対象ファイル
### MIR Interpreter Handlers重複集中エリア
```
src/backend/mir_interpreter/handlers/
├── arithmetic.rs (136行)
├── boxes.rs (307行) ← 重複多
├── boxes_array.rs (63行) ← 重複多
├── boxes_instance.rs (153行) ← 重複多
├── boxes_map.rs (134行) ← 重複多
├── boxes_object_fields.rs (399行) ← 重複多
├── boxes_plugin.rs (217行) ← 重複多
├── boxes_string.rs (208行) ← 重複多
├── boxes_void_guards.rs (21行)
├── call_resolution.rs (89行)
├── calls.rs (907行) ← 最大ファイル
├── extern_provider.rs (298行)
├── externals.rs (218行)
├── memory.rs (47行)
├── misc.rs (31行)
└── mod.rs (107行)
合計: 3,335行
```
### 新規作成ファイルPhase 1
```
src/backend/mir_interpreter/utils/
├── mod.rs
├── register_ops.rs # Destination書き込み
├── validation.rs # 引数検証
└── conversions.rs # 型変換
```
---
## 💡 実装のヒント
### Before/After 例
#### 例1: ArrayBox.push メソッド
```rust
// ❌ Before (6行)
"push" => {
if args.len() != 1 {
return Err(VMError::InvalidInstruction("push expects 1 arg".into()));
}
let val = this.reg_load(args[0])?.to_nyash_box();
let _ = ab.push(val);
if let Some(d) = dst {
this.regs.insert(d, VMValue::Void);
}
return Ok(true);
}
// ✅ After (4行, 33%削減)
"push" => {
this.validate_args_exact("push", args, 1)?;
let val = this.reg_load(args[0])?.to_nyash_box();
let _ = ab.push(val);
this.write_void(dst);
return Ok(true);
}
```
### 実装の流れ
1. ユーティリティ関数実装1-2時間
2. 最小ファイルで試す30分
3. 残りのファイルを順次更新3-5時間
4. 検証ドキュメント更新1時間
---
## 🔍 確認コマンド
```bash
# 重複パターン検索
cd /home/tomoaki/git/hakorune-selfhost
grep -rn "if let Some(d) = dst { this.regs.insert" src/backend/mir_interpreter/handlers/
grep -rn "args.len() !=" src/backend/mir_interpreter/handlers/
grep -rn "match recv.clone()" src/backend/mir_interpreter/handlers/
# ファイルサイズ確認
wc -l src/backend/mir_interpreter/handlers/*.rs | sort -rn
# Phase 1実装後の検証
./tools/jit_smoke.sh
git diff --stat
```
---
## 📊 進捗管理
### Phase 1チェックリスト
#### インフラ構築
- [ ] `utils/` ディレクトリ作成
- [ ] `register_ops.rs` 実装
- [ ] `validation.rs` 実装
- [ ] `conversions.rs` 実装
- [ ] ユニットテスト追加
- [ ] コンパイル&テスト確認
#### Handler更新1ファイルずつ
- [ ] `boxes_array.rs` (63行 → 50行)
- [ ] `boxes_map.rs` (134行 → 110行)
- [ ] `boxes_string.rs` (208行 → 170行)
- [ ] `boxes_plugin.rs` (217行 → 180行)
- [ ] `boxes_instance.rs` (153行 → 125行)
- [ ] `boxes_object_fields.rs` (399行 → 330行)
- [ ] `boxes.rs` (307行 → 250行)
- [ ] `calls.rs` (907行 → 750行)
#### 最終検証
- [ ] 重複パターン残存確認
- [ ] スモークテスト実行
- [ ] ドキュメント更新
- [ ] Phase 2計画
---
## 🎓 学んだこと
### 重複パターンの発見方法
1. 同じようなコードブロックを探すgrep活用
2. 関数シグネチャの類似性をチェック
3. エラーメッセージパターンを調査
4. ファイルサイズ比較(大きいファイルは重複の宝庫)
### 効果的な共通化のポイント
1. **小さく始める**: 最も単純なパターンから
2. **段階的移行**: 一度に全部変えない
3. **テストファースト**: ヘルパー関数のテストを先に
4. **1ファイルずつ**: 都度テストして確実に
### リスク管理
1. **並行期間**: 新旧コードを共存させる
2. **回帰テスト**: 各変更後にスモークテスト
3. **小さなPR**: レビュー負荷を軽減
4. **ロールバック可能**: いつでも戻せる設計
---
## 📞 サポート
### 質問・相談
- **実装で困ったら**: [Phase 1実装ガイド](./PHASE1_IMPLEMENTATION_GUIDE.md) のトラブルシューティングを参照
- **全体像が知りたい**: [実行サマリー](./CLEANUP_SUMMARY_2025-11-06.md) を参照
- **詳細な分析結果**: [詳細分析レポート](./DUPLICATION_ANALYSIS_REPORT.md) を参照
### 次のステップ
1. [クイックリファレンス](./QUICK_REFERENCE.md) を読む5分
2. [Phase 1実装ガイド](./PHASE1_IMPLEMENTATION_GUIDE.md) に従って実装開始5-8時間
3. Phase 1完了後、Phase 2を計画
---
## 📅 履歴
- **2025-11-06**: 初版作成Claude Code Agent による調査完了)
- 重複パターン260箇所を特定
- Phase 1-3のアクションプラン策定
- 実装ガイド作成
---
## 📌 クイックリンク
### 今すぐ始める
1. 📖 [クイックリファレンス](./QUICK_REFERENCE.md) - 1ページで全体把握
2. 🔧 [Phase 1実装ガイド](./PHASE1_IMPLEMENTATION_GUIDE.md) - コピペで実装開始
3. ✅ チェックリスト上記の「Phase 1チェックリスト」
### 詳細を知る
4. 📊 [実行サマリー](./CLEANUP_SUMMARY_2025-11-06.md) - 数値と効果
5. 📚 [詳細分析レポート](./DUPLICATION_ANALYSIS_REPORT.md) - 包括的分析
### 関連リソース(別プロジェクト)
- [README.md](./README.md) - レガシーコード削除プロジェクト
- [Phase 2レポート](./PHASE2_REPORT_2025-11-04.md) - 既存の整理作業
---
**次のアクション**: [クイックリファレンス](./QUICK_REFERENCE.md) を読んで、Phase 1実装を開始しましょう🚀
**注意**: このドキュメントは「重複コード・共通化」に関する調査です。「レガシーコード削除」については [README.md](./README.md) を参照してください。