تحسين الفرق
تحسين الفروقات
هذا الدليل يوضح كيفية تنظيف diff خام — قائمة من DiffOperation القيم (انظر Diff لكيفية بنائها) — إلى شكل قياسي ومُصغر باستخدام عمليات ما بعد المعالجة في الـ DiffOptimization النطاق الفرعي. كل عملية تنفيذ IDiffOptimizationOperation وتُغيّر قائمة الـ diff في مكانها، بحيث يمكن ربط العمليات بتسلسل لتبسيط النتيجة تدريجيًا.
عقد التحسين
IDiffOptimizationOperation يعرّف طريقة واحدة، Execute(diffs)، التي تُعَدِّل قائمة متغيّرة من قيم 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 يدمج فرقًا إلى شكله القانوني الحد الأدنى: فهو يجمع السلاسل المتجاورة لنفس نوع العملية، وفي حالة سلسلة مختلطة من الحذف/الإدراج يقوم بنقل أي بادئة مشتركة إلى المساواة السابقة وأي لاحقة مشتركة إلى المساواة التالية.
var merger = new OperationsMerger(EditOperationsOrder.DeleteFirst);
merger.Execute(diffs);إزالة المساواة القصيرة
MergingOptimizer يؤدي مرور تنظيف دلالي: يزيل التطابقات التي لا تكون أكبر من التعديلات التي تحاط بها، ويعيد طي تلك السلاسل القصيرة المشتركة إلى عملية الحذف/الإدراج المجاورة، ثم يعيد دمج النتيجة إلى الشكل القانوني.
var semanticOptimizer = new MergingOptimizer(EditOperationsOrder.InsertFirst);
semanticOptimizer.Execute(diffs);تحريك التعديلات عبر التطابقات
OperationsSlideMerger يزاح تعديلًا واحدًا محاط من الجانبين بالتطابقات جانبًا، مما يلغي واحدة من تلك التطابقات ويعزز المزيد من التقييس للفرق.
IDiffOptimizationOperation slideMerger = new OperationsSlideMerger();
slideMerger.Execute(diffs);التحكم في ترتيب الحذف/الإدراج
عندما يتم إصدار عملية حذف وإدراج لنفس الموضع، يتحكم تعداد EditOperationsOrder في أيهما يضعه المُحسِّن أولًا في تسلسل العمليات الناتج: DeleteFirst أو InsertFirst.
var order = EditOperationsOrder.DeleteFirst;
var optimizer = new MergingOptimizer(order);
optimizer.Execute(diffs);نصائح وأفضل الممارسات
- شغّل
OperationsMergerأولاً لتجميع التعديلات الخام قبل تطبيق عمليات التنظيف الدلالي — يفترض كل منMergingOptimizerوOperationsSlideMergerأن العمليات المتجاورة من نفس النوع قد تم دمجها بالفعل. - اختر قيمة
EditOperationsOrderواحدة واستخدمها بشكل موحد عبر جميع المُحسِّنات في خط الأنابيب؛ خلطDeleteFirstوInsertFirstبين المرور يمكن أن يُلغي الترتيب الذي أنشأه مرور سابق. - جميع المُحسّنات الثلاثة تُغيّر الـ
List<DiffOperation>في موضعه — استنسخ القائمة أولاً إذا كنت بحاجة إلى الاحتفاظ بالفرق غير المُحسّن للمقارنة. - نظرًا لأن كل مُحسّن يُنفّذ
IDiffOptimizationOperation، يمكنك الاحتفاظ بخط الأنابيب كـIDiffOptimizationOperation[]واستدعاءExecuteعلى كل منها في حلقة بدلاً من كتابة كل مرحلة صراحةً بالاسم. - طبّق
OperationsSlideMergerبعد تمريرات الدمج — إن تحريك تعديل لا يكون مفيدًا إلا بعد أن تُدمج السلاسل المتجاورة من النوع نفسه.
المشكلات الشائعة
| المشكلة | السبب | الإصلاح |
|---|---|---|
| لا يزال الفرق يحتوي على مساوات مجزأة صغيرة | تم تشغيل OperationsMerger فقط؛ لم يتم دمج المساواة القصيرة بين التعديلات أبداً | قم أيضًا بتشغيل MergingOptimizer بعد OperationsMerger |
| يتقلب ترتيب الحذف/الإدراج بشكل غير متوقع بين المرورات | تم تمرير قيم EditOperationsOrder مختلفة إلى محسنات مختلفة | استخدم نفس قيمة EditOperationsOrder لكل محسن في خط الأنابيب |
| يبدو أن المحسن لا يؤثر | كانت قائمة الفرق بالفعل في الشكل القانوني، أو تم تحسين نسخة من القائمة بدلاً من المرجع الأصلي | تأكد من أنك تمرر نفس مرجع List<DiffOperation> الذي يقرأه الكود اللاحق |
FAQ
ماذا يعني “الصيغة القياسية” في الفرق؟
هذا يعني أن العمليات المتجاورة من نفس النوع قد تم دمجها، وأي بادئة/لاحقة مشتركة في سلاسل الحذف/الإدراج المختلطة تم دمجها في المساواة المجاورة، وبالتالي لا يحتوي التسلسل على تجزئة زائدة غير ضرورية.
هل يجب عليّ استخدام جميع المُحسّنات الثلاثة؟
لا. يتيح لك IDiffOptimizationOperation تطبيق الفحوصات التي تحتاجها فقط، لكن تشغيل OperationsMerger قبل الفحوصات الدلالية (MergingOptimizer، OperationsSlideMerger) يعطي أكثر النتائج اتساقاً.
ما الفرق بين OperationsMerger وMergingOptimizer؟
OperationsMerger يقوم بدمج هيكلي (سلاسل من نفس النوع، بادئة/لاحقة مشتركة). MergingOptimizer يذهب أبعد من ذلك ويطوي المساواة القصيرة المحاطة بالتعديلات إلى الحذف/الإدراج المجاور قبل إعادة الدمج.
هل يغيّر EditOperationsOrder ما تمثله الفروقات؟
لا. إنه يتحكم فقط في ترتيب إصدار عملية حذف وإدراج تُطبقان على نفس الموضع — إعادة بناء النص الناتج لا تتأثر.
API Reference ملخص
| فئة / طريقة | وصف |
|---|---|
IDiffOptimizationOperation | واجهة لتمرير ما بعد المعالجة الذي يُطَبِّع diff في موضعه |
IDiffOptimizationOperation.Execute(diffs) | يقوم بتشغيل مرحلة التحسين على قائمة قابلة للتغيير من قيم DiffOperation |
OperationsMerger | يوحد العمليات المتجاورة من نفس النوع ويحول البادئة/اللاحقة المشتركة إلى مساوات |
MergingOptimizer | يزيل المساوات القصيرة المحاطة بالتعديلات، ثم يعيد دمجها إلى الشكل القياسي |
OperationsSlideMerger | ينقل تعديلًا محاطًا بالمساوات لإزالة إحداها |
EditOperationsOrder | Enum يتحكم فيما إذا كان DeleteFirst أو InsertFirst يُصدر في موضع مشترك |