Diff Optimizasyonu
Diff Optimizasyonu
Bu kılavuz, ham bir diff’i — bir değer listesi — nasıl temizleyeceğinizi gösterir DiffOperation değerleri (bkz Diff bu değerlerin nasıl oluşturulduğunu) — kanonik, minimal bir forma, post-işleme geçişlerini kullanarak alt ad alanındaki DiffOptimization alt ad alanında. Her geçiş şunları uygular IDiffOptimizationOperation ve diff listesini yerinde değiştirir, böylece geçişler sıralı olarak zincirlenebilir ve sonucu adım adım basitleştirir.
Optimizasyon sözleşmesi
IDiffOptimizationOperation, kaynak ve hedef metinleri diff’in temsil ettiği şekilde korurken, yerinde değiştirilebilir bir DiffOperation değerleri listesini normalleştiren tek bir yöntem, Execute(diffs)‘i tanımlar. Bu alt ad alanındaki her optimize edici bu arabirimi uygular, böylece birbirinin yerine çağrılabilir veya bir işlem hattında birleştirilebilir.
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);Bitişik işlemlerin birleştirilmesi
OperationsMerger, bir diff’i kanonik minimal formuna birleştirir: aynı işlem türünün bitişik ardışıklarını birleştirir ve karışık bir silme/ekleme ardışığı için ortak bir ön eki önceki eşitliğe, ortak bir soneki ise sonraki eşitliğe dahil eder.
var merger = new OperationsMerger(EditOperationsOrder.DeleteFirst);
merger.Execute(diffs);Kısa eşitliklerin ortadan kaldırılması
MergingOptimizer bir anlamsal temizlik geçişi gerçekleştirir: çevresindeki düzenlemelerden daha büyük olmayan eşitlikleri ortadan kaldırır, bu kısa ortak dizileri yan yana bulunan delete/insert işlemlerine geri katlar ve ardından sonucu kanonik forma yeniden birleştirir.
var semanticOptimizer = new MergingOptimizer(EditOperationsOrder.InsertFirst);
semanticOptimizer.Execute(diffs);Eşitlikler üzerinde düzenlemeleri kaydırma
OperationsSlideMerger, iki tarafı eşitliklerle çevrili tek bir düzenlemeyi yan yana kaydırır, bu eşitliklerden birini ortadan kaldırır ve farkı daha da kanonikleştirir.
IDiffOptimizationOperation slideMerger = new OperationsSlideMerger();
slideMerger.Execute(diffs);Silme/ekleme sırasını kontrol etme
Aynı konum için bir silme ve bir ekleme üretildiğinde, EditOperationsOrder enum’ı, bir optimizasyon aracının sonuç operasyon dizisinde hangisini önce koyacağını belirler: DeleteFirst veya InsertFirst.
var order = EditOperationsOrder.DeleteFirst;
var optimizer = new MergingOptimizer(order);
optimizer.Execute(diffs);İpuçları ve En İyi Uygulamalar
- Anlamsal geçişleri uygulamadan önce ham düzenlemeleri birleştirmek için önce
OperationsMergerçalıştırın —MergingOptimizerveOperationsSlideMergerher ikisi de yan yana aynı türdeki işlemlerin zaten birleştirildiğini varsayar. - Bir
EditOperationsOrderdeğerini seçin ve bir işlem hattındaki her optimizatörde tutarlı bir şekilde kullanın;DeleteFirstveInsertFirstdeğerlerini geçişler arasında karıştırmak, önceki geçişin oluşturduğu sıralamayı geri alabilir. - Üç optimizer da
List<DiffOperation>yerinde değiştirir — karşılaştırma için optimize edilmemiş diff’i korumanız gerekiyorsa önce listeyi kopyalayın. - Her optimizer
IDiffOptimizationOperationuyguladığından, bir boru hattınıIDiffOptimizationOperation[]olarak tutabilir ve her birine döngü içindeExecuteçağırabilirsiniz; böylece her geçişi isimle sabit kodlamazsınız. OperationsSlideMerger‘ı birleştirme geçişlerinden sonra uygulayın — bir düzenlemeyi kaydırmak, aynı türdeki yan yana çalışanlar zaten birleştirildiğinde faydalıdır.
Yaygın Sorunlar
| Sorun | Neden | Düzeltme |
|---|---|---|
| Diff hâlâ küçük parçalanmış eşitlikler içeriyor | Yalnızca OperationsMerger çalıştırıldı; düzenlemeler arasındaki kısa eşitlikler hiçbir zaman katlanmadı | Ayrıca MergingOptimizer, OperationsMerger sonrasında çalıştırıldı |
| Silme/ekleme sırası geçişler arasında beklenmedik şekilde tersine dönüyor | Farklı EditOperationsOrder değerleri farklı iyileştiricilere geçirildi | İş akışındaki her iyileştirici için aynı EditOperationsOrder değerini kullan |
| İyileştiricinin hiçbir etkisi yok gibi görünüyor | Diff listesi zaten kanonik biçimdeydi ya da listenin bir kopyası orijinal referans yerine optimize edildi | Aşağı akış kodunun okuduğu aynı List<DiffOperation> referansını geçtiğinizden emin olun |
FAQ
Bir diff için “canonical form” ne anlama gelir?
Bu, aynı türdeki yan yana işlemlerin birleştirildiği ve karışık silme/ekleme dizilerinde ortak bir ön ek/son ekin komşu eşitliğe katlandığı anlamına gelir; böylece dizi gereksiz parçalanmalara sahip olmaz.
Üç optimizer’ın tamamını kullanmak zorunda mıyım?
Hayır. IDiffOptimizationOperation sadece ihtiyacınız olan geçişleri uygulamanıza izin verir, ancak OperationsMerger‘i anlamsal geçişlerden (MergingOptimizer, OperationsSlideMerger) önce çalıştırmak en tutarlı sonuçları verir.
OperationsMerger ve MergingOptimizer arasındaki fark nedir?
OperationsMerger yapısal birleştirme gerçekleştirir (aynı türdeki koşular, ortak önek/son ek). MergingOptimizer daha da ileri giderek, düzenlemelerle çevrili kısa eşitlikleri yeniden birleştirmeden önce bitişik silme/eklemeye geri katlar.
EditOperationsOrder diff’in neyi temsil ettiğini değiştirir mi?
Hayır. Aynı konuma uygulanan bir silme ve eklemenin yayım sırasını yalnızca kontrol eder — ortaya çıkan metin yeniden oluşturması etkilenmez.
API Reference Özeti
| Sınıf / Metot | Açıklama |
|---|---|
IDiffOptimizationOperation | Yerinde bir farkı normalleştiren post-işlem geçişi için arayüz |
IDiffOptimizationOperation.Execute(diffs) | DiffOperation değerlerinin değiştirilebilir bir listesi üzerinde optimizasyon geçişini çalıştırır |
OperationsMerger | Bitişik aynı türdeki işlemleri birleştirir ve ortak önek/son eki eşitliklere dönüştürür |
MergingOptimizer | Düzenlemelerle çevrili kısa eşitlikleri ortadan kaldırır, ardından kanonik biçime yeniden birleştirir. |
OperationsSlideMerger | Eşitliklerle çevrili bir düzenlemeyi kaydırarak bunlardan birini ortadan kaldırır. |
EditOperationsOrder | Ortak bir konumda DeleteFirst ya da InsertFirst üretilip üretileceğini kontrol eden enum |