الفرق بين المراجعتين ل"Refactoring/extract interface"
Khaled-yassin (نقاش | مساهمات) (أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: استخرج الواجهات (Extract Interface)}}</noinclude> == المشكلة == يستخدم العديد من العملاء نفس ا...') |
جميل-بيلوني (نقاش | مساهمات) ط (مراجعة وتدقيق.) |
||
سطر 4: | سطر 4: | ||
== الحل == | == الحل == | ||
− | + | نقل هذا الجزء المتطابق إلى الواجهة الخاصة به. | |
=== مثال === | === مثال === | ||
==== قبل إعادة التصميم ==== | ==== قبل إعادة التصميم ==== | ||
− | [[ملف:Extract Interface - Before.png|بديل=يستخدم العديد من العملاء نفس الجزء من واجهة الصنف.|بدون|تصغير|يستخدم العديد من العملاء نفس الجزء من واجهة الصنف.]] | + | استخدام التابعين <code>()getRate</code> و <code>()hasSpecialSkill</code> في الصنف <code>Employee</code> بكثرة: [[ملف:Extract Interface - Before.png|بديل=يستخدم العديد من العملاء نفس الجزء من واجهة الصنف.|بدون|تصغير|يستخدم العديد من العملاء نفس الجزء من واجهة الصنف.]] |
==== بعد إعادة التصميم ==== | ==== بعد إعادة التصميم ==== | ||
− | [[ملف:Extract Interface - After.png|بديل=تقل هذا الجزء المتطابق إلى الواجهة الخاصة به.|بدون|تصغير|تقل هذا الجزء المتطابق إلى الواجهة الخاصة به.]] | + | استخراج هذين التابعين إلى واجهة خاصة بهما تدعى <code>Billable</code>:[[ملف:Extract Interface - After.png|بديل=تقل هذا الجزء المتطابق إلى الواجهة الخاصة به.|بدون|تصغير|تقل هذا الجزء المتطابق إلى الواجهة الخاصة به.]] |
== لم إعادة التصميم؟ == | == لم إعادة التصميم؟ == | ||
سطر 19: | سطر 19: | ||
== من الجيد أن نعرف == | == من الجيد أن نعرف == | ||
− | هناك بعض التشابه بين استخراج الأصناف | + | هناك بعض التشابه بين [[Refactoring/extract superclass|استخراج الأصناف العليا]] واستخراج الواجهات. |
− | يسمح استخراج الواجهات بعزل الواجهات المشتركة فقط، وليس الشيفرة المشتركة. وبعبارة أخرى، إذا احتوت الأصناف على شيفرة | + | يسمح استخراج الواجهات بعزل الواجهات المشتركة فقط، وليس الشيفرة المشتركة. وبعبارة أخرى، إذا احتوت الأصناف على [[Refactoring/duplicate code|شيفرة مكررة]]، فإن استخراج الواجهات لن يساعد على إزالة التكرار. |
− | ومع ذلك، يمكن تخفيف هذه المشكلة بتطبيق استخراج الأصناف لنقل السلوك الذي يحتوي على التكرار إلى عنصرٍ منفصل وتفويضه بكل العمل. إذا كان السلوك المشترك كبيرًا في الحجم، يمكن دائمًا استخدام استخراج الأصناف | + | ومع ذلك، يمكن تخفيف هذه المشكلة بتطبيق [[Refactoring/extract class|استخراج الأصناف]] لنقل السلوك الذي يحتوي على التكرار إلى عنصرٍ منفصل وتفويضه بكل العمل. إذا كان السلوك المشترك كبيرًا في الحجم، يمكن دائمًا استخدام [[Refactoring/extract superclass|استخراج الأصناف العليا]]. وهو أسهل بالطبع، لكن تذكَّر أنه إذا سلكت هذا الطريق، فستحصل على صنف أصل واحدٍ فقط. |
== آلية الحل == | == آلية الحل == | ||
سطر 38: | سطر 38: | ||
[[تصنيف:Refactoring]] | [[تصنيف:Refactoring]] | ||
[[تصنيف:Refactoring Techniques]] | [[تصنيف:Refactoring Techniques]] | ||
− | [[تصنيف:Dealing with Generalization]] | + | [[تصنيف:Refactoring Dealing with Generalization]] |
المراجعة الحالية بتاريخ 11:28، 26 فبراير 2019
المشكلة
يستخدم العديد من العملاء نفس الجزء من واجهة الصنف. حالة أخرى: عندما يوجد نفس الجزء من الواجهة في صنفين.
الحل
نقل هذا الجزء المتطابق إلى الواجهة الخاصة به.
مثال
قبل إعادة التصميم
استخدام التابعين ()getRate
و ()hasSpecialSkill
في الصنف Employee
بكثرة:
بعد إعادة التصميم
استخراج هذين التابعين إلى واجهة خاصة بهما تدعى Billable
:
لم إعادة التصميم؟
- تكون الواجهات مناسبة جدًا عندما تلعب الأصناف أدوارًا خاصة في حالات مختلفة. ويستخدم استخرج الواجهات لتحديد أي دور بوضوح.
- وتنشأ حالة مناسبة أخرى عندما تحتاج إلى وصف العمليات التي يجريها صنفُ ما على خادمه. إذا كان من المخطط أن يسمح في نهاية المطاف باستخدام خوادم من أنواع متعددة، يجب أن توفر كل الخوادم الواجهة.
من الجيد أن نعرف
هناك بعض التشابه بين استخراج الأصناف العليا واستخراج الواجهات.
يسمح استخراج الواجهات بعزل الواجهات المشتركة فقط، وليس الشيفرة المشتركة. وبعبارة أخرى، إذا احتوت الأصناف على شيفرة مكررة، فإن استخراج الواجهات لن يساعد على إزالة التكرار.
ومع ذلك، يمكن تخفيف هذه المشكلة بتطبيق استخراج الأصناف لنقل السلوك الذي يحتوي على التكرار إلى عنصرٍ منفصل وتفويضه بكل العمل. إذا كان السلوك المشترك كبيرًا في الحجم، يمكن دائمًا استخدام استخراج الأصناف العليا. وهو أسهل بالطبع، لكن تذكَّر أنه إذا سلكت هذا الطريق، فستحصل على صنف أصل واحدٍ فقط.
آلية الحل
- أنشئ واجهة فارغة.
- عرِّف العمليات المشتركة في الواجهة.
- عرِّف الأصناف اللازمة لتنفيذ الواجهة.
- غير نوع التعريفات في شيفرة العميل حتى يستخدم الواجهة الجديدة.