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 folded | Also run MergingOptimizer after OperationsMerger |
| Delete/insert order flips unexpectedly between passes | Different EditOperationsOrder values were passed to different optimizers | Use the same EditOperationsOrder value for every optimizer in the pipeline |
| Optimizer appears to have no effect | The 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 중 어느 것이 출력될지 제어하는 열거형 |