差分解析ロジック


概要

当ツールはゲシュタルトパターンマッチング+αの差分解析ロジックで差分検出を行います。
処理速度が若干遅めですが、比較時の行のマッチングがずれにくくかなり高精度です。


ゲシュタルトパターンマッチング

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()


ソースコンペア君に戻ります

トップに戻ります


お探しの情報は見つかりましたか?
まだの方はこちらをどうぞ。
Google

PageTop