mcpField
R
refactoring

refactoring

github.com/krzysztofsurdy開発3652 回インストール3 日前に更新
リポジトリ

refactoring について

開発者向けの PHP 8.3 以降のリファレンススキルです。リファクタリング手法やコードスメル、テストで確認しながら小さく変更するための指針をまとめています。

主な機能

  1. 0189種類のリファクタリング手法とコードスメル
  2. 02PHP 8.3以降の例と根拠
  3. 03段階的な変更手順
  4. 04変更前後の比較
  5. 05リファクタリングの実践指針

活用シーン

  1. 01メソッドやクラスの構造改善手法を選ぶ
  2. 02コードレビューでコードスメルを見つける
  3. 03テストを実行しながら安全な変更を計画する

インストール

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

$npx skills add https://github.com/krzysztofsurdy/code-virtuoso --skill refactoring

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

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
add-parameter.md
alternative-classes-with-different-interfaces.md
change-bidirectional-association-to-unidirectional.md
change-reference-to-value.md
change-unidirectional-association-to-bidirectional.md
change-value-to-reference.md
collapse-hierarchy.md
comments.md
consolidate-conditional-expression.md
consolidate-duplicate-conditional-fragments.md
data-class.md
data-clumps.md
dead-code.md
decompose-conditional.md
divergent-change.md
duplicate-code.md
duplicate-observed-data.md
encapsulate-collection.md
encapsulate-field.md
extract-class.md
extract-interface.md
extract-method.md
extract-subclass.md
extract-superclass.md
extract-variable.md
feature-envy.md
form-template-method.md
hide-delegate.md
hide-method.md
inappropriate-intimacy.md

詳細

リファクタリング

89 種類のリファクタリング手法とコードの不吉な臭いを網羅した詳細なリファレンスです。PHP 8.3 以降の例、根拠、手順、変更前後の比較を掲載しています。

リファクタリング手法(67 種類)

メソッドの構成
  • メソッドの抽出(Extract Method) — コードの断片を名前付きメソッドに切り出します → リファレンス
  • メソッドのインライン化(Inline Method) — メソッド呼び出しを本体で置き換えます → リファレンス
  • 変数の抽出(Extract Variable) — 説明用の変数を使って、複雑な式に意味のある名前を付けます → リファレンス
  • 一時変数のインライン化(Inline Temp) — 一時変数をその式で置き換えます → リファレンス
  • 一時変数を問い合わせメソッドに置き換え(Replace Temp with Query) — 一時変数をメソッド呼び出しに置き換えます → リファレンス
  • 一時変数の分割(Split Temporary Variable) — 用途ごとに別々の変数を割り当てます → リファレンス
  • パラメーターへの代入の削除(Remove Assignments to Parameters) — パラメーターを再代入する代わりに、ローカル変数を導入します → リファレンス
  • メソッドをメソッドオブジェクトに置き換え(Replace Method with Method Object) — 複雑なメソッドを独立したクラスに変換します → リファレンス
  • アルゴリズムの置き換え(Substitute Algorithm) — アルゴリズムをより明快な代替手段に置き換えます → リファレンス
オブジェクト間で機能を移動する
  • メソッドの移動(Move Method) — 最も依存度の高いクラスにメソッドを移動します → リファレンス
  • フィールドの移動(Move Field) — 最も依存度の高いクラスにフィールドを移動します → リファレンス
  • クラスの抽出(Extract Class) — 多くの処理を担うクラスを分割します → リファレンス
  • クラスのインライン化(Inline Class) — 役割が少なすぎるクラスを統合します → リファレンス
  • 委譲の隠蔽(Hide Delegate) — 委譲の連鎖を隠すメソッドを導入します → リファレンス
  • ミドルマンの除去(Remove Middle Man) — クライアントが委譲先を直接呼び出せるようにします → リファレンス
  • 外部メソッドの導入(Introduce Foreign Method) — 変更できないクラスに不足しているメソッドを追加します → リファレンス
  • ローカル拡張の導入(Introduce Local Extension) — ライブラリークラスのラッパーまたはサブクラスを作成します → リファレンス
