الفرق بين المراجعتين ل"Refactoring/inline class"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط
(مراجعة وتدقيق.)
 
سطر 10: سطر 10:
 
==== قبل إعادة التصميم ====
 
==== قبل إعادة التصميم ====
 
يحتوي الصنف <code>Person</code> على حقلٍ واحدٍ باسم <code>name</code> وتابعٍٍ للحصول على رقم الهاتف <code>getTelephoneNumber</code> ولاشيء آخر، أمّا الصنف <code>TelephoneNumber</code> فهو يحتوي على حقلين باسم <code>officeAreaCode</code> و <code>officeNumber</code> بالإضافة إلى التابع السابق <code>getTelephoneNumber</code>، كما هو موضَّحٌ في مخطط الأصناف الآتي:
 
يحتوي الصنف <code>Person</code> على حقلٍ واحدٍ باسم <code>name</code> وتابعٍٍ للحصول على رقم الهاتف <code>getTelephoneNumber</code> ولاشيء آخر، أمّا الصنف <code>TelephoneNumber</code> فهو يحتوي على حقلين باسم <code>officeAreaCode</code> و <code>officeNumber</code> بالإضافة إلى التابع السابق <code>getTelephoneNumber</code>، كما هو موضَّحٌ في مخطط الأصناف الآتي:
[[ملف:Inline-Class-Before.png|بديل=الصنف Person يحتوي على حقلٍ واحدٍ باسم name وتابعٍٍ للحصول على رقم الهاتف getTelephoneNumber، أمّا الصنف TelephoneNumber فهو يحتوي على حقلين باسم officeAreaCode و officeNumber بالإضافة إلى التابع السابق getTelephoneNumber.|بدون|إطار|الصنف Person يحتوي على حقلٍ واحدٍ باسم name وتابعٍٍ للحصول على رقم الهاتف getTelephoneNumber، أمّا الصنف TelephoneNumber فهو يحتوي على حقلين باسم officeAreaCode و officeNumber بالإضافة إلى التابع السابق getTelephoneNumber.|تصغير|570x570بك]]
+
[[ملف:Inline-Class-Before.png|بديل=الصنف Person يحتوي على حقلٍ واحدٍ باسم name وتابعٍٍ للحصول على رقم الهاتف getTelephoneNumber، أمّا الصنف TelephoneNumber فهو يحتوي على حقلين باسم officeAreaCode و officeNumber بالإضافة إلى التابع السابق getTelephoneNumber.|بدون|الصنف Person يحتوي على حقلٍ واحدٍ باسم name وتابعٍٍ للحصول على رقم الهاتف getTelephoneNumber، أمّا الصنف TelephoneNumber فهو يحتوي على حقلين باسم officeAreaCode و officeNumber بالإضافة إلى التابع السابق getTelephoneNumber.|500x500px|تصغير]]
 
==== بعد إعادة التصميم ====
 
==== بعد إعادة التصميم ====
 
دُمِج الصنف <code>TelephoneNumber</code> مع الصنف <code>Person</code> ليشمل كلَّ الحقول والتوابع الموجودة فيهما، كما في مخطط الأصناف الآتي:
 
دُمِج الصنف <code>TelephoneNumber</code> مع الصنف <code>Person</code> ليشمل كلَّ الحقول والتوابع الموجودة فيهما، كما في مخطط الأصناف الآتي:
[[ملف:Inline-Class-After.png|بديل=الصنف Person يحتوي على عددٍ من الحقول كاسم الشخص (name) ورمز منطقة المكتب (officeAreaCode) ورقمه (officeNumber)، وتابعًا للحصول على هذا الرقم باسم getTelephoneNumber.|بدون|إطار|الصنف Person يحتوي على عددٍ من الحقول كاسم الشخص (name) ورمز منطقة المكتب (officeAreaCode) ورقمه (officeNumber)، وتابعًا للحصول على هذا الرقم باسم getTelephoneNumber.|تصغير|207x207بك]]
+
[[ملف:Inline-Class-After.png|بديل=الصنف Person يحتوي على عددٍ من الحقول كاسم الشخص (name) ورمز منطقة المكتب (officeAreaCode) ورقمه (officeNumber)، وتابعًا للحصول على هذا الرقم باسم getTelephoneNumber.|بدون|الصنف Person يحتوي على عددٍ من الحقول كاسم الشخص (name) ورمز منطقة المكتب (officeAreaCode) ورقمه (officeNumber)، وتابعًا للحصول على هذا الرقم باسم getTelephoneNumber.|280x280px|تصغير]]
  
 
== لم إعادة التصميم؟ ==
 
== لم إعادة التصميم؟ ==
سطر 24: سطر 24:
 
# إنشاء حقولٍ وتوابع عامّةٍ (public fields/methods) في الصنف المستقبِل (recipient class) بما يتناسب مع الحقول والتوابع الموجودة في الصنف الأصليّ الذي سيُدمج.
 
# إنشاء حقولٍ وتوابع عامّةٍ (public fields/methods) في الصنف المستقبِل (recipient class) بما يتناسب مع الحقول والتوابع الموجودة في الصنف الأصليّ الذي سيُدمج.
 
# تبديل كل مرجعيّات (references) الصنف الأصليّ إلى مرجعيّات الحقول والتوابع الجديدة في الصنف المستقبِل.
 
