2025-12-11 01:27:08 +09:00
|
|
|
|
Status: Historical
|
|
|
|
|
|
|
2025-11-06 22:34:18 +09:00
|
|
|
|
# コードベース重複・共通化調査 - インデックス
|
|
|
|
|
|
|
|
|
|
|
|
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) を参照してください。
|