refactor について
動作を変えずにコード構造を改善するためのリファクタリングスキルです。一般的な手法やコードの兆候を取り上げ、テストを用いた段階的な進め方を示します。
主な機能
- 01関数やクラスの抽出
- 02条件分岐の置き換え
- 03重複の特定と削減
- 04コードの問題兆候の特定
- 05テストによる段階的な変更確認
- 06複雑度と長さの指標
活用シーン
- 01理解しにくい長い関数の分割
- 02複数ファイルにある重複ロジックの整理
- 03機能追加前の技術的負債の削減
- 04小さな変更を重ねた構造改善
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ htlin222/ dotfiles --skill refactorインストール後、Claude Code で/refactorを入力して読み込まれたか確認します。
詳細
コードのリファクタリング
動作を変えずにコードの品質を向上させます。
使用する場面
- コードの理解や変更が難しい
- ファイル間でロジックが重複している
- 関数やクラスが大きすぎる
- 技術的負債を削減する
- 新機能を追加する前
リファクタリングのプロセス
- テストがあることを確認する - リファクタリングの前にテストを追加します
- 小さなステップで進める - 段階的に変更します
- テストを実行する - 変更のたびに確認します
- こまめにコミットする - 変更を元に戻せる状態に保ちます
よくあるリファクタリング
関数の抽出
// Before
function processOrder(order) {
// 50 lines of validation
// 30 lines of calculation
// 20 lines of notification
}
// After
function processOrder(order) {
validateOrder(order);
const total = calculateTotal(order);
notifyCustomer(order, total);
}
条件分岐をポリモーフィズムに置き換える
// Before
function getPrice(type) {
if (type === "regular") return basePrice;
if (type === "premium") return basePrice * 1.5;
if (type === "vip") return basePrice * 0.8;
}
// After
const pricingStrategies = {
regular: (base) => base,
premium: (base) => base * 1.5,
vip: (base) => base * 0.8,
};
const getPrice = (type) => pricingStrategies[type](basePrice);
重複の削除
// Before
function getUserName(user) {
return user?.profile?.name ?? "Unknown";
}
function getOrderName(order) {
return order?.customer?.name ?? "Unknown";
}
// After
const getName = (obj, path) => path.reduce((o, k) => o?.[k], obj) ?? "Unknown";
const getUserName = (user) => getName(user, ["profile", "name"]);
const getOrderName = (order) => getName(order, ["customer", "name"]);
コードの不吉な匂い
| 不吉な匂い | 症状 | リファクタリング |
|---|---|---|
| 長い関数 | 20 行を超える | 関数の抽出 |
| 大きなクラス | 200 行を超える | クラスの抽出 |
| コードの重複 | 同じロジックが繰り返される | 抽出して再利用する |
| 長いパラメーター | パラメーターが 3 個を超える | オブジェクト/ビルダーを使う |
| フィーチャーエンヴィ | 他のクラスのデータを使用する | メソッドを移動する |
| プリミティブ型への執着 | すべてに文字列を使用する | 値オブジェクトを作成する |
品質指標
- 循環的複雑度 - 関数ごとに 10 未満に保ちます
- ネストの深さ - 最大 3 階層
- 関数の長さ - 20 行未満が望ましいです
- ファイルの長さ - 300 行未満が望ましいです
安全性チェックリスト
- テストがあり、すべて成功する
- 動作を変更する意図はない
- 変更は段階的に行う
- 各ステップをコミットする
- コードレビューを依頼する
例
入力:「この関数は長すぎます」 **アクション:**論理的な区分を特定し、目的に特化した関数に抽出して、テストが成功することを確認します
入力:「これらのファイルの重複を減らしてください」 **アクション:**共通パターンを見つけ、共有ユーティリティとして抽出し、呼び出し元を更新します
コメント
Markdown 対応