هیچ کلاسی کامل نیست. در مواقع زیادی ممکن است یک کلاس نیاز به متدی داشته باشد که در آن وجود ندارد. در چنین شرایطی اگر سورس کلاس را در دست داشته باشیم به راحتی میتوان رفتار مورد نظر را به آن اضافه کرد. اما اگر از کلاسهایی استفاده میکنیم که سورس آنها در دست نیست، حل این مورد کمی مشکل خواهد بود. برای مدیریت و رفع این مورد، دو بازسازی کد وجود دارند که به جهت همسویی این دو، آنها را در یک نوشتار پوشش میدهیم. نیاز به متد جدید در یک کلاس ...
زمانی نیاز به این بازسازی کد بهوجود میآید که استفاده کنندهی از کلاسها، درگیر جزییات بیش از اندازهی کلاسها میشود. به طور مثال به نمودار بالا توجه نمایید. در این نمودار تکه کدی مدل شده است که در آن ClientClass استفاده کننده از امکانات دو کلاس دیگر است. برای بدست آوردن مدیر یک شخص در این طراحی نیاز است ابتدا ClientClass اطلاعات مربوط به department یک شخص را با استفاده از متد GetDepartment بدست آورد. سپس با استفاده از متد GetMa ...
معمولا زمانیکه متدی از امکانات کلاس دیگری غیر از کلاسی که در آن تعریف شده است استفاده میکند، نیاز به چنین بازسازی کدی داریم. روش کلی این بازسازی کد، انتقال متد به کلاسی است که بیشترین تعلق را به آن دارد! جابجایی متد یکی از موارد پر تکرار و مهم در امر بازسازی کد است. این بازسازی در مراحل انجام دیگر بازسازیهای کد، مانند شکستن کلاس نیز استفاده میشود. با این روش ساده میتوان کلاسهایی با مسئولیتهای محدود و مشخص را توسعه داد. ...
این کد بد بو در دسته « جلوگیری کنندگان از تغییر » قرار میگیرد. معمولا زمانیکه فراخوانیهایی مانند تکه کد زیر را در بخشی از کد مشاهده کردید، با چنین کد بد بویی مواجه هستید. MethodA().MethodB().MethodC(); فراخوانی هر یک از این متدها در خطی مجزا از کد نیز تشکیل دهندهی این الگوی بد است. استفاده کنندهی از این زنجیره پیام، برای استفادهی درست از آن، باید در جریان هریک از حلقههای زنجیره و ترتیب فراخوانی آنها باشد. در صورتیکه هر ...
دلال یا Middle man در دسته الگوهای « کدهایی بیش از اندازه وابسته به هم » قرار میگیرد. زمانیکه یک کلاس، تنها کاری را که انجام میدهد، هدایت فراخوانی به کلاس دیگری باشد، با این الگو مواجه هستیم. تشخیص این کد بد بو معمولا بسیار آسان است. به طور مثال: public class ProductQuery
{
public dynamic GetProductsByCustomerId(int id)
{
return new ExpandoObject();
}
}
p ...
متد حسود یا Feature envy در دسته بندی « کدهایی بیش از اندازه، وابسته به هم » قرار میگیرد. چنین متدی بیش از آنکه از فیلدها و خصوصیات کلاس خود استفاده کند، از فیلدها و خصوصیات شیء دیگری از نوعی دیگر، استفاده میکند. یکی از اشکالات کدهای بیش از اندازه وابسته به هم، دشواری در نگهداری و تغییر کد است. بهطوریکه در زمان تغییر بخشی از کد، نیاز است بخشهای مرتبط نیز مورد بررسی قرار گیرند. همچنین وابستگی بیش از اندازه کلاسها به یکدیگر قابل ...
این کد بد بو در دسته « جلوگیری کنندگان از تغییر » قرار میگیرد. اگر زمان ایجاد یک کلاس فرزند برای کلاسی، مجبور به ایجاد یک کلاس فرزند متناظر آن برای کلاس دیگری باشید، با این کد بد بود مواجه هستید. معمولا زمانی این اتفاق میافتد که یک درخت ارث بری به درخت ارث بری دیگری وابسته باشد. بهطوری که هر یک از کلاسهای موجود در آن، با یک کلاس در درخت دیگر متناظر باشند و ارتباط داشته باشند. این امر ایجاد تغییرات در کد را با مشکل مواجه خواهد کرد. ...
فیلد موقتی یا Temporary field در دسته بندی الگوهای « بد استفاده کنندگان از شیء گرایی » قرار میگیرد. در این الگوی بد، فیلدها یا خصوصیات یک کلاس، در شرایط خاصی مقدار گرفته و مورد استفاده قرار میگیرند و در بقیه شرایط خالی هستند. زمانیکه در یک کلاس، متدی برای انجام فعالیت خود، تعدادی پارامتر ورودی زیادی نیاز داشته باشد، ممکن است برنامه نویس برای مواجه نشدن با تعداد پارامترهای زیاد ورودی، فیلدها یا خصوصیاتی را در کلاس مربوط به آن متد ایجا ...
این کد بد بو در دسته « بد استفاده کنندگان از شیء گرایی » قرار میگیرد. زمانیکه گذارههای switch و یا دنبالهای از گذارههای if در کد وجود داشته باشد، معمولا با چنین الگویی روبرو هستیم. تشخیص این کد بد بو نیز بسیار آسان است. در شرایط نادری استفاده از switch میتواند یک طراحی شیء گرای مناسب باشد. در طراحی شیء گرا معمولا یک گذاره switch نشان دهنده یک رابطه چند ریختی (Polymorphism) نادیده گرفته شده است. معمولا زمانیکه بجای استفاده از اص ...
مهمترین دستاورد الگوی شیء نال ( Null Object Pattern ) این است که جریان کنترل (branch ) برای شاخه مثبت و منفی یکسان است و هیچگونه انشعاب شرطی بر اساس آزمونهای null وجود ندارد. شیءهای حقیقی دارای یک سری از رفتارها هستند؛ ولی Null Object معمولا هیچ کاری را انجام نمیدهد. Null Object دارای هیچگونه اطلاعاتی نیست. اگر ما یک برنامه تجارت داشتیم که در آن درخواست خرید، Null Object را برگرداند، در واقع تمام سر نخهایی را که چرا عملیات با ...