Optimasi Diff

Optimasi Diff

Panduan ini menunjukkan cara membersihkan diff mentah — sebuah daftar DiffOperation nilai (lihat Diff bagaimana itu dibangun) — menjadi bentuk kanonik yang minimal menggunakan proses pasca-pemrosesan dalam DiffOptimization sub-namespace. Setiap pass mengimplementasikan IDiffOptimizationOperation dan mengubah daftar diff di tempat, sehingga pass dapat dirantai secara berurutan untuk secara progresif menyederhanakan hasil.


Kontrak Optimasi

IDiffOptimizationOperation mendefinisikan satu metode, Execute(diffs), yang menormalkan daftar DiffOperation yang dapat diubah secara langsung sambil mempertahankan teks sumber dan tujuan yang direpresentasikan oleh diff. Setiap optimizer di sub-namespace ini mengimplementasikan antarmuka ini, sehingga dapat dipanggil secara bergantian atau digabungkan dalam sebuah pipeline.

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

Menggabungkan Operasi Berdekatan

OperationsMerger menggabungkan diff ke dalam bentuk kanonik yang minimal: ia mengkonsolidasikan urutan berdekatan dengan jenis operasi yang sama, dan untuk urutan campuran delete/insert ia memindahkan prefiks umum ke kesetaraan sebelumnya serta sufiks umum ke kesetaraan berikutnya.

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

Menghilangkan Kesetaraan Pendek

MergingOptimizer melakukan proses pembersihan semantik: ia menghilangkan kesetaraan yang tidak lebih besar dari edit di sekitarnya, melipat kembali rangkaian pendek yang umum ke dalam penghapusan/penyisipan yang berdekatan, dan kemudian menggabungkan kembali hasilnya ke dalam bentuk kanonik.

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

Menggeser edit melintasi kesetaraan

OperationsSlideMerger menggeser satu edit yang dikelilingi di kedua sisi oleh kesetaraan secara menyamping, menghilangkan salah satu kesetaraan tersebut dan lebih lanjut mengkanonisasi diff.

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

Mengontrol urutan hapus/semat

Ketika sebuah hapus dan sebuah semat dikeluarkan untuk posisi yang sama, enum EditOperationsOrder mengontrol mana yang ditempatkan pertama oleh optimizer dalam urutan operasi yang dihasilkan: DeleteFirst atau InsertFirst.

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

Tips dan Praktik Terbaik

  • Jalankan OperationsMerger terlebih dahulu untuk menggabungkan edit mentah sebelum menerapkan proses semantik — MergingOptimizer dan OperationsSlideMerger keduanya mengasumsikan operasi sejenis yang berdekatan telah digabungkan.
  • Pilih satu nilai EditOperationsOrder dan gunakan secara konsisten di semua optimizer dalam sebuah pipeline; mencampur DeleteFirst dan InsertFirst antar proses dapat membatalkan urutan yang ditetapkan oleh proses sebelumnya.
  • Ketiga optimizer tersebut memodifikasi List<DiffOperation> di tempat — klon daftar terlebih dahulu jika Anda perlu menyimpan diff yang belum dioptimalkan untuk perbandingan.
  • Karena setiap optimizer mengimplementasikan IDiffOptimizationOperation, Anda dapat menyimpan pipeline sebagai IDiffOptimizationOperation[] dan memanggil Execute pada masing-masing dalam sebuah loop alih-alih mengkodekan keras setiap langkah berdasarkan nama.
  • Terapkan OperationsSlideMerger setelah langkah penggabungan — menggeser edit hanya berguna setelah rangkaian berdekatan dengan jenis yang sama sudah digabungkan.

Masalah Umum

MasalahPenyebabPerbaikan
Diff masih berisi kesetaraan kecil yang terfragmentasiHanya OperationsMerger yang dijalankan; kesetaraan singkat di antara edit tidak pernah dilipatJalankan juga MergingOptimizer setelah OperationsMerger
Urutan hapus/masukkan terbalik secara tak terduga di antara lintasanNilai EditOperationsOrder yang berbeda diberikan ke pengoptimal yang berbedaGunakan nilai EditOperationsOrder yang sama untuk setiap pengoptimal dalam pipeline
Pengoptimal tampaknya tidak berpengaruhDaftar diff sudah dalam bentuk kanonik, atau salinan daftar dioptimalkan alih-alih referensi asliKonfirmasikan bahwa Anda mengirim referensi List<DiffOperation> yang sama yang dibaca oleh kode hilir

FAQ

Apa arti “canonical form” untuk sebuah diff?

Artinya operasi berdekatan dengan jenis yang sama telah digabungkan dan setiap awalan/akhiran umum dalam rangkaian hapus/insert yang campur telah dilipat ke dalam kesetaraan tetangga, sehingga urutan tersebut tidak memiliki fragmentasi berlebih.

Apakah saya harus menggunakan ketiga optimizer tersebut?

Tidak. IDiffOptimizationOperation memungkinkan Anda menerapkan hanya pass yang Anda butuhkan, tetapi menjalankan OperationsMerger sebelum pass semantik (MergingOptimizer, OperationsSlideMerger) memberikan hasil yang paling konsisten.

Apa perbedaan antara OperationsMerger dan MergingOptimizer?

OperationsMerger melakukan koalesensi struktural (run berjenis sama, prefiks/akhiran umum). MergingOptimizer melangkah lebih jauh dan melipat kesetaraan singkat yang dikelilingi oleh edit kembali ke delete/insert yang berdekatan sebelum digabung kembali.

Apakah EditOperationsOrder mengubah apa yang diwakili oleh diff?

Tidak. Itu hanya mengontrol urutan emisinya antara delete dan insert yang diterapkan pada posisi yang sama — rekonstruksi teks yang dihasilkan tidak terpengaruh.


API Reference Ringkasan

Kelas / MetodeDeskripsi
IDiffOptimizationOperationAntarmuka untuk langkah pasca-pemrosesan yang menormalkan diff di tempat
IDiffOptimizationOperation.Execute(diffs)Menjalankan proses optimasi pada daftar yang dapat diubah dari nilai DiffOperation
OperationsMergerMenggabungkan operasi sejenis yang berdekatan dan memfaktorkan awalan/akhiran umum menjadi persamaan
MergingOptimizerMenghilangkan persamaan pendek yang dikelilingi oleh edit, lalu menggabungkannya kembali ke bentuk kanonik
OperationsSlideMergerMenggeser sebuah edit yang dikelilingi oleh persamaan untuk menghilangkan salah satunya
EditOperationsOrderEnum yang mengontrol apakah DeleteFirst atau InsertFirst dihasilkan pada posisi bersama

Lihat Juga

 Bahasa Indonesia