مقدمه

پیش از این راجع به Bad Smell و کاربرد آن در مهندسی نرم افزار صحبت کردیم "مرد واسطه" یکی از 22 نوع Bad Smell میباشد.

نحوه تشخیص و معرفی راه حل مرد واسطه
یکی از فواید اصلی اشیا Encapsulation میباشد یعنی جزئیات داخلی را از بقییه اشیا مخفی کنیم Encapsulation معمولا با نوعی همراهی بوجود می آید شما از یک کارگردان میپرسید که برای یک ملاقات وقت آزاد دارد او به دفترسررسید اش رجوع میکند و دفتر سر رسید به شما یک جواب می دهد همه چیز به خوبی انجام میشود. نیازی نیست که بدانید کارگردان دفتر سررسید واقعی دارد یا از نسخه الکترونیکی استفاده میکند یا از یک منشی برای مدیریت کردن قرار ملاقات ها استفاده می کند.
اما با زیاد شدن واسطه ها و پیچ خم ها قضیه به این خوبی باقی نمی ماند. شما به interface یک کلاس نگاه می کنید و میبینید که نصف متد ها با همراهی یک کلاس دیگر در حال انجام است. بعد از چندی نیاز است که با روش حذف مرد واسطه مستقیما از خود شی بپرسیم که اوضاع از چه قرار است! اگر تعداد کمی توابع وجود دارند که کار زیادی نمیکنند از روش توابع درخط استفاده کنید تا آنها را به صدا زننده منتقل کنید. اگر یک رفتار اضافی وجود دارد میتوانید از روش جایگزینی همراهی با وراثت[1] استفاده کنید تا مرد واسطه را به یک زیرکلاس از شی واقعی تبدیل کنید این به شما کمک میکند که قابلیت ها را بدون دنبال کردن تمامی آن همراهی ها تکامل بخشید.
[1] Replace Delegation with Inheritance

مقدمه

پیش از این راجع به Bad Smell و کاربرد آن در مهندسی نرم افزار صحبت کردیم "زنجیر پیام" یکی از 22 نوع Bad Smell میباشد.

نحوه تشخیص و معرفی راه حل زنجیر پیام
شما زنجیر پیام را وقتی می بینید که یک مشتری یک شی را برای یک شی دیگر طلب میکند سپس شی دیگر را طلب میکند و باز شی دیگری را طلب میکند و به این طریق شما تعداد زیادی خط به صورت getThis می بینید یا یک دنباله ای از temp ها رسیدن به این مکان به معنی استفاده بیش از حد از جهت دادن است. ( ارجاع به گرفتن شی از کلاس های دیگر)
شما میتوانید از روش پنهان سازی وکیل[1] در مکان های مختلف زنجیر استفاده کنید. اما انجام زیاد اینکار میتواند هر واسطه را به یک middle man تبدیل کند. اغلب یک روش بهتر این است که ببینیم شی ساخته شده برای چه استفاده می شود سپس میتوان با روش استخراج متد تکه هایی از کدی که استفاده می شود را برداشت و با روش انتقال متد به زنجیر های پایین منتقل کرد.
[1] Hide Delegate

مقدمه

پیش از این راجع به Bad Smell و کاربرد آن در مهندسی نرم افزار صحبت کردیم "متغیر موقت" یکی از 22 نوع Bad Smell میباشد.

نحوه تشخیص و معرفی راه حل متغیر موقت
ممکن است یک تعداد متغیر برای شرایط بخصوصی در یک کلاس قرار داده شده باشد. درک این کد دشوار است چون شما انتظار دارید یک کلاس از تمامی متغیر هایش استفاده نماید سعی در فهم اینکه چرا یک متغیر در کلاس قرار داده شده وقتی بنظر نمیرسد استفاده ای داشته باشد منجر به هدر رفتن زمان میشود.
از روش استخراج کلاس برای متغیر های اضافه استفاده کنید و در آنجا تمامی کد هایی که نیازمند آن متغیر ها هستند را به کار ببرید. شما همچنین میتوانید کد های شرطی را با روش معرفی شی Null استفاده کنید تا یک جایگزینی برای وقتی باشد که داده متغیر ها درست نیست.

مقدمه

