# リファクタリング機会 - クイックインデックス Phase 223-228 実装を通じて発見されたリファクタリング機会の一覧です。 ## 📊 サマリー | Phase | タイトル | 優先度 | 実装難度 | 推奨時期 | ドキュメント | |-------|---------|--------|---------|---------|-------------| | **229** | **ConditionAlias 削除** | ⭐⭐⭐⭐⭐ | 低 | **今すぐ** | [phase229-action-plan.md](phase229-action-plan.md) | | 230 | ExitLinePolicy Trait | ⭐⭐⭐⭐ | 中 | Phase 229 後 | [phase223-228-refactoring-opportunities.md](phase223-228-refactoring-opportunities.md) | | 231+ | パターン検出共通化 | ⭐⭐⭐ | 中〜高 | 新パターン追加時 | [phase223-228-refactoring-opportunities.md](phase223-228-refactoring-opportunities.md) | ## 🎯 Phase 229: ConditionAlias 削除(推奨実施) ### 問題 **ConditionAlias は冗長!** ```rust pub struct CarrierInfo { pub promoted_loopbodylocals: Vec, // ["digit_pos"] pub carriers: Vec, // [CarrierVar{name: "is_digit_pos", ...}] pub condition_aliases: Vec, // ← これは promoted_loopbodylocals + carriers から導出可能 } ``` ### 解決策 **動的解決で十分!** ```rust impl CarrierInfo { pub fn resolve_promoted_carrier(&self, old_name: &str) -> Option<&str> { if !self.promoted_loopbodylocals.contains(&old_name.to_string()) { return None; } let expected_name = format!("is_{}", old_name); self.carriers.iter() .find(|c| c.name == expected_name) .map(|c| c.name.as_str()) } } ``` ### 効果 - **削減**: CarrierInfo フィールド 6 → 5 - **保守性**: データ整合性チェック 3箇所 → 1箇所 - **時間**: 1〜2時間 - **リスク**: 低 ### 実装計画 📄 **[phase229-action-plan.md](phase229-action-plan.md)** - 詳細な実装手順とテスト計画 --- ## 🔧 Phase 230: ExitLinePolicy Trait ### 問題 **ConditionOnly フィルタが4ファイルに分散!** - `meta_collector.rs` - collection ロジック - `reconnector.rs` (2箇所) - reconnect ロジック - `instruction_rewriter.rs` - exit PHI ロジック ### 解決策 **Policy Trait で集約** ```rust pub struct ExitLinePolicy; impl ExitLinePolicy { pub fn should_collect(role: CarrierRole) -> bool { true // ConditionOnly も collect(latch incoming 用) } pub fn should_reconnect(role: CarrierRole) -> bool { role == CarrierRole::LoopState // LoopState のみ } pub fn should_create_exit_phi(role: CarrierRole) -> bool { role == CarrierRole::LoopState // LoopState のみ } } ``` ### 効果 - **削減**: ~20行(重複 if 文の削減) - **可読性**: 判断ロジックが1箇所に - **拡張性**: 新しい CarrierRole 追加時に1箇所修正 - **時間**: 2〜3時間 - **リスク**: 中 --- ## 💡 Phase 231+: パターン検出共通化 ### 問題 **Trim と DigitPos Promoter に重複コード** - `loop_body_carrier_promoter.rs` (658行) - `loop_body_digitpos_promoter.rs` (713行) **同じ関数が2箇所に存在**: - `is_substring_method_call()` - 完全に同一 - 条件変数抽出ロジック - worklist 走査パターンが同じ ### 解決策 **LoopBodyLocalPattern Trait** ```rust pub trait LoopBodyLocalPattern { fn pattern_name() -> &'static str; fn allowed_init_methods() -> &'static [&'static str]; fn detect(...) -> Option; } impl LoopBodyLocalPattern for TrimPattern { ... } impl LoopBodyLocalPattern for DigitPosPattern { ... } ``` ### 効果 - **削減**: ~200行+(重複ロジック統合) - **拡張性**: 新パターン追加が容易 - **テスト容易性**: 共通部分を単独テスト可能 - **時間**: 1日+ - **リスク**: 高 ### 推奨時期 **新しいパターン追加時に検討** - 今は後回しでOK --- ## 📚 参考資料 ### 成功例 **Phase 224: MethodCallLowerer 統一化** - 理想的な Box化パターン - **Before**: loop_body_local_init.rs と condition_lowerer.rs に重複コード - **After**: MethodCallLowerer Box に統一 - **成果**: ~200行削減、保守性向上、テスト容易性向上 **特徴**: - Metadata-Driven(CoreMethodId ベース) - Fail-Fast(whitelist にない method は即エラー) - Context-Aware(for_init / for_condition で異なる whitelist) ### 設計ガイドライン ✅ **良い Box化**: 1. 単一責任 2. Metadata-Driven 3. Fail-Fast 4. Context-Aware 5. 独立テスト可能 ❌ **避けるべき**: 1. 情報の重複 2. ロジックの分散 3. 型の冗長 4. 暗黙の依存 --- ## 🧪 テスト戦略 ### Phase 229 変更時 **Level 1: ビルド確認** ```bash cargo build --release ``` **Level 2: 単体テスト** ```bash cargo test --lib carrier_info cargo test --lib loop_pattern_detection ``` **Level 3: パターンテスト** ```bash cargo test --release test_mir_joinir_funcscanner_trim cargo test --release test_loopbodylocal_digitpos cargo test --release test_loop_with_break ``` **Level 4: 決定性テスト** ```bash for i in 1 2 3; do echo "=== Run $i ===" cargo test --release test_loop_with_break 2>&1 | grep -E "ValueId|test result" done ``` **Level 5: E2E テスト** ```bash tools/smokes/v2/run.sh --profile quick --filter "loop_*" cargo test --release --test '*' ``` --- ## 📋 実装チェックリスト Phase 229 実装時: - [ ] CarrierInfo::resolve_promoted_carrier() 実装 - [ ] pattern2_with_break.rs の condition_aliases ループ削除 - [ ] loop_body_carrier_promoter.rs 修正 - [ ] loop_body_digitpos_promoter.rs 修正 - [ ] ConditionAlias 型削除 - [ ] pattern4_carrier_analyzer.rs 修正 - [ ] pattern_pipeline.rs 修正 - [ ] ビルド確認 - [ ] 単体テスト - [ ] パターンテスト - [ ] 決定性テスト - [ ] E2E テスト - [ ] CURRENT_TASK.md 更新 --- **作成日**: 2025-12-10 **対象**: Phase 223-228 コードベース分析結果 **推奨次アクション**: Phase 229 ConditionAlias 削除の実施