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 — MergingOptimizer ve OperationsSlideMerger her ikisi de yan yana aynı türdeki işlemlerin zaten birleştirildiğini varsayar.
  • Bir EditOperationsOrder değerini seçin ve bir işlem hattındaki her optimizatörde tutarlı bir şekilde kullanın; DeleteFirst ve InsertFirst değ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 IDiffOptimizationOperation uyguladığından, bir boru hattını IDiffOptimizationOperation[] olarak tutabilir ve her birine döngü içinde Execute ç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

SorunNedenDüzeltme
Diff hâlâ küçük parçalanmış eşitlikler içeriyorYalnı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üyorFarklı 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üyorDiff listesi zaten kanonik biçimdeydi ya da listenin bir kopyası orijinal referans yerine optimize edildiAş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 / MetotAçıklama
IDiffOptimizationOperationYerinde 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
OperationsMergerBitişik aynı türdeki işlemleri birleştirir ve ortak önek/son eki eşitliklere dönüştürür
MergingOptimizerDüzenlemelerle çevrili kısa eşitlikleri ortadan kaldırır, ardından kanonik biçime yeniden birleştirir.
OperationsSlideMergerEşitliklerle çevrili bir düzenlemeyi kaydırarak bunlardan birini ortadan kaldırır.
EditOperationsOrderOrtak bir konumda DeleteFirst ya da InsertFirst üretilip üretileceğini kontrol eden enum

Ayrıca Bakınız

 Türkçe