Code Smells.
Indicators of deeper problems in code. Each entry links to the refactorings that treat it.
كلاسان يؤديان وظائف متطابقة لكنهما يمتلكان أسماء أساليب مختلفة.
إذا كانت الفئة الفرعية (subclass) تستخدم فقط بعض الدوال والخصائص الموروثة من فئاتها الأبوية، فإن التدرج الهرمي يكون غير متوازن. قد تظل الدوال غير المطلوبة ببساطة غير مستخدمة أو يتم إعادة تعريفها لإطلاق استثناءات (exceptions).
لديك عامل switch معقد أو سلسلة من عبارات if.
تحصل الحقول المؤقتة على قيمها (وبالتالي تكون الكائنات بحاجة إليها) في ظل ظروف معينة فقط. وخارج هذه الظروف، تظل فارغة.
أسلوب مليء بتعليقات توضيحية.
كلاس البيانات هو كلاس يحتوي فقط على حقول وأساليب بسيطة للوصول إليها (getters وsetters). هذه الكلاسات مجرد حاويات للبيانات تستخدمها كلاسات أخرى، ولا تحتوي على أي وظائف إضافية ولا تستطيع التعامل باستقلالية مع البيانات التي تملكها.
متغير أو معامل أو حقل أو أسلوب أو كلاس لم يعد مستخدماً (عادةً لأنه أصبح قديماً).
يبدو مقطعا الكود متطابقَين تقريباً.
فهم الفئات وصيانتها يكلفان دائماً وقتاً ومالاً. لذا إذا كانت الفئة لا تفعل ما يكفي لتستحق اهتمامك، فيجب حذفها.
هناك فئة أو دالة أو حقل أو معامل (parameter) غير مستخدم.
في بعض الأحيان تحتوي أجزاء مختلفة من الكود على مجموعات متطابقة من المتغيرات (مثل معاملات الاتصال بقاعدة البيانات). ينبغي تحويل هذه التجمعات إلى كلاسات مستقلة.
تحتوي الكلاس على حقول/دوال/أسطر كود كثيرة.
تحتوي الدالة على عدد كبير جداً من أسطر الكود. بشكل عام، أي دالة يزيد طولها عن عشرة أسطر يجب أن تدفعك إلى التساؤل.
أكثر من ثلاثة أو أربعة معاملات في الدالة.
استخدام الأنواع الأساسية (primitives) بدلاً من الكائنات الصغيرة للمهام البسيطة (مثل العملة، النطاقات، سلاسل النصوص الخاصة بأرقام الهواتف، إلخ.) استخدام الثوابت لترميز المعلومات (مثل الثابت USER_ADMIN_ROLE = 1 للإشارة إلى المستخدمين الذين لديهم صلاحيات المسؤول.) استخدام الثوابت النصية كأسماء حقول للاستخدام في مصفوفات البيانات.
تجد نفسك مضطراً لتغيير كثير من الوظائف غير المترابطة عند إجراء تغييرات على فئة. على سبيل المثال، عند إضافة نوع منتج جديد يتعين عليك تغيير وظائف البحث والعرض وطلب المنتجات.
كلما قمت بإنشاء فئة فرعية (subclass) لفئة ما، تجد نفسك بحاجة إلى إنشاء فئة فرعية لفئة أخرى.
يتطلب إجراء أي تعديلات إجراء العديد من التغييرات الصغيرة على العديد من الفئات المختلفة.
تصل إحدى الوظائف إلى بيانات كائن آخر أكثر من بياناتها الخاصة.
تستخدم إحدى الفئات الحقول والوظائف الداخلية لفئة أخرى.
في الكود، ترى سلسلة من الاستدعاءات تشبه $a->b()->c()->d()
إذا كانت الفئة تؤدي عملاً واحداً فقط، وهو تفويض العمل إلى فئة أخرى، فلماذا توجد على الإطلاق؟