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
OperationsMergerterlebih dahulu untuk menggabungkan edit mentah sebelum menerapkan proses semantik —MergingOptimizerdanOperationsSlideMergerkeduanya mengasumsikan operasi sejenis yang berdekatan telah digabungkan. - Pilih satu nilai
EditOperationsOrderdan gunakan secara konsisten di semua optimizer dalam sebuah pipeline; mencampurDeleteFirstdanInsertFirstantar 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 sebagaiIDiffOptimizationOperation[]dan memanggilExecutepada masing-masing dalam sebuah loop alih-alih mengkodekan keras setiap langkah berdasarkan nama. - Terapkan
OperationsSlideMergersetelah langkah penggabungan — menggeser edit hanya berguna setelah rangkaian berdekatan dengan jenis yang sama sudah digabungkan.
Masalah Umum
| Masalah | Penyebab | Perbaikan |
|---|---|---|
| Diff masih berisi kesetaraan kecil yang terfragmentasi | Hanya OperationsMerger yang dijalankan; kesetaraan singkat di antara edit tidak pernah dilipat | Jalankan juga MergingOptimizer setelah OperationsMerger |
| Urutan hapus/masukkan terbalik secara tak terduga di antara lintasan | Nilai EditOperationsOrder yang berbeda diberikan ke pengoptimal yang berbeda | Gunakan nilai EditOperationsOrder yang sama untuk setiap pengoptimal dalam pipeline |
| Pengoptimal tampaknya tidak berpengaruh | Daftar diff sudah dalam bentuk kanonik, atau salinan daftar dioptimalkan alih-alih referensi asli | Konfirmasikan 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 / Metode | Deskripsi |
|---|---|
IDiffOptimizationOperation | Antarmuka untuk langkah pasca-pemrosesan yang menormalkan diff di tempat |
IDiffOptimizationOperation.Execute(diffs) | Menjalankan proses optimasi pada daftar yang dapat diubah dari nilai DiffOperation |
OperationsMerger | Menggabungkan operasi sejenis yang berdekatan dan memfaktorkan awalan/akhiran umum menjadi persamaan |
MergingOptimizer | Menghilangkan persamaan pendek yang dikelilingi oleh edit, lalu menggabungkannya kembali ke bentuk kanonik |
OperationsSlideMerger | Menggeser sebuah edit yang dikelilingi oleh persamaan untuk menghilangkan salah satunya |
EditOperationsOrder | Enum yang mengontrol apakah DeleteFirst atau InsertFirst dihasilkan pada posisi bersama |