تحسين الفرق

تحسين الفروقات

هذا الدليل يوضح كيفية تنظيف 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ينقل تعديلًا محاطًا بالمساوات لإزالة إحداها
EditOperationsOrderEnum يتحكم فيما إذا كان DeleteFirst أو InsertFirst يُصدر في موضع مشترك

انظر أيضاً

 العربية