الفرق بين المراجعتين لصفحة: «Refactoring/smells/oo abusers»
< Refactoring | smells
جميل-بيلوني (نقاش | مساهمات) إنشاء الصفحة. |
جميل-بيلوني (نقاش | مساهمات) طلا ملخص تعديل |
||
سطر 3: | سطر 3: | ||
# [[Refactoring/alternative classes with different interfaces|استخدام الأصناف البديلة (alternative) ذات الواجهات (interfaces) المختلفة]] | # [[Refactoring/alternative classes with different interfaces|استخدام الأصناف البديلة (alternative) ذات الواجهات (interfaces) المختلفة]] | ||
#* '''المشكلة''': التطابق بالمهام ما بين صنفين ولكن بأسماءٍ مختلفةٍ لتوابعهما. | #* '''المشكلة''': التطابق بالمهام ما بين صنفين ولكن بأسماءٍ مختلفةٍ لتوابعهما. | ||
#* '''الحل''': حذف أحد الصنفين بعد تنفيذ إحدى الحلول الآتية: [[Refactoring/rename method|إعادة تسمية التوابع (methods)]] لتصبح متطابقةً بكافّة الأصناف البديلة، أو توحيد التوقيع (signature) وتعريف الاستخدام ما بين التوابع (إمّا <nowiki/>[[Refactoring/move method|بنقل التابع]] أو <nowiki/>[[Refactoring/add parameter|إضافة المعاملات]] أو <nowiki/>[[Refactoring/parameterize method|دمج التوابع عبر المعاملات]])، أو [[Refactoring/extract superclass|استخراج صنفٍ أعلى]]<nowiki/>وجعلهما صنفين فرعيين له (إن كان التطابق جزئيًا). | #* '''الحل''': حذف أحد الصنفين بعد تنفيذ إحدى الحلول الآتية: [[Refactoring/rename method|إعادة تسمية التوابع (methods)]] لتصبح متطابقةً بكافّة الأصناف البديلة، أو توحيد التوقيع (signature) وتعريف الاستخدام ما بين التوابع (إمّا <nowiki/>[[Refactoring/move method|بنقل التابع]] أو <nowiki/>[[Refactoring/add parameter|إضافة المعاملات]] أو <nowiki/>[[Refactoring/parameterize method|دمج التوابع عبر المعاملات]])، أو [[Refactoring/extract superclass|استخراج صنفٍ أعلى]] <nowiki/>وجعلهما صنفين فرعيين له (إن كان التطابق جزئيًا). | ||
# [[Refactoring/refused bequest|الوراثة الفائضة (refused bequest)]] | # [[Refactoring/refused bequest|الوراثة الفائضة (refused bequest)]] | ||
#* '''المشكلة''': استفادة الصنف الفرعيّ من القليل فقط ممّا ورِثه عن الصنف الأعلى من توابعَ وحقولٍ، لتبقى التوابع الأخرى غيرَ مُستخدَمةٍ أو قد يُعاد تعريفها مع الكثير من الاختلافات. | #* '''المشكلة''': استفادة الصنف الفرعيّ من القليل فقط ممّا ورِثه عن الصنف الأعلى من توابعَ وحقولٍ، لتبقى التوابع الأخرى غيرَ مُستخدَمةٍ أو قد يُعاد تعريفها مع الكثير من الاختلافات. |
المراجعة الحالية بتاريخ 13:46، 26 فبراير 2019
من مشاكل الشيفرات أيضًا التطبيقُ الخطأ وغير المكتمل لمبادئ البرمجة كائنية التوجّه (Object-Oriented)، مثل:
- استخدام الأصناف البديلة (alternative) ذات الواجهات (interfaces) المختلفة
- المشكلة: التطابق بالمهام ما بين صنفين ولكن بأسماءٍ مختلفةٍ لتوابعهما.
- الحل: حذف أحد الصنفين بعد تنفيذ إحدى الحلول الآتية: إعادة تسمية التوابع (methods) لتصبح متطابقةً بكافّة الأصناف البديلة، أو توحيد التوقيع (signature) وتعريف الاستخدام ما بين التوابع (إمّا بنقل التابع أو إضافة المعاملات أو دمج التوابع عبر المعاملات)، أو استخراج صنفٍ أعلى وجعلهما صنفين فرعيين له (إن كان التطابق جزئيًا).
- الوراثة الفائضة (refused bequest)
- المشكلة: استفادة الصنف الفرعيّ من القليل فقط ممّا ورِثه عن الصنف الأعلى من توابعَ وحقولٍ، لتبقى التوابع الأخرى غيرَ مُستخدَمةٍ أو قد يُعاد تعريفها مع الكثير من الاختلافات.
- الحل: تطبق إحدى الحلول التالية بناءً على حالة الاستخدام: تبديل الوراثة إلى تفويض، أو التخلُّص من حقول وتوابع الصنف الأعلى غير المستخدمة في الصنف الفرعيّ.
- الشكل المعقَّد لتعليمة switch
- المشكلة: وجود تركيبٍ معقَّدٍ لتعليمة
switch
أو عدّة تعليماتif
متسلسلة. - الحل: هنالك عدة حلول تختلف بحسب الحالة هي: عزل تعليمة
switch
ووضعها بالصنف الصحيح، أو تبديل شيفرة النوع إلى صنف فرعيّ أو تبديل شيفرة النوع إلى حالة/استراتيجيّة، أو تبديل التعليمات الشرطيّة إلى التعدّدية الشكليّة، أو تقسيم التابع ذي الاستدعاءات المتكررة إلى توابع أصغر، أو إنشاء كائن null.
- المشكلة: وجود تركيبٍ معقَّدٍ لتعليمة
- الحقول المؤقّتة (temporary fields)
- المشكلة: تحتوي الحقول المؤقَّتة على قيمٍ (وتُستخدَم وفقًا لها في الكائنات [objects]) ضمن شروطٍ مُحدَّدة، وتبقى فارغةً عند عدم تحقٌّق تلك الشروط.
- الحل: عزل الحقول المؤقتَّة -وكلِّ الشيفرات المرتبطة بها- في صنفٍ (class) مستقلٍ عبر إنشاءٍ صنفٍ جديدٍ ونقلها إليه، أو إنشاء كائن
null
(null object) واستخدامه بدلًا من الشيفرة الشرطيّة المُستخدمة للتحقُّق من وجود القيم بالحقول المؤقَّتة.