بوی بدِ کد – Bad Smells

در ادامه مباحث ریفکتورینگ به بوی کدها می پردازیم.مگر کدها بو می دهند؟ اگر سعی کنید بوی آنها را حس می کنید.نشانه های بوی بد کد ها را بشناسیم تا آنها را پیدا کنیم.بزرگها!کلاسها و متدهایی که آنقدر بزرگ می شوند که کار کردن با آنها سخت می شود. البته اوایل بوی بد نمی دهند اما هرچه بگذرد بزرگتر می شوند و بوی بد تری میدهندمتدهای بزرگ (Long Methods)متدهایی که شامل خطوط زیادی هستند. معمولا متدهایی با بیش از 10 خط را متدهای بزرگ می دانیمکلاسهای بزرگ (Large Classes)کلاسهایی که تعداد زیادی فیلد و پراپرتی و متد را شامل می شوندوسواس اولیه(Primitive Obsession)استفاده از کلاسها و آبجکتها به جای مقدارهای ساده اولیه (مثل bool ,int,..)استفاده از مقادیر ثابت (const) برای رمز گذاری اطلاعات (مثل USER_ADMIN_ROLE = 1 برای اعطای دسترسی به کاربر ادمین)استفاده از مقادیر رشته ای ثابت برای نام فیلدها در آرایه هاپارامترهای زیاد(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) هستند امکانپذیر نیست.منبع