Diffパッチで関数を変更する

行の削除と追加を組み合わせて既存の関数を変更するUnified Diffパッチを適用します。'-'行と'+'行がどのように連携して編集を表現するかを解説します。

Basic Patches

詳細な説明

追加と削除の組み合わせによるコード変更

実際のパッチのほとんどは、-(削除)と+(追加)行を組み合わせて変更を表現します。Diff内で「変更された」行は、実際には古いバージョンの削除と新しいバージョンの追加として表示されます。

オリジナルの例

function calculateTotal(items) {
  let total = 0;
  for (let i = 0; i < items.length; i++) {
    total += items[i].price;
  }
  return total;
}

パッチの例

--- a/calc.js
+++ b/calc.js
@@ -1,7 +1,5 @@
-function calculateTotal(items) {
-  let total = 0;
-  for (let i = 0; i < items.length; i++) {
-    total += items[i].price;
-  }
-  return total;
+function calculateTotal(items, taxRate = 0) {
+  const subtotal = items.reduce((sum, item) => sum + item.price, 0);
+  const tax = subtotal * taxRate;
+  return subtotal + tax;
 }

変更の理解

Unified Diff形式には「変更」操作はなく、追加と削除のみです。行が変更された場合:

  1. 旧バージョン-プレフィックスで表示
  2. 新バージョン+プレフィックスで表示

パッチエンジンはすべての-行を削除し、その位置にすべての+行を挿入します。末尾のコンテキスト行}が変更を正しい位置に固定します。

グループ化の慣例

慣例として、関連する削除と追加はグループ化されます。削除ブロックが先に表示され、その後に追加ブロックが続きます。これにより、Diffを読む際に何が変更されたかを視覚的に比較しやすくなります。

ユースケース

チームメンバーがモダンなJavaScript機能(アロー関数、reduce)を使って関数をリファクタリングし、税率パラメータを追加しました。パッチを適用してローカルコピーを更新します。

試してみる — Diff Patch Applier

フルツールを開く