データの整理
  • フィールドの自己カプセル化 — クラス内でも、フィールドへのアクセスをゲッター経由にします → リファレンス
  • データ値をオブジェクトに置き換える — プリミティブなデータを、より豊かなオブジェクトにします → リファレンス
  • 値を参照に変更する — 値オブジェクトを参照オブジェクトに変換します → リファレンス
  • 参照を値に変更する — 参照オブジェクトを値オブジェクトに変換します → リファレンス
  • 配列をオブジェクトに置き換える — データ構造として使っている配列を、適切なオブジェクトに置き換えます → リファレンス
  • 観測データを複製する — オブザーバーを使って、ドメインデータと UI を同期させます → リファレンス
  • 一方向の関連を双方向に変更する — 必要に応じて逆参照を導入します → リファレンス
  • 双方向の関連を一方向に変更する — 不要な逆参照を取り除きます → リファレンス
  • マジックナンバーをシンボリック定数に置き換える — マジックナンバーに意味のある名前を付けます → リファレンス
  • フィールドをカプセル化する — フィールドの可視性を制限し、アクセサーを公開します → リファレンス
  • コレクションをカプセル化する — コレクションの読み取り専用ビューを公開します → リファレンス
  • 型コードをクラスに置き換える — 型コードを列挙型またはクラスに置き換えます → リファレンス
  • 型コードをサブクラスに置き換える — 型コードをクラス階層に置き換えます → リファレンス
  • 型コードを State/Strategy に置き換える — 動作に影響する型コードを State/Strategy に置き換えます → リファレンス
  • サブクラスをフィールドに置き換える — 定数だけが異なるサブクラスを取り除きます → リファレンス
条件式の簡素化
  • 条件式を分解する — 複雑な条件式を、名前付きメソッドに分割します → リファレンス
  • 条件式を統合する — 同じ結果になる条件をまとめます → リファレンス
  • 条件式の重複した処理を統合する — 同一のコードを条件式の外に移動します → リファレンス
  • 制御フラグを取り除く — 制御フラグを break/return/continue に置き換えます → リファレンス
  • ネストした条件式をガード節に置き換える — 早期リターンを使って、ネストした条件式を平坦化します → リファレンス
  • 条件式をポリモーフィズムに置き換える — 条件式をポリモーフィックなメソッド呼び出しに置き換えます → リファレンス
  • ヌルオブジェクトを導入する — null チェックをヌルオブジェクトに置き換えます → リファレンス
  • アサーションを導入する — 前提条件を文書化するためにアサーションを挿入します → リファレンス
メソッド呼び出しの簡素化
  • メソッド名の変更 — 目的が伝わるメソッド名を選びます → リファレンス
  • パラメーターの追加 — 追加データに対応するため、新しいパラメーターを導入します → リファレンス
  • パラメーターの削除 — 使用されていないメソッドのパラメーターを削除します → リファレンス
  • クエリと修飾子の分離 — 値を返す処理と状態を変更する処理の両方を行うメソッドを分割します → リファレンス
  • メソッドのパラメーター化 — パラメーターを追加して、類似したメソッドを統合します → リファレンス
  • パラメーターを個別のメソッドに置き換える — パラメーターの値ごとに個別のメソッドを作成します → リファレンス
  • オブジェクト全体を渡す — 個別の値ではなく、オブジェクト全体を渡します → リファレンス
  • パラメーターをメソッド呼び出しに置き換える — 値を渡すのではなく、内部で算出します → リファレンス
  • パラメーターオブジェクトの導入 — 関連するパラメーターをオブジェクトにまとめます → リファレンス
  • 設定メソッドの削除 — 作成時にしか値が設定されないフィールドのセッターを削除します → リファレンス
  • メソッドの隠蔽 — 使用されていないパブリックメソッドの可視性を狭めます → リファレンス
  • コンストラクターをファクトリーメソッドに置き換える — 複雑なオブジェクトの作成にファクトリーメソッドを使用します → リファレンス
  • エラーコードを例外に置き換える — エラーコードを返すのではなく、例外をスローします → リファレンス
  • 例外をテストに置き換える — 例外を捕捉するのではなく、事前に条件を検証します → リファレンス