# تبديل كل مرجعيّات (references) الصنف الأصليّ إلى مرجعيّات الحقول والتوابع الجديدة في الصنف المستقبِل.
# اختبار البرنامج والتأكُّد من عدم حدوث أيّ أخطاءٍ بالنتائج، وبمجرد اجتياز الاختبار بنجاح يجب البدء بتطبيق تقنيتي نقل التوابع (Move Methods) ونقل الحقول (Move Fields) لنقل المهام (functionality) بأكملها من الصنف الأصليّ إلى الصنف المستقبل، والاستمرار بنقلها إلى أن يصبح الصنف فارغًا بأكمله.
+
# اختبار البرنامج والتأكُّد من عدم حدوث أيّ أخطاءٍ بالنتائج، وبمجرد اجتياز الاختبار بنجاح يجب البدء بتطبيق تقنيتي [[Refactoring/move method|نقل التوابع]] (Move Methods) و<nowiki/>[[Refactoring/move field|نقل الحقول]] (Move Fields) لنقل المهام (functionality) بأكملها من الصنف الأصليّ إلى الصنف المستقبل، والاستمرار بنقلها إلى أن يصبح الصنف فارغًا بأكمله.
 
# حذف الصنف الأصليّ.
 
# حذف الصنف الأصليّ.
  
سطر 35: سطر 35:
 
* [https://refactoring.guru/inline-class صفحة توثيق دمج الصنف في موقع refactoring.guru.]
 
* [https://refactoring.guru/inline-class صفحة توثيق دمج الصنف في موقع refactoring.guru.]
 
[[تصنيف:Refactoring]]
 
[[تصنيف:Refactoring]]
 +
[[تصنيف:Refactoring Techniques]]
 +
[[تصنيف:Refactoring Moving Features between Objects]]

المراجعة الحالية بتاريخ 09:10، 2 مارس 2019

المشكلة

وجود صنفٍ (class) لا يقوم بأيّ مهمّة فعليّة ولا يُخطَّط لإضافة مهامٍ إليه لاحقًا.

الحل

نقل كافّة الميّزات (features) من هذا الصنف إلى صنفٍ آخر.

مثال

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

يحتوي الصنف Person على حقلٍ واحدٍ باسم name وتابعٍٍ للحصول على رقم الهاتف getTelephoneNumber ولاشيء آخر، أمّا الصنف TelephoneNumber فهو يحتوي على حقلين باسم officeAreaCode و officeNumber بالإضافة إلى التابع السابق getTelephoneNumber، كما هو موضَّحٌ في مخطط الأصناف الآتي:

الصنف Person يحتوي على حقلٍ واحدٍ باسم name وتابعٍٍ للحصول على رقم الهاتف getTelephoneNumber، أمّا الصنف TelephoneNumber فهو يحتوي على حقلين باسم officeAreaCode و officeNumber بالإضافة إلى التابع السابق getTelephoneNumber.
الصنف Person يحتوي على حقلٍ واحدٍ باسم name وتابعٍٍ للحصول على رقم الهاتف getTelephoneNumber، أمّا الصنف TelephoneNumber فهو يحتوي على حقلين باسم officeAreaCode و officeNumber بالإضافة إلى التابع السابق getTelephoneNumber.

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

دُمِج الصنف TelephoneNumber مع الصنف Person ليشمل كلَّ الحقول والتوابع الموجودة فيهما، كما في مخطط الأصناف الآتي:

الصنف Person يحتوي على عددٍ من الحقول كاسم الشخص (name) ورمز منطقة المكتب (officeAreaCode) ورقمه (officeNumber)، وتابعًا للحصول على هذا الرقم باسم getTelephoneNumber.
الصنف Person يحتوي على عددٍ من الحقول كاسم الشخص (name) ورمز منطقة المكتب (officeAreaCode) ورقمه (officeNumber)، وتابعًا للحصول على هذا الرقم باسم getTelephoneNumber.

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

يُلجَأ عادةً إلى دمج الصنف من بعد نقل ميّزاته (features) إلى أصناف أخرى بحيث يصبح الصنف مهملًا ولا أهمية لما يقوم به.

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

التقليل من الأصناف غير الضروريّة في البرنامج مما يعني استفادةً أكبر من الذاكرة أثناء التشغيل، وكذلك من دماغ المبرمج! فلِمَ يشغل تفكيره بأصنافٍ لا أهمية لها؟

آلية الحل

  1. إنشاء حقولٍ وتوابع عامّةٍ (public fields/methods) في الصنف المستقبِل (recipient class) بما يتناسب مع الحقول والتوابع الموجودة في الصنف الأصليّ الذي سيُدمج.
  2. تبديل كل مرجعيّات (references) الصنف الأصليّ إلى مرجعيّات الحقول والتوابع الجديدة في الصنف المستقبِل.
  3. اختبار البرنامج والتأكُّد من عدم حدوث أيّ أخطاءٍ بالنتائج، وبمجرد اجتياز الاختبار بنجاح يجب البدء بتطبيق تقنيتي نقل التوابع (Move Methods) ونقل الحقول (Move Fields) لنقل المهام (functionality) بأكملها من الصنف الأصليّ إلى الصنف المستقبل، والاستمرار بنقلها إلى أن يصبح الصنف فارغًا بأكمله.
  4. حذف الصنف الأصليّ.

انظر أيضًا

مصادر