پیش از این راجع به Bad Smell و کاربرد آن در مهندسی نرم افزار صحبت کردیم "عمومیت خطرناک" یکی از 22 نوع Bad Smell میباشد.

نحوه تشخیص و معرفی راه حل عمومیت خطرناک
مردم اغلب میگویند که "من فکر میکنم ممکن است ما یک روز نیاز به این قابلیت داشته باشیم" و به خاطر این تمامی زیر و بم ها و شرایط خاص که نیاز نیست را بررسی و تبدیل به کد میکنند. نتیجه اغلب برای درک و استفاده سختتر میشود. اگر تمام این قابلیت ها استفاده میشد این حرکت ارزشمند بود ولی حالا که نیست ارزش چندانی ندارد پس از شر این سیستم خلاص شوید.
اگر کلاس های abstract ای دارید که کار چندانی انجام نمی دهند از روش فروپاشی سلسله استفاده کنید.
تعاریف غیرضروری میتوانند با روش کلاس های درخط حذف شوند. روی متد هایی که پارامتر های استفاده نشده دارند باید روش حذف پارامتر را اعمال کرد و برای متد هایی که اسم های عجیب غریب abstract دارند باید با روش تغییر نام متد دارای نامی معقول و معمولی شوند.

مقدمه

پیش از این راجع به Bad Smell و کاربرد آن در مهندسی نرم افزار صحبت کردیم "کلاس تنبل" یکی از 22 نوع Bad Smell میباشد.

نحوه تشخیص و معرفی راه حل کلاس تنبل
هر کلاسی که میسازید هزینه ای برای استفاده و درک دارد یک کلاس که به اندازه لازم کاری انجام نمیدهد که این هزینه را بپردازید میبایست حذف شود ممکن است این کلاس با refactoring ایجاد شده باشد یا برای تغییرات برنامه ریزی شده ایجاد شده باشد که صورت نگرفته است در هر صورت شما باید این کلاس را از بین ببرید اگر زیرکلاس هایی دارید که به اندازه مفید نیستند از روش فروپاشی سلسله[1] استفاده کنید. برای کلاس هایی که فایده اندک دارند از روش کلاس های درخط استفاده کنید.
[1] Collapse Hierarchy

مقدمه

پیش از این راجع به Bad Smell و کاربرد آن در مهندسی نرم افزار صحبت کردیم "سلسله های وراثت موازی" یکی از 22 نوع Bad Smell میباشد.

نحوه تشخیص و معرفی راه حل سلسله های وراثت موازی
سلسله های وراثت موازی یک حالت تشریح انفجاری هست. در این حالت هر وقت شما یک زیر کلاس از یک کلاس می سازید باید یک زیر کلاس از کلاس دیگر هم بسازید شما میتوانید به سادگی این موضوع را با پسوند نام کلاس هایی که میسازید متوجه شوید.
استراتژی عمومی برای برخورد با این دوگانگی پیدا کردن یک وراثت که به وراثت دیگری رجوع کند میباشد اگر این چنین است میتوانید از انتقال متد و انتقال فیلد برای از بین بردن رجوع در سلسه مراتب کلاس استفاده کنید.

مقدمه

پیش از این راجع به Bad Smell و کاربرد آن در مهندسی نرم افزار صحبت کردیم "دستور سوییچ" یکی از 22 نوع Bad Smell میباشد.

نحوه تشخیص و معرفی راه حل دستور سوییچ
بیشتر مواقع که یک دستور switch می بینید باید به حساب چند ریختی یا Poly-Morphism بگزارید این مشکل وقتی که باید چند ریختی رخ دهد به وجود می آید. معمولا switch برای یک کد نوع استفاده می شود شما یک متد میخواهید که کد نوع را برگرداند. میتوانید از استخراج متد برای استخراج switch استفاده کنید و با انتقال متد تابع را به کلاس ای که پولی مورفیسم در آن نیاز است منتقل کنید. در آن زمان نیاز به انتخاب بین روش جایگزینی نوع کد با کلاس زیر[1] یا از روش جایگزینی نوع کد با حالت[2] دارید. وقتی که ساختار وراثت را مشخص کردید میتوانید از جایگزینی عبارت شرطی با پولی مورفیسم[3] استفاده کنید.

