mcpField
R
refactor

refactor

github.com/htlin222開発7899 回インストール4 週間前に更新
リポジトリ

refactor について

動作を変えずにコード構造を改善するためのリファクタリングスキルです。一般的な手法やコードの兆候を取り上げ、テストを用いた段階的な進め方を示します。

主な機能

  1. 01関数やクラスの抽出
  2. 02条件分岐の置き換え
  3. 03重複の特定と削減
  4. 04コードの問題兆候の特定
  5. 05テストによる段階的な変更確認
  6. 06複雑度と長さの指標

活用シーン

  1. 01理解しにくい長い関数の分割
  2. 02複数ファイルにある重複ロジックの整理
  3. 03機能追加前の技術的負債の削減
  4. 04小さな変更を重ねた構造改善

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/htlin222/dotfiles --skill refactor

インストール後、Claude Code で/refactorを入力して読み込まれたか確認します。

詳細

コードのリファクタリング

動作を変えずにコードの品質を向上させます。

使用する場面

  • コードの理解や変更が難しい
  • ファイル間でロジックが重複している
  • 関数やクラスが大きすぎる
  • 技術的負債を削減する
  • 新機能を追加する前

リファクタリングのプロセス

  1. テストがあることを確認する - リファクタリングの前にテストを追加します
  2. 小さなステップで進める - 段階的に変更します
  3. テストを実行する - 変更のたびに確認します
  4. こまめにコミットする - 変更を元に戻せる状態に保ちます

よくあるリファクタリング

関数の抽出
// 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 行未満が望ましいです

安全性チェックリスト

  • テストがあり、すべて成功する
  • 動作を変更する意図はない
  • 変更は段階的に行う
  • 各ステップをコミットする
  • コードレビューを依頼する

例

入力:「この関数は長すぎます」 **アクション:**論理的な区分を特定し、目的に特化した関数に抽出して、テストが成功することを確認します

入力:「これらのファイルの重複を減らしてください」 **アクション:**共通パターンを見つけ、共有ユーティリティとして抽出し、呼び出し元を更新します

コメント