汎化への対処
  • フィールドの引き上げ — 同一のフィールドをスーパークラスに移動します → リファレンス
  • メソッドの引き上げ — 同一のメソッドをスーパークラスに移動します → リファレンス
  • コンストラクター本体の引き上げ — 共通のコンストラクターロジックをスーパークラスに移動します → リファレンス
  • メソッドの押し下げ — そのメソッドを使用するサブクラスに移動します → リファレンス
  • フィールドの押し下げ — そのフィールドを使用するサブクラスに移動します → リファレンス
  • サブクラスの抽出 — 一部の機能を切り出してサブクラスを作成します → リファレンス
  • スーパークラスの抽出 — 共通の振る舞いを親クラスに引き上げます → リファレンス
  • インターフェースの抽出 — 共通の操作のための共有インターフェースを定義します → リファレンス
  • 階層の縮小 — スーパークラスとサブクラスが似すぎている場合に統合します → リファレンス
  • テンプレートメソッドの形成 — 類似したメソッドをテンプレートに一般化します → リファレンス
  • 継承を委譲に置き換える — 継承をコンポジションに置き換えます → リファレンス
  • 委譲を継承に置き換える — 過剰な委譲を継承に置き換えます → リファレンス

コードの不吉な臭い(22)

ブロート
  • 長いメソッド — 過度に長くなったメソッド → 参考資料
  • 巨大なクラス — 多くのことを処理しようとするクラス → 参考資料
  • プリミティブへの執着 — 小さなオブジェクトではなく、プリミティブを過剰に使用すること → 参考資料
  • 長いパラメーターリスト — パラメーターを受け取りすぎるメソッド → 参考資料
  • データの塊 — 繰り返し一緒に現れるデータのグループ → 参考資料
オブジェクト指向の濫用
  • インターフェースの異なる代替クラス — メソッドのシグネチャが一致しない類似クラス → 参考資料
  • 継承の拒否 — 継承した振る舞いを無視するサブクラス → 参考資料
  • switch 文 — ポリモーフィズムで置き換えるべき複雑な switch/match 構文 → 参考資料
  • 一時的なフィールド — 特定の条件下でのみ値が設定されるフィールド → 参考資料
変更を妨げるもの
  • 発散する変更 — 多くの無関係な理由で変更される単一のクラス → 参考資料
  • 並行する継承階層 — サブクラスを一つ作るたびに、別のサブクラスも作成する必要がある状態 → 参考資料
  • ショットガン手術 — 一つの変更のために多くのクラスを編集する必要がある状態 → 参考資料
不要なもの
  • コメント — 不明瞭なコードを覆い隠す過剰なコメント → 参考資料
  • 重複コード — 複数の場所にある同一またはほぼ同一のコード → 参考資料
  • データクラス — フィールドとゲッター/セッターだけで構成されるクラス → 参考資料
  • デッドコード — 到達不能または使用されていないコード → 参考資料
  • 怠惰なクラス — 存在を正当化するほどの貢献をしないクラス → 参考資料
  • 投機的一般化 — 「念のため」に作られた未使用の抽象化 → 参考資料
結合に関する問題
  • 機能への羨望 — 自身のデータよりも別のクラスのデータに依存するメソッド → 参考資料
  • 不適切な親密さ — 互いの内部に踏み込むクラス → 参考資料
  • 不完全なライブラリクラス — 必要な機能を提供しきれていないライブラリクラス → 参考資料
  • メッセージチェーン — 長く連なるメソッド呼び出し(a.b().c().d()) → 参考資料
  • 仲介者 — 別のクラスへの委譲しか行わないクラス → 参考資料

ベストプラクティス

  • 小さく、検証しながらリファクタリングし、変更のたびにテストを実行します
  • ボーイスカウトルールに従い、コードを見つけたときよりも良い状態にしておきます
  • 安全で自動化された変換が可能な場合は、IDE のリファクタリングツールを活用します
  • リファクタリングと振る舞いの変更を同時に行わず、別々に進めます
  • 結合を減らし、凝集度を高めるリファクタリングを優先します
  • 現在の作業に最も近いコードの臭いから取り組みます

コメント