در حالتهایی که متغیر موقتیای در متد وجود دارد که چندین بار مقدار دهی میشود، احتمالا به چنین بازسازی کدی نیاز است. قبل از ادامه بحث در این باره نیاز است یک نوع از متغیرهای محلی را بررسی کرد. متغیر محلی تجمعی (Collecting temporary variable): متغیری ای که در بدنه متد یا عبارتهای loop مقدار آن به مرور تکامل مییابد یا اضافه میشود. نمونهای از چنین متغیرهایی شمارندههای loop و یا رشتههایی هستند که بسته به شرایط خاص در متد تولید و م ...
زمانیکه عبارت شرطی، یا محاسبات پیچیدهای در کد وجود دارد، میتوان آن را به بخشهای کوچکتری تقسیم و برای هر بخش، یک متغیر توضیحی ایجاد کرد؛ به طوریکه نام متغیر، توضیح کافی ای در مورد آن بخش از عبارت باشد. در ادامهی این بازسازی کد، معمولا میتوان بازسازی کد جایگزینی متغیر موقتی با پرس و جو (Replace temp with query) را انجام داد. زیرا متغیرهای محلی صرفا در محدودهی متد خود قابل دسترسی هستند و ممکن است توسعهی یک متد بلند را به همراه ب ...
زمانیکه متغیری برای نگهداری موقت نتیجهی یک expression تعریف شدهاست، بهتر است expression مربوطه به متدی انتقال پیدا کرده و تمامی استفادهها از متغیر موقتی با فراخوانی متد ایجاد شده جایگزین شوند. مشکل اصلی در ارتباط با متغیرهای محلی، ترویج ایجاد متدهای بلند توسط آنها است. مشخص است که این متغیرها در بدنه متد خود قابل استفاده هستند و تنها راه اشتراک مقدار آنها طولانیتر شدن متد است. اما زمانیکه این متغیرها با متد پرس و جوی مرتبط با آن جا ...
در این بازسازی، با قطعه کدی روبرو هستیم که میتوانیم آن را به صورت یک متد جدید، گروهبندی کنیم. نام متد، توضیح دهنده عملیاتی است که توسط آن قطعه کد انجام میشود. این بازسازی یکی از پر استفادهترین بازسازیهای کد است. معمولا زمانیکه متدی بلند باشد یا تکه کدی نیاز به کامنتی برای توضیح درباره کاری که انجام میدهد داشته باشد، چنین بازسازی ای نیاز است. در صورتیکه نام متدها به طور مناسبی انتخاب شوند، ایجاد متدهای کوچک از دو جهت مفید است: ...
بازسازی کد یا Refactoring ، یکی از روالهای بسیار مهم در حفظ کیفیت نرم افزار است. انجام به موقع و مداوم این روال در یک پروژه نرم افزاری، اثرات بلند مدت بسیار مثبتی را برای آن خواهد داشت. این نوشتار مقدمه کوتاهی بر مفاهیم ابتدایی و سوالاتی مهم در این زمینه است. تعریف بازسازی کد از نظر لغوی Refactoring به معنی «بازسازی» است و در منابع مهندسی نرم افزار، بازسازی کد به صورت زیر تعریف شده است: ...
این کد بد بو در دسته « جلوگیری کنندگان از تغییر » قرار میگیرد. معمولا زمانیکه فراخوانیهایی مانند تکه کد زیر را در بخشی از کد مشاهده کردید، با چنین کد بد بویی مواجه هستید. MethodA().MethodB().MethodC(); فراخوانی هر یک از این متدها در خطی مجزا از کد نیز تشکیل دهندهی این الگوی بد است. استفاده کنندهی از این زنجیره پیام، برای استفادهی درست از آن، باید در جریان هریک از حلقههای زنجیره و ترتیب فراخوانی آنها باشد. در صورتیکه هر ...
دلال یا Middle man در دسته الگوهای « کدهایی بیش از اندازه وابسته به هم » قرار میگیرد. زمانیکه یک کلاس، تنها کاری را که انجام میدهد، هدایت فراخوانی به کلاس دیگری باشد، با این الگو مواجه هستیم. تشخیص این کد بد بو معمولا بسیار آسان است. به طور مثال: public class ProductQuery
{
public dynamic GetProductsByCustomerId(int id)
{
return new ExpandoObject();
}
}
p ...
متد حسود یا Feature envy در دسته بندی « کدهایی بیش از اندازه، وابسته به هم » قرار میگیرد. چنین متدی بیش از آنکه از فیلدها و خصوصیات کلاس خود استفاده کند، از فیلدها و خصوصیات شیء دیگری از نوعی دیگر، استفاده میکند. یکی از اشکالات کدهای بیش از اندازه وابسته به هم، دشواری در نگهداری و تغییر کد است. بهطوریکه در زمان تغییر بخشی از کد، نیاز است بخشهای مرتبط نیز مورد بررسی قرار گیرند. همچنین وابستگی بیش از اندازه کلاسها به یکدیگر قابل ...
این کد بد بو در دسته « جلوگیری کنندگان از تغییر » قرار میگیرد. اگر زمان ایجاد یک کلاس فرزند برای کلاسی، مجبور به ایجاد یک کلاس فرزند متناظر آن برای کلاس دیگری باشید، با این کد بد بود مواجه هستید. معمولا زمانی این اتفاق میافتد که یک درخت ارث بری به درخت ارث بری دیگری وابسته باشد. بهطوری که هر یک از کلاسهای موجود در آن، با یک کلاس در درخت دیگر متناظر باشند و ارتباط داشته باشند. این امر ایجاد تغییرات در کد را با مشکل مواجه خواهد کرد. ...
فیلد موقتی یا Temporary field در دسته بندی الگوهای « بد استفاده کنندگان از شیء گرایی » قرار میگیرد. در این الگوی بد، فیلدها یا خصوصیات یک کلاس، در شرایط خاصی مقدار گرفته و مورد استفاده قرار میگیرند و در بقیه شرایط خالی هستند. زمانیکه در یک کلاس، متدی برای انجام فعالیت خود، تعدادی پارامتر ورودی زیادی نیاز داشته باشد، ممکن است برنامه نویس برای مواجه نشدن با تعداد پارامترهای زیاد ورودی، فیلدها یا خصوصیاتی را در کلاس مربوط به آن متد ایجا ...