الفرق بين المراجعتين ل"Refactoring/pull up method"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<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 تؤدي نفس العمل.
تحتوي الأصناف الفرعية على التابع ()getHealth تؤدي نفس العمل.

بعد إعادة التصميم

نقل التابع ()getHealth إلى الصنف Unit الأب وإزالته من الأصناف الفرعية:

نقل التابع getHealth إلى الصنف الفائق.
نقل التابع ()getHealth إلى الصنف الأعلى.

لم إعادة التصميم؟

تنمو الأصناف الفرعية وتتطور بشكل مستقل عن بعضها البعض، مما يتسبب في ظهور حقول وتوابع متطابقة (أو شبه متطابقة).

فوائد تطبيق الحل

  • التخلص من تكرار الشيفرة. إذا كنت بحاجة إلى إجراء تغييرات على تابع ما، فمن الأفضل أن تفعل ذلك في مكان واحد من أن تبحث عن جميع نسخ التابع في الأصناف الفرعية.
  • ويمكن أيضا استخدام تقنية إعادة التصميم هذه إذا أعاد صنفٌ فرعي تعريف تابع من الصنف الأب له، لسبب ما، ولكنه يؤدي نفس العمل في الأساس.

آلية الحل

  1. تحقق من التوابع المماثلة في الأصناف الفرعية. إذا لم تكن متطابقة، قم بتنسيقها لتتطابق مع بعضها البعض.
  2. إذا استخدَمت التوابعُ مجموعة مختلفة من المعاملات، ضع المعاملات في الشكل الذي تريد رؤيته في الصنف العلوي.
  3. انسخ التابع إلى الصنف العلوي (الصنف الأب). هنا قد تجد أن شيفرة التابع تستخدم الحقول والتوابع التي توجد فقط في الأصناف الفرعية وبالتالي ليست متاحة في الصنف العلوي. ولحل هذا، يمكنك:
    • بالنسبة للحقول: استخدم إما سحب الحقل لأعلى أو التغليف الداخلي للحقول لإنشاء المُتلقيات والضوابط في الأصناف الفرعية؛ ثم عرِّف هذه المُتلقيات بشكل تجريدي في الأصناف العلوية.
    • بالنسبة للتوابع: استخدام إما سحب التابع أو عرِّف لهم تابعًا مجردًا في الصنف العلوي (لاحظ أن الصنف سيصبح مجردًا إذا لم يكن كذلك مسبقًا).
  4. أزِل التابع من الصنف الفرعي.
  5. تحقق من المواقع التي يستدعى فيها التابع. قد تكون قادرًا في بعض الأماكن على استبدال استخدام الصنف الفرعي بالصنف الأب.

انظر أيضًا

مصادر