الفرق بين المراجعتين لصفحة: «Refactoring/pull up method»
Khaled-yassin (نقاش | مساهمات) أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: سحب التابع لأعلى (Pull Up Method)}}</noinclude> == المشكلة == تحتوي الأصناف الفرعية على توابع...' |
جميل-بيلوني (نقاش | مساهمات) ط مراجعة وتدقيق. |
||
سطر 4: | سطر 4: | ||
== الحل == | == الحل == | ||
جعل التوابع متطابقة ثم نقلها إلى الصنف | جعل التوابع متطابقة ثم نقلها إلى الصنف الأعلى ذي الصلة. | ||
=== مثال === | === مثال === | ||
==== قبل إعادة التصميم ==== | ==== قبل إعادة التصميم ==== | ||
[[ملف:Pull Up Method - Before.png|بديل=تحتوي الأصناف الفرعية على التابع getHealth تؤدي نفس العمل.|بدون|تصغير|تحتوي الأصناف الفرعية على التابع getHealth تؤدي نفس العمل.]] | يحتوي الصنفان الفرعيان <code>Soldier</code> و <code>Tank</code> على التابع <code>()getHealth</code> الذي يؤدي نفس العمل:[[ملف:Pull Up Method - Before.png|بديل=تحتوي الأصناف الفرعية على التابع getHealth تؤدي نفس العمل.|بدون|تصغير|تحتوي الأصناف الفرعية على التابع <code>()getHealth</code> تؤدي نفس العمل.]] | ||
==== بعد إعادة التصميم ==== | ==== بعد إعادة التصميم ==== | ||
[[ملف:Pull Up Method - After.png|بديل=نقل التابع getHealth إلى الصنف الفائق.|بدون|تصغير|نقل التابع getHealth إلى الصنف | نقل التابع <code>()getHealth</code> إلى الصنف <code>Unit</code> الأب وإزالته من الأصناف الفرعية:[[ملف:Pull Up Method - After.png|بديل=نقل التابع getHealth إلى الصنف الفائق.|بدون|تصغير|نقل التابع <code>()getHealth</code> إلى الصنف الأعلى.]] | ||
== لم إعادة التصميم؟ == | == لم إعادة التصميم؟ == | ||
سطر 19: | سطر 19: | ||
== فوائد تطبيق الحل == | == فوائد تطبيق الحل == | ||
* التخلص من تكرار الشيفرة. إذا كنت بحاجة إلى إجراء تغييرات على تابع ما، فمن الأفضل أن تفعل ذلك في مكان واحد من أن تبحث عن جميع نسخ التابع في الأصناف الفرعية. | * التخلص من تكرار الشيفرة. إذا كنت بحاجة إلى إجراء تغييرات على تابع ما، فمن الأفضل أن تفعل ذلك في مكان واحد من أن تبحث عن جميع نسخ التابع في الأصناف الفرعية. | ||
* ويمكن أيضا استخدام تقنية إعادة التصميم هذه إذا أعاد صنفٌ فرعي تعريف تابع | * ويمكن أيضا استخدام تقنية إعادة التصميم هذه إذا أعاد صنفٌ فرعي تعريف تابع من الصنف الأب له، لسبب ما، ولكنه يؤدي نفس العمل في الأساس. | ||
== آلية الحل == | == آلية الحل == | ||
# تحقق من التوابع المماثلة في الأصناف | # تحقق من التوابع المماثلة في الأصناف الفرعية. إذا لم تكن متطابقة، قم بتنسيقها لتتطابق مع بعضها البعض. | ||
# إذا استخدَمت التوابعُ مجموعة مختلفة من المعاملات، ضع المعاملات في الشكل الذي تريد رؤيته في الصنف | # إذا استخدَمت التوابعُ مجموعة مختلفة من المعاملات، ضع المعاملات في الشكل الذي تريد رؤيته في الصنف العلوي. | ||
# انسخ التابع إلى الصنف | # انسخ التابع إلى الصنف العلوي (الصنف الأب). هنا قد تجد أن شيفرة التابع تستخدم الحقول والتوابع التي توجد فقط في الأصناف الفرعية وبالتالي ليست متاحة في الصنف العلوي. ولحل هذا، يمكنك: | ||
#* بالنسبة للحقول: استخدم إما [[Refactoring/pull up field|سحب الحقل لأعلى]] أو [[Refactoring/encapsulate field|التغليف الداخلي]] للحقول لإنشاء المُتلقيات والضوابط في الأصناف الفرعية؛ ثم عرِّف هذه المُتلقيات بشكل تجريدي في الأصناف | #* بالنسبة للحقول: استخدم إما [[Refactoring/pull up field|سحب الحقل لأعلى]] أو [[Refactoring/encapsulate field|التغليف الداخلي]] للحقول لإنشاء المُتلقيات والضوابط في الأصناف الفرعية؛ ثم عرِّف هذه المُتلقيات بشكل تجريدي في الأصناف العلوية. | ||
#* بالنسبة للتوابع: استخدام إما سحب التابع أو عرِّف لهم | #* بالنسبة للتوابع: استخدام إما سحب التابع أو عرِّف لهم تابعًا مجردًا في الصنف العلوي (لاحظ أن الصنف سيصبح مجردًا إذا لم يكن كذلك مسبقًا). | ||
# أزِل التابع من الصنف الفرعي. | # أزِل التابع من الصنف الفرعي. | ||
# تحقق من المواقع التي يستدعى فيها التابع. في بعض الأماكن | # تحقق من المواقع التي يستدعى فيها التابع. قد تكون قادرًا في بعض الأماكن على استبدال استخدام الصنف الفرعي بالصنف الأب. | ||
== انظر أيضًا == | == انظر أيضًا == | ||
سطر 40: | سطر 40: | ||
[[تصنيف:Refactoring]] | [[تصنيف:Refactoring]] | ||
[[تصنيف:Refactoring Techniques]] | [[تصنيف:Refactoring Techniques]] | ||
[[تصنيف:Dealing with Generalization]] | [[تصنيف:Refactoring Dealing with Generalization]] |
المراجعة الحالية بتاريخ 09:36، 26 فبراير 2019
المشكلة
تحتوي الأصناف الفرعية على توابع تؤدي نفس العمل.
الحل
جعل التوابع متطابقة ثم نقلها إلى الصنف الأعلى ذي الصلة.
مثال
قبل إعادة التصميم
يحتوي الصنفان الفرعيان Soldier
و Tank
على التابع ()getHealth
الذي يؤدي نفس العمل:
بعد إعادة التصميم
نقل التابع ()getHealth
إلى الصنف Unit
الأب وإزالته من الأصناف الفرعية:
لم إعادة التصميم؟
تنمو الأصناف الفرعية وتتطور بشكل مستقل عن بعضها البعض، مما يتسبب في ظهور حقول وتوابع متطابقة (أو شبه متطابقة).
فوائد تطبيق الحل
- التخلص من تكرار الشيفرة. إذا كنت بحاجة إلى إجراء تغييرات على تابع ما، فمن الأفضل أن تفعل ذلك في مكان واحد من أن تبحث عن جميع نسخ التابع في الأصناف الفرعية.
- ويمكن أيضا استخدام تقنية إعادة التصميم هذه إذا أعاد صنفٌ فرعي تعريف تابع من الصنف الأب له، لسبب ما، ولكنه يؤدي نفس العمل في الأساس.
آلية الحل
- تحقق من التوابع المماثلة في الأصناف الفرعية. إذا لم تكن متطابقة، قم بتنسيقها لتتطابق مع بعضها البعض.
- إذا استخدَمت التوابعُ مجموعة مختلفة من المعاملات، ضع المعاملات في الشكل الذي تريد رؤيته في الصنف العلوي.
- انسخ التابع إلى الصنف العلوي (الصنف الأب). هنا قد تجد أن شيفرة التابع تستخدم الحقول والتوابع التي توجد فقط في الأصناف الفرعية وبالتالي ليست متاحة في الصنف العلوي. ولحل هذا، يمكنك:
- بالنسبة للحقول: استخدم إما سحب الحقل لأعلى أو التغليف الداخلي للحقول لإنشاء المُتلقيات والضوابط في الأصناف الفرعية؛ ثم عرِّف هذه المُتلقيات بشكل تجريدي في الأصناف العلوية.
- بالنسبة للتوابع: استخدام إما سحب التابع أو عرِّف لهم تابعًا مجردًا في الصنف العلوي (لاحظ أن الصنف سيصبح مجردًا إذا لم يكن كذلك مسبقًا).
- أزِل التابع من الصنف الفرعي.
- تحقق من المواقع التي يستدعى فيها التابع. قد تكون قادرًا في بعض الأماكن على استبدال استخدام الصنف الفرعي بالصنف الأب.
انظر أيضًا
- دفع التابع لأسفل (Push Down Method).
- سحب الحقل لأعلى (Pull Up Field).
- تكوين قالب تابع (Form Template Method).
- الشيفرة المكررة (Duplicate Code).