【要約】テストが薄い業務Excel自動化を安全にリファクタする3フェーズ【Python/openpyxl/COM】 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者が保守するPython製の業務Excel自動化ツールにおいて、コードの可読性と保守性が著しく低下している。現状のコードは「動いているが、触るのが怖い」という典型的なレガシー状態にある。
- ・列番号がマジックナンバーとして直接記述され、意味の把握にコメントを要する。
- ・Excel COMやGUIに密結合しており、テストコードの作成が極めて困難である。
- ・テストが不足しているため、構造変更によるデグレードのリスクが非常に高い。
// Approach
既存の振る舞いを一切変えないことを最優先とし、段階的な3フェーズのアプローチを採用した。
- ・フェーズ1:特性化テスト(Characterization Test)の導入。仕様ではなく「現在の出力値」を固定するテストを純粋関数に対して作成し、安全網を構築する。
- ・フェーズ2:IntEnumによるマジックナンバーの置換。
intのサブクラスであるIntEnumを用いることで、COMへの受け渡し時の型互換性を維持しつつ、列番号に意味を与える。 - ・フェーズ3:徹底した調査によるリファクタリング範囲の限定。実装の分離が必要か調査し、既に責務が分離されている場合は「リファクタしない」という判断を下す。
// Result
既存の振る舞いを一切変えることなく、安全にコードの可読性を向上させた。
- ・マジックナンバーが意味のある名前(Enum)に置き換わり、コードの意図が明確になった。
- ・特性化テストと静的解析(ruff)の組み合わせにより、置換ミスやimport漏れを機械的に検知できる体制を整えた。
- ・調査に基づき不要な構造変更を回避したことで、デグレードのリスクを最小限に抑えた。
Senior Engineer Insight
> 本記事の真価は、単なるリファクタリング手法ではなく「リファクタリングの境界線」を定義している点にある。特に、IntEnumの特性を利用してCOMとの互換性を担保する手法は、実務上の制約を深く理解した極めて合理的な判断だ。また、調査に基づき「リファクタしない」という選択肢を提示している点は、技術責任者として高く評価できる。過剰な抽象化は新たな負債を生む。現場では、この「引き算の設計」こそが、安定稼働と開発速度の両立に不可欠である。