Diff 최적화

Diff 최적화

이 가이드는 원시 diff — 값 목록을 정리하는 방법을 보여줍니다 DiffOperation 값들 (see Diff for how those are built) — post-processing passes를 사용하여 표준적이고 최소한의 형태로 변환합니다 DiffOptimization 하위 네임스페이스. 각 패스는 구현합니다 IDiffOptimizationOperation 그리고 diff 리스트를 제자리에서 변형하므로, 패스들을 순차적으로 연결하여 결과를 점진적으로 단순화할 수 있습니다.


최적화 계약

IDiffOptimizationOperation은 단일 메서드인 Execute(diffs)을 정의하며, 이는 diff가 나타내는 원본 및 대상 텍스트를 보존하면서 DiffOperation 값들의 가변 리스트를 제자리에서 정규화합니다. 이 하위 네임스페이스의 모든 옵티마이저는 이 인터페이스를 구현하므로, 서로 교체하여 호출하거나 파이프라인에서 조합할 수 있습니다.

List<DiffOperation> diffs = new List<DiffOperation>
{
    new DiffOperation(Operation.Equal, "The quick "),
    new DiffOperation(Operation.Delete, "brown "),
    new DiffOperation(Operation.Insert, "red "),
    new DiffOperation(Operation.Equal, "fox")
};

IDiffOptimizationOperation optimizer = new OperationsMerger(EditOperationsOrder.DeleteFirst);
optimizer.Execute(diffs);

인접 연산 병합

OperationsMerger은 diff를 정규화된 최소 형태로 병합합니다: 동일한 연산 유형의 인접 실행을 하나로 합치며, 삭제/삽입이 혼합된 실행의 경우 공통 접두사를 앞선 동일성에, 공통 접미사를 뒤따르는 동일성에 각각 반영합니다.

var merger = new OperationsMerger(EditOperationsOrder.DeleteFirst);
merger.Execute(diffs);

짧은 동일성 제거

MergingOptimizer은 의미적 정리 패스를 수행합니다: 주변 편집보다 크지 않은 동일 구간을 제거하고, 그 짧은 공통 구간을 인접한 delete/insert에 다시 통합한 뒤, 결과를 정규 형태로 다시 병합합니다.

var semanticOptimizer = new MergingOptimizer(EditOperationsOrder.InsertFirst);
semanticOptimizer.Execute(diffs);

동일 구간을 가로질러 편집 이동

OperationsSlideMerger은 양쪽이 동일 구간으로 둘러싸인 단일 편집을 옆으로 이동시켜 그 중 하나의 동일 구간을 제거하고, 차이를 더욱 정규화합니다.

IDiffOptimizationOperation slideMerger = new OperationsSlideMerger();
slideMerger.Execute(diffs);

delete/insert 순서 제어

같은 위치에 delete와 insert가 모두 발생할 때, EditOperationsOrder 열거형은 옵티마이저가 결과 연산 순서에서 어느 것을 먼저 배치할지 제어합니다: DeleteFirst 또는 InsertFirst.

var order = EditOperationsOrder.DeleteFirst;
var optimizer = new MergingOptimizer(order);
optimizer.Execute(diffs);

팁 및 모범 사례

  • OperationsMerger을 먼저 실행하여 의미적 패스를 적용하기 전에 원시 편집을 합칩니다 — MergingOptimizer과 OperationsSlideMerger는 모두 인접한 동일 종류 연산이 이미 결합되었다고 가정합니다.
  • 하나의 EditOperationsOrder 값을 선택하고 파이프라인의 모든 옵티마이저에서 일관되게 사용하십시오; 패스 사이에 DeleteFirst과 InsertFirst를 혼용하면 이전 패스가 설정한 순서를 무효화할 수 있습니다.
  • 세 가지 최적화 도구 모두 List<DiffOperation>를 제자리에서 변형합니다 — 비교를 위해 최적화되지 않은 diff를 유지해야 한다면 먼저 리스트를 복제하세요.
  • 모든 최적화 도구가 IDiffOptimizationOperation를 구현하므로, 파이프라인을 IDiffOptimizationOperation[]로 보관하고 루프 안에서 각 최적화 도구에 Execute를 호출하면 이름을 하드코딩하지 않아도 됩니다.
  • 병합 단계 후에 OperationsSlideMerger를 적용하세요 — 동일한 종류의 인접 실행이 이미 합쳐진 경우에만 편집을 슬라이드하는 것이 유용합니다.

일반적인 문제

문제원인수정
Diff 여전히 작은 조각된 동일 항목을 포함하고 있습니다Only OperationsMerger was run; short equalities between edits were never foldedAlso run MergingOptimizer after OperationsMerger
Delete/insert order flips unexpectedly between passesDifferent EditOperationsOrder values were passed to different optimizersUse the same EditOperationsOrder value for every optimizer in the pipeline
Optimizer appears to have no effectThe diff list was already in canonical form, or a copy of the list was optimized instead of the original reference다운스트림 코드가 읽는 동일한 List<DiffOperation> 참조를 전달하고 있는지 확인하십시오

FAQ

diff에서 “canonical form"은 무엇을 의미하나요?

이는 동일한 종류의 인접 연산이 하나로 합쳐졌으며, 혼합된 삭제/삽입 구간에서 공통적인 접두사/접미사가 인접한 동일(Equality) 구간으로 통합되었음을 의미합니다. 따라서 시퀀스에 중복된 파편화가 없습니다.

세 가지 최적화 도구를 모두 사용해야 하나요?

아니오. IDiffOptimizationOperation는 필요한 패스만 적용할 수 있게 해주지만, 의미 패스(MergingOptimizer, OperationsSlideMerger) 전에 OperationsMerger을 실행하면 가장 일관된 결과를 얻을 수 있습니다.

OperationsMerger와 MergingOptimizer의 차이점은 무엇입니까?

OperationsMerger는 구조적 결합(동일 유형 연속, 공통 접두사/접미사)을 수행합니다. MergingOptimizer는 더 나아가 편집으로 둘러싸인 짧은 동등성을 인접한 삭제/삽입으로 다시 접어들어 재병합하기 전에 처리합니다.

EditOperationsOrder가 diff가 나타내는 내용을 변경합니까?

아니오. 이는 동일한 위치에 적용되는 삭제와 삽입의 출력 순서만 제어하며, 결과 텍스트 재구성에는 영향을 주지 않습니다.


API Reference 요약

클래스 / 메서드설명
IDiffOptimizationOperation인라인으로 diff를 정규화하는 후처리 패스용 인터페이스
IDiffOptimizationOperation.Execute(diffs)DiffOperation 값의 가변 리스트에 최적화 패스를 실행합니다
OperationsMerger인접한 동일 종류 연산을 합치고 공통 접두사/접미사를 등식으로 변환합니다
MergingOptimizer편집으로 둘러싸인 짧은 동등성을 제거한 다음, 정규 형태로 다시 병합합니다
OperationsSlideMerger동등성으로 둘러싸인 편집을 이동시켜 그 중 하나를 제거합니다
EditOperationsOrder공유 위치에서 DeleteFirst 또는 InsertFirst 중 어느 것이 출력될지 제어하는 열거형

참조

 한국어