در ادامه مباحث ریفکتورینگ به بوی کدها می پردازیم.
مگر کدها بو می دهند؟ اگر سعی کنید بوی آنها را حس می کنید.نشانه های بوی بد کد ها را بشناسیم تا آنها را پیدا کنیم.
بزرگها!
کلاسها و متدهایی که آنقدر بزرگ می شوند که کار کردن با آنها سخت می شود. البته اوایل بوی بد نمی دهند اما هرچه بگذرد بزرگتر می شوند و بوی بد تری میدهند
متدهای بزرگ (Long Methods)
متدهایی که شامل خطوط زیادی هستند. معمولا متدهایی با بیش از 10 خط را متدهای بزرگ می دانیم
کلاسهای بزرگ (Large Classes)
کلاسهایی که تعداد زیادی فیلد و پراپرتی و متد را شامل می شوند
وسواس اولیه(Primitive Obsession)
پارامترهای زیاد(Long Parameter List)
بیش از سه یا چهار پارامتر برای یک متد نشانه این اشتباه است
توده داده(Data Clumps)
برخی اوقات قسمتهای مختلفی از کد شامل گروه هایی از گروههای یکسان از متغیرها (مانند پارامترهای اتصال به یک پایگاه داده) هستند. باید هر قطعه به کلاس مربوطه خودش منتقل شود
استفاده بد از شیء گرایی object orientation
سوئیچ ها(Switch Statements)
کد شامل تعداد زیادی switch یا if است
فیلدهای موقت (Temporary Field)
فیلدهای موقتی که فقط در بخش مورد استفاده کارایی دارند و در بقیه کد خالی هستند
ارث بری بدرد نخور (Refused Bequest)
اگر یک کلاس فقط از تعدادی از متد ها و پراپرتی های کلاسی که از آن مشتق شده استفاده می کند، این ارث بری بدرد نخور است.
متدهای نالازم به سادگی به متدهای بدون استفاده تبدیل می شوند یا دوباره تعریف می شوند و خطا ایجاد می کنند
کلاس های جایگزین با رابط های مختلف (Alternative Classes with Different Interfaces)
دو کلاس دارای توابعی هستند که کار یکسانی را انجام می دهند اما نام متدهای متفاوتی دارند.
تغییر ناپذیری
این بو به این معنی است که اگر شما نیاز به تغییر چیزی در یک مکان در کد خود دارید ، باید در مکان های دیگر نیز تغییرات زیادی ایجاد کنید. در نتیجه توسعه برنامه بسیار پیچیده تر و گران تر می شود.
تغییرات واگرا (Divergent Change)
هنگام ایجاد تغییر در یک کلاس ، مجبور می شوید بسیاری از متد های نامربوط را تغییر دهید. به عنوان مثال ، هنگام افزودن یک نوع محصول جدید ، باید متدهای یافتن ، نمایش و سفارش محصولات را تغییر دهید.
تشریح انفجاری (Shotgun Surgery)
ایجاد هرگونه تغییر ، مستلزم ایجاد تغییرات کوچک در بسیاری از کلاسهای مختلف است.
سلسله های وراثت موازی (Parallel Inheritance Hierarchies)
هر وقت یک زیرکلاس (sub class) برای یک کلاس ایجاد می کنید ، میبینید که لازم یک زیر کلاس برای یک کلاس دیگر هم بسازید.
اضافات
به هرچیزی گفته می شود که نبودش بهتر از بودنش است و نبودنش کد را ساده تر می کند
کامنتها(Comments)
متدی که با کامنت ها پر شده است
کد کپی(Duplicate Codes)
دو قطعه کد تقریباً یکسان به نظر می رسند.
کلاس تنبل(Lazy Class)
فهم و حفظ کلاس ها همیشه به وقت و هزینه نیاز دارد. بنابراین اگر یک کلاس به اندازه کافی توجه شما را جلب نکرد ، باید حذف شود.
کلاس داده(Data Class)
کلاس داده به یک کلاس اطلاق می شود که فقط فیلدها ها و متد های خام را برای دسترسی به آنها (getter و setter) دارد. این ها به سادگی توسط کلاسهای دیگر استفاده می شوند. این کلاس ها هیچ فانکشن اضافی ندارند و نمی توانند به طور مستقل روی داده هایی که در اختیار دارند کار کنند.
کد مرده(Dead Code)
متغیر ، پارامتر ، فیلد ، متد یا کلاسی که دیگر استفاده نمی شود (معمولاً به دلیل اینکه منسوخ است).
کلیت اضافی(Speculative Generality)
یک کلاس ، متد ، فیلد یا پارامتر استفاده نشده که نیازی به آن وجود ندارد.
ارتباطات (Couples)
این گروه شامل Coupling های زیادی بین کلاسها و یا استفاده بیش از حد از delegation است
ویژگی حسادت(Feature Envy)
یک متد بیشتر از داده های خود به داده های یک شی دیگر دسترسی پیدا می کند.
صمیمیت نامناسب(Inappropriate Intimacy)
یک کلاس از فیلدها و متدهای داخلی کلاس دیگر استفاده می کند.
زنجیرهای پیامها(Message Chains)
در کد یک سری از فراخوانی ها را مشاهده می کنید که شبیه $a->b()->c()->d()هستند
مردی در میانه(Middle Man)
اگر یک کلاس فقط یک عمل را انجام دهد ، کار را به کلاس دیگری واگذار کند ، چرا اصلاً وجود دارد؟
دیگر بو ها
موارد زیر در هیچ دسته بندی جای نمی گیرند
کلاس کتابخانه ناقص (Incomplete Library Class)
دیر یا زود کتابخانه ها (libraries) دیگر پاسخگوی نیاز کاربر نخواهند بود. راه ایجاد تغییرات در کتابخانه ها است که چون عموما فقط خواندنی (read only) هستند امکانپذیر نیست.