برای مثال ممکن است در کلاس کارمند، تابع محاسبه حقوق یک switch وجود داشته باشد که بر اساس کد از پیش مشخص شده کارمند یکی از دو حالت روزمزد و استخدامی را برای محاسبه حقوق انتخاب کند. در این صورت باید از کلاس کارمند دو کلاس کارمند روزمزد و کارمند استخدامی مشتق کنید و این تفاوت های چند ریختی را آنجا اعمال کنید.

[1] Replace Type Code with Subclass
[2] Replace Type Code with State/Strategy
[3] Replace Conditional with Polymorphism

مقدمه

پیش از این راجع به Bad Smell و کاربرد آن در مهندسی نرم افزار صحبت کردیم "وسواس اولیه" یکی از 22 نوع Bad Smell میباشد.

نحوه تشخیص و معرفی راه حل وسواس اولیه
اکثر زبان های برنامه نویسی دارای انواع رکورد و اولیه هستند انواع اولیه ( مانند int و byte و char و ...( در ساخت بلوک ها بکار میروند و با انواع رکورد میتوان اطلاعات را در گروه های معنا دار ساختار بندی کرد. یک چیز ارزشمند در مورد اشیا این است که آنها مرز بین انواع اولیه و کلاس های بزرگ تر را محو کردند.

افرادی که به تازگی با اشیا آشنا شده اند از استفاده از اشیا کوچک برای کارهای کوچک اجتناب میکنند مثلا کلاسی پول که عدد و نوع پول را ترکیب میکند یا کلاس بازه که از دو عدد شروع و پایان تشکیل شده است شما میتوانید انواع مستقل را با روش جایگزینی مقدار داده با شی[1] به یک شی تبدیل کنید اگر مقدار داده یک از نوع کد بود از روش جایگزینی نوع کد با کلاس[2] استفاده کنید اگر مقدار در رفتار تاثیر گذار نیست به خودتان بستگی دارد که از روش جایگزینی نوع کد با کلاس زیر[3] یا از روش جایگزینی نوع کد با حالت[4] استفاده کنید.

[1] Replace Data Value with Object
[2] Replace Type Code with Class
[3] Replace Type Code with Subclass
[4] Replace Type Code with State/Strategy

مقدمه

پیش از این راجع به Bad Smell و کاربرد آن در مهندسی نرم افزار صحبت کردیم "توده داده" یکی از 22 نوع Bad Smell میباشد.

نحوه تشخیص و معرفی راه حل توده داده
بنظر میرسد که داده مثل کودک تمایل دارد با داده های دیگر در یک گروه جمع شود و بازی کند! معمولا شما در مکان های مختلف سه یا چهار داده مختلف را باهم میبینید، مثلا به عنوان متغیر در یک تعداد کلاس یا پارامتر یک سری تابع. گام اول این است که ببینید کجا توده به عنوان متغیر ظاهر شده است. روی آن متغییر ها روش استخراج کلاس را اجرا کنید تا توده تبدیل به یک شی شود. سپس به امضا توابع با استفاده از روش های معرفی پارامتر و حفظ تمامی شی توجه کنید. راجع به توده داده هایی که فقط از چند فیلد شی جدید استفاده میکنند نگران نباشید، انتقال دو یا بیشتر متغیر به یک شی جدید همیشه یک قدم رو به جلو محسوب میشود.

مقدمه

پیش از این راجع به Bad Smell و کاربرد آن در مهندسی نرم افزار صحبت کردیم "خصیصه حسادت" یکی از 22 نوع Bad Smell میباشد.


نحوه تشخیص و معرفی راه حل خصیصه حسادت
تمامی فایده شی بسته بندی داده ها با رویه های روی آنها می باشد. یکی از بو های دیگر این است که ببینیم یک متد بیشتر از کلاسی که در آن قرار دارد به کلاس دیگری متمایل است. بیشترین تمرکز حسادت روی داده است شمار توابعی که برای اجرا نیازمند گرفتن داده از شی دیگری هستند بسیار زیاد است. خوشبختانه درمان واضح است متد می خواهد جای دیگری باشد پس شما میتوانید از روش انتقال متد برای جا به جایی استفاده کنید. بعضی وقت ها تنها بخشی از متد حسادت دارد در این مورد ابتدا از روش استخراج متد در بخش حسود و سپس از روش انتقال متد برای انتقال به جای مناسب استفاده نمایید.