|
概要
当ツールはゲシュタルトパターンマッチング+αの差分解析ロジックで差分検出を行います。
処理速度が若干遅めですが、比較時の行のマッチングがずれにくくかなり高精度です。
ゲシュタルトパターンマッチング
2つの文字列の中で最も長い共通文字列をマッチさせ、その前後について同じ作業を繰り返していく方法です。
例として2つの文字列が以下の場合の動きを見ていきます。
ゲシュタルトパターンマッチング方式によるDiffを行うツールです。 |
正規表現のパターンマッチングはとても便利です。慣れを必要としますが。 |
初期状態で最も長い共通文字列は「パターンマッチング」なので、そこをマッチさせます。
前部分 | マッチ部分 | 後部分 |
ゲシュタルト | パターンマッチング | 方式によるDiffを行うツールです。 |
正規表現の | パターンマッチング | はとても便利です。慣れを必要としますが。 |
次に前部分と後部分でそれぞれ最大共通文字列を探します。
前部分には共通文字列はなく、後部分には「です。」があります。
| マッチ1 | | マッチ2 | |
ゲシュタルト | パターンマッチング | 方式によるDiffを行うツール | です。 | |
正規表現の | パターンマッチング | はとても便利 | です。 | 慣れを必要としますが。 |
これ以上は共通文字列はありません。
行内比較にも、ファイル比較にもこの方法を使っています。
この方法によるDiffは人間の目で見てわかりやすい差分表示ができると言われています。
コメント化マッチング
以下のようにコメント化した部分とコメント化する前の部分をマッチングさせるようにしています。
その結果、実際の修正イメージに近くなります。
OK例
| 'Test Mod Start 2019/10/22 | Add |
If AR_WK(R, 2) <> "COM" And _ | ' If AR_WK(R, 2) <> "COM" And _ | Change |
AR_WK(R, 2) <> "BLA" And _ | ' AR_WK(R, 2) <> "BLA" And _ | Change |
AR_WK(R, 2) <> "EXEC" Then | ' AR_WK(R, 2) <> "EXEC" Then | Change |
| If AR_WK(R, 2) <> "COM" And _ | Add |
| AR_WK(R, 2) <> "BLA" And _ | Add |
| AR_WK(R, 2) <> "EXEC" And _ | Add |
| AR_WK(R, 2) <> "TEST" Then | Add |
| 'Test Mod End 2019/10/22 | Add |
NG例
| 'Test Mod Start 2019/10/22 | Add |
| ' If AR_WK(R, 2) <> "COM" And _ | Add |
| ' AR_WK(R, 2) <> "BLA" And _ | Add |
| ' AR_WK(R, 2) <> "EXEC" Then | Add |
If AR_WK(R, 2) <> "COM" And _ | If AR_WK(R, 2) <> "COM" And _ | |
AR_WK(R, 2) <> "BLA" And _ | AR_WK(R, 2) <> "BLA" And _ | |
AR_WK(R, 2) <> "EXEC" Then | AR_WK(R, 2) <> "EXEC" And _ | Change |
| AR_WK(R, 2) <> "TEST" Then | Add |
| 'Test Mod End 2019/10/22 | Add |
各コンペアソフトでのソース修正時の表示のされ方を比較してみました。
インデント変更マッチング
コメント化マッチングと似ていますが、元の処理に条件が追加や削除されてインデントがずれた時に、
元の処理とインデント後の処理をマッチさせます。
OK例
If InStr(W_LTEXT, Chr$(4)) = 0 And _ | | Delete |
InStr(W_LTEXT, Chr$(5)) = 0 Then | | Delete |
L1 = L1 + 1 | L1 = L1 + 1 | Change |
ReDim Preserve AR_LTX(L1) | ReDim Preserve AR_LTX(L1) | Change |
If InStr(AR_LTX(L1), Chr$(2)) > 0 Then | If InStr(AR_LTX(L1), Chr$(2)) > 0 Then | Change |
LL = LL + 1 | LL = LL + 1 | Change |
LLL2 = L1 | LLL2 = L1 | Change |
End If | End If | Change |
End If | | Delete |
NG例
If InStr(W_LTEXT, Chr$(4)) = 0 And _ | | Delete |
InStr(W_LTEXT, Chr$(5)) = 0 Then | | Delete |
L1 = L1 + 1 | L1 = L1 + 1 | Change |
ReDim Preserve AR_LTX(L1) | ReDim Preserve AR_LTX(L1) | Change |
If InStr(AR_LTX(L1), Chr$(2)) > 0 Then | If InStr(AR_LTX(L1), Chr$(2)) > 0 Then | Change |
LL = LL + 1 | LL = LL + 1 | Change |
LLL2 = L1 | LLL2 = L1 | Change |
End If | | Delete |
End If | End If | |
ブロックマッチング
関数などの開始位置から終了位置をマッチさせます。
関数などを追加や削除したときなどに、前の終了位置から次の終了位置の手前までが
変更部分と認識されることがよくありますが、これを防ぐようにしています。
OK例
End Sub | End Sub | |
| | Delete |
Private Sub CommandButton10_Enter() | | Delete |
| | Delete |
Me.CommandButton10.BackColor = &HFFFFC0 | | Delete |
| | Delete |
End Sub | | Delete |
| | |
Private Sub CommandButton11_Enter() | Private Sub CommandButton11_Enter() | |
NG例
End Sub | | Delete |
| | Delete |
Private Sub CommandButton10_Enter() | | Delete |
| | Delete |
Me.CommandButton10.BackColor = &HFFFFC0 | | Delete |
| | Delete |
End Sub | End Sub | |
| | |
Private Sub CommandButton11_Enter() | Private Sub CommandButton11_Enter() | |
ソースコンペア君に戻ります
トップに戻ります
|