الفرق بين المراجعتين ل"Refactoring/replace subclass with fields"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط (مراجعة وتدقيق)
 
سطر 3: سطر 3:
 
لديك أصناف فرعية تختلف فقط في توابع (إعادة الثوابت) الخاصة بها.
 
لديك أصناف فرعية تختلف فقط في توابع (إعادة الثوابت) الخاصة بها.
  
[[ملف:Replace Subclass with Fields - Before.png|600x600بك]]
+
== الحل ==
 +
استبدال التوابع بالحقول في الصنف الأب وحذف الأصناف الفرعية.
  
== الحل ==
+
== مثال ==
استبدال التوابع بالحقول في الصنف الأصل وحذف الأصناف الفرعية.
+
 
 +
=== قبل إعادة التصميم ===
 +
لدينا الصنف <code>Person</code> الذي يحتوي على الصنفيين الفرعيين <code>Male</code> و <code>Female</code>؛ يختلف هذان الصنفان في القيمة المعادة فقط.
 +
[[ملف:Replace_Subclass_with_Fields_-_Before.png|بديل=يحتوي الصنف Person يحتوي على الصنفيين الفرعيين Male و Female.|بدون|تصغير|253x253بك|يحتوي الصنف Person يحتوي على الصنفيين الفرعيين Male و Female.]]
  
[[ملف:Replace Subclass with Fields - After.png]]
+
=== بعد إعادة التصميم ===
 +
وضع حقول في الصنف <code>Person</code> الأب مكان مقابلة لحقول الصنف الفرعي <code>Male</code> و <code>Female</code> ثم حذف هذان الصنفان.
 +
[[ملف:Replace_Subclass_with_Fields_-_After.png|بديل=حذف الصنفان الفرعيان Male و Female من الصنف Person الأب بعد وضع حقول مقابلة للحقول الموجودة فيهما.|بدون|تصغير|254x254بك|حذف الصنفان الفرعيان Male و Female من الصنف Person الأب بعد وضع حقول مقابلة للحقول الموجودة فيهما.]]
  
 
== لم إعادة التصميم؟ ==
 
== لم إعادة التصميم؟ ==
 
في بعض الأحيان تكون إعادة التصميم هي الحل لتجنب كتابة الشيفرة البرمجية.
 
في بعض الأحيان تكون إعادة التصميم هي الحل لتجنب كتابة الشيفرة البرمجية.
  
في مثل هذه الحالة، قد يكون التسلسل الهرمي للأصناف الفرعية مختلفًا فقط في القيم المُعادة بواسطة توابع خاصة. هذه التوابع ليست حتى نتيجة الحساب، لكنها ضُبطت بدقة في التوابع نفسها أو في الحقول المُعادة من قِبَل التوابع. لتبسيط بِنية الصنف، يمكن ضغط هذا التسلسل الهرمي في صنف واحد يحتوي علي حقل واحد أو عدة حقول بالقيم الضرورية، بحسب الحالة.
+
في مثل هذه الحالة، قد يكون التسلسل الهرمي للأصناف الفرعية مختلفًا فقط في القيم المُعادة بواسطة توابع خاصة. هذه التوابع ليست حتى نتيجة الحساب، لكنها ضُبطت بدقة في التوابع نفسها أو في الحقول المُعادة من قِبَل التوابع. لتبسيط بِنية الصنف، يمكن ضغط هذا التسلسل الهرمي في صنف واحد يحتوي على حقل واحد أو عدة حقول بالقيم الضرورية، بحسب الحالة.
  
قد تصبح هذه التغييرات ضرورية بعد نقل كمية كبيرة من الوظائف من التسلسل الهرمي للصنف إلى مكان آخر. ويصبح التسلسل الهرمي الحالي غير ذا قيمة وتُصبح الأصناف الفرعية مجرد وحِمل ساكن.
+
قد تصبح هذه التغييرات ضرورية بعد نقل كمية كبيرة من الوظائف من التسلسل الهرمي للصنف إلى مكان آخر. ويصبح التسلسل الهرمي الحالي غير ذا قيمة وتُصبح الأصناف الفرعية مجرد حِمل ميت.
  
 
== فوائد تطبيق الحل ==
 
== فوائد تطبيق الحل ==
 تبسيط بنية النظام. ويُعد إنشاء أصناف فرعية مُبالغة إذا كان كل ما نريد القيام به هو إعادة قيم مختلفة في توابع مختلفة.
+
 تبسيط بنية النظام. ويُعد إنشاء أصناف فرعية مُبالغةً إذا كان كل ما نريد القيام به هو إعادة قيم مختلفة في توابع مختلفة.
  
 
== آلية الحل ==
 
== آلية الحل ==
 
# طبِّق [[Refactoring/replace constructor with factory method|استبدال المُنشِئ بتابع التصميم]] على الأصناف الفرعية.
 
# طبِّق [[Refactoring/replace constructor with factory method|استبدال المُنشِئ بتابع التصميم]] على الأصناف الفرعية.
# استبدل استدعاءات منشئ الصنف الفرعي باستدعاءات تابع تصميم الصنف الفائق.
+
# استبدل استدعاءات منشئ الصنف الفرعي باستدعاءات تابع تصميم الصنف الأب.
# في الصنف الفائق، حدِد حقول لتخزين قيم كل من توابع الأصناف الفرعية التي تقوم بإعادة قيم ثابتة.
+
# في الصنف الأب، حدِد حقولًا لتخزين قيم كل من توابع الأصناف الفرعية التي ستعمل على إعادة قيم ثابتة.
# أنشئ مُنشئ صنف فائق محمي لتهيئة الحقول الجديدة.
+
# أنشئ مُنشئ صنف أب محمي لتهيئة الحقول الجديدة.
# أنشئ أو عدِّل منشئات الأصناف الفرعية الموجودة بحيث تستدعي المُنشئ الجديد للصنف الأصل وتُمرِر القيم ذات الصلة إليه.
+
# أنشئ أو عدِّل منشئات الأصناف الفرعية الموجودة بحيث تستدعي المُنشئ الجديد للصنف الأب وتُمرِر القيم ذات الصلة إليه.
 
# طبِّق كل تابع ثابت في الصنف الأصل بحيث يُعيد قيمة الحقل المطابق. ثم أزِل التابع من الصنف الفرعي.
 
# طبِّق كل تابع ثابت في الصنف الأصل بحيث يُعيد قيمة الحقل المطابق. ثم أزِل التابع من الصنف الفرعي.
# إذا كان لدى منشئ الصنف الفرعي وظائف إضافية، استخدام [[Refactoring/inline method|تابع مُدمَج Inline]] لدمج منشئ في تابع التصميم الفائق.
+
# إذا كان لدى منشئ الصنف الفرعي وظائف إضافية، استخدم آلية [[Refactoring/inline method|دمج التوابع]] لدمج منشئ في تابع منتج للصنف الأب.
 
# احذف الصنف الفرعي.
 
# احذف الصنف الفرعي.
  
 
== انظر أيضًا ==
 
== انظر أيضًا ==
 +
* العملية العكسية: [[Refactoring/replace type code with class|تبديل رموز الأنواع بالأصناف الفرعية]].
 
* [[Refactoring/replace constructor with factory method|استبدال المُنشِئ بتابع التصميم]].
 
* [[Refactoring/replace constructor with factory method|استبدال المُنشِئ بتابع التصميم]].
 
* [[Refactoring/inline method|التوابع المُدمَجة]].
 
* [[Refactoring/inline method|التوابع المُدمَجة]].
* العملية العكسية: [[Refactoring/replace type code with class|تبديل رموز الأنواع بالأصناف الفرعية]].
 
  
 
== مصادر ==
 
== مصادر ==
* [https://refactoring.guru/replace-subclass-with-fields صفحة توثيق استبدال الأصناف الفرعية بالحقول في موقع refactoring.guru]. [[تصنيف:Refactoring]] [[تصنيف:Refactoring Techniques]] [[تصنيف:Refactoring Organizing Data]]
+
* [https://refactoring.guru/replace-subclass-with-fields صفحة توثيق استبدال الأصناف الفرعية بالحقول في موقع refactoring.guru]. [[تصنيف:Refactoring]] [[تصنيف:Refactoring Techniques]] [[تصنيف:Refactoring Organizing Data]]

المراجعة الحالية بتاريخ 07:05، 19 ديسمبر 2018

المشكلة

لديك أصناف فرعية تختلف فقط في توابع (إعادة الثوابت) الخاصة بها.

الحل

استبدال التوابع بالحقول في الصنف الأب وحذف الأصناف الفرعية.

مثال

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

لدينا الصنف Person الذي يحتوي على الصنفيين الفرعيين Male و Female؛ يختلف هذان الصنفان في القيمة المعادة فقط.

يحتوي الصنف Person يحتوي على الصنفيين الفرعيين Male و Female.
يحتوي الصنف Person يحتوي على الصنفيين الفرعيين Male و Female.

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

وضع حقول في الصنف Person الأب مكان مقابلة لحقول الصنف الفرعي Male و Female ثم حذف هذان الصنفان.

حذف الصنفان الفرعيان Male و Female من الصنف Person الأب بعد وضع حقول مقابلة للحقول الموجودة فيهما.
حذف الصنفان الفرعيان Male و Female من الصنف Person الأب بعد وضع حقول مقابلة للحقول الموجودة فيهما.

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

في بعض الأحيان تكون إعادة التصميم هي الحل لتجنب كتابة الشيفرة البرمجية.

في مثل هذه الحالة، قد يكون التسلسل الهرمي للأصناف الفرعية مختلفًا فقط في القيم المُعادة بواسطة توابع خاصة. هذه التوابع ليست حتى نتيجة الحساب، لكنها ضُبطت بدقة في التوابع نفسها أو في الحقول المُعادة من قِبَل التوابع. لتبسيط بِنية الصنف، يمكن ضغط هذا التسلسل الهرمي في صنف واحد يحتوي على حقل واحد أو عدة حقول بالقيم الضرورية، بحسب الحالة.

قد تصبح هذه التغييرات ضرورية بعد نقل كمية كبيرة من الوظائف من التسلسل الهرمي للصنف إلى مكان آخر. ويصبح التسلسل الهرمي الحالي غير ذا قيمة وتُصبح الأصناف الفرعية مجرد حِمل ميت.

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

 تبسيط بنية النظام. ويُعد إنشاء أصناف فرعية مُبالغةً إذا كان كل ما نريد القيام به هو إعادة قيم مختلفة في توابع مختلفة.

آلية الحل

  1. طبِّق استبدال المُنشِئ بتابع التصميم على الأصناف الفرعية.
  2. استبدل استدعاءات منشئ الصنف الفرعي باستدعاءات تابع تصميم الصنف الأب.
  3. في الصنف الأب، حدِد حقولًا لتخزين قيم كل من توابع الأصناف الفرعية التي ستعمل على إعادة قيم ثابتة.
  4. أنشئ مُنشئ صنف أب محمي لتهيئة الحقول الجديدة.
  5. أنشئ أو عدِّل منشئات الأصناف الفرعية الموجودة بحيث تستدعي المُنشئ الجديد للصنف الأب وتُمرِر القيم ذات الصلة إليه.
  6. طبِّق كل تابع ثابت في الصنف الأصل بحيث يُعيد قيمة الحقل المطابق. ثم أزِل التابع من الصنف الفرعي.
  7. إذا كان لدى منشئ الصنف الفرعي وظائف إضافية، استخدم آلية دمج التوابع لدمج منشئ في تابع منتج للصنف الأب.
  8. احذف الصنف الفرعي.

انظر أيضًا

مصادر