リファクタリング
Refactoring
プログラムの外部から見た動作は変えずに、内部のソースコードを整理して、読みやすさ(可読性)や直しやすさ(保守性)を高める作業のことです。
🐾 猫で例えると?
毛づくろいをする茶トラを、こまめに手入れするイメージとして使います。プログラムのリファクタリングでは、外から確かめられる動作を保ちながら、内部の構造を読みやすく直しやすくします。毛づくろいは外見にも変化が出るので、仕組みまで同じではありません。コードでは、整理の前後で必要な動作が変わっていないかを確認することが大切です。
💻 プログラミングにおける「リファクタリング」とは?
開発現場において、リファクタリングは「技術負債」を返済するための重要なプロセスです。急いで作った機能や、継ぎ足しで複雑になったコードは、次第に解読不能な「スパゲッティコード」になってしまいます。これを放置すると、少しの修正で思わぬバグが発生したり、開発スピードが極端に落ちたりします。
目的は、外から見える動作を保ちながら変更しやすい内部構造へ改善することです。何を簡単にしたいかを決め、名前の変更や関数の抽出など、効果が確かめられる範囲で進めます。
⚠️ リファクタリングの仕組みと注意点
リファクタリングの鉄則は、「機能の追加や変更を同時に行わないこと」です。動作が変わってしまったら、それはリファクタリングではなく「仕様変更」になってしまいます。
リファクタリングの例
次は同じ変換を関数へ抽出する例です。金額計算の端数処理などと混同しないよう、架空のポイント計算を使っています。beforeとafterを同じ入力で比較します。
const values = [10, 20, 0];
const before = values.map((value) => value * 2);
function doublePoints(value) {
return value * 2;
}
const after = values.map(doublePoints);
console.log(before); // [20, 40, 0]
console.log(after); // [20, 40, 0] 関数名によって計算の意図が分かるようになりました。ただし似たコードでも、業務上は別々に変わる処理なら無理にまとめない方がよい場合があります。重複の見た目だけでなく、同じ理由で変更されるかを考えます。
🛠️ リファクタリングを賢く行うためのポイント
現場で失敗しないための、実践的なアドバイスです。
- 変わらない動作を確かめる: 影響する入出力や境界条件を確認するテストが助けになります。テストの成功は確認した範囲での証拠であり、すべての動作が不変だという数学的な証明ではありません。小さな変更ごとに差分と結果を確認します。
- 小さく刻んで行う: 一度に大規模な整理をしようとすると、どこで壊れたか分からなくなります。少しずつ磨き上げましょう。
- ボーイスカウト・ルール: 「キャンプ場(コード)は、来た時よりも綺麗にして帰る」。日々の開発のついでに少しずつ直す習慣が大切です。
猫の毛づくろいのように、リファクタリングは内側を整える作業です。外から見た動作を変えないことを確かめるため、変更前の振る舞いを押さえ、小さく直して確認を重ねましょう。新機能の追加とは作業を分けると差分を追いやすくなります。