در حالتهایی که متغیر موقتیای در متد وجود دارد که چندین بار مقدار دهی میشود، احتمالا به چنین بازسازی کدی نیاز است. قبل از ادامه بحث در این باره نیاز است یک نوع از متغیرهای محلی را بررسی کرد.
متغیر محلی تجمعی (Collecting temporary variable): متغیری ای که در بدنه متد یا عبارتهای loop مقدار آن به مرور تکامل مییابد یا اضافه میشود. نمونهای از چنین متغیرهایی شمارندههای loop و یا رشتههایی هستند که بسته به شرایط خاص در متد تولید و مقادیر آنها تکامل مییابند. پر کردن یک stream و اضافه کردن به یک متغیر از نوع موقتی collection نیز نشانههایی از این نوع متغیر هستند.
معمولا متغیرهای محلی تجمعی نیازی به جداسازی ندارند. اما متغیرهای محلیای غیر از این نوع، نیاز به بازسازی خواهند داشت. متغیرهایی که برای نگهداری مقداری و استفاده از آن در ادامه بدنه متد ایجاد میشوند، یکی از دلایل اصلی طولانی شدن بدنه یک متد هستند.
به طور مثال به تکه کد زیر توجه کنید. در این تکه کد متغیری به نام temp در خط اول ایجاد شده که در خط سوم مورد استفاده مجدد قرار گرفته است. بیشترین سناریویی که نیاز به بازسازی دارد به این صورت هستند.
double temp = 2 * (_height + _width);
Console.WriteLine(temp);
temp = _height * _width;
Console.WriteLine(temp);
این تکه کد را میتوان به صورت زیر بازسازی کرد:
readonly double perimeter = 2 * (_height + _width);
Console.WriteLine(perimeter);
readonly double area = _height * _width;
Console.WriteLine(area);
مراحل انجام این بازسازی کد
- نام متغیر موقتی را در خط مربوط به ایجاد و اولین مقداردهی به آن تغییر دهید.
- متغیر موقتی را readonly کنید.
- تمامی دسترسیها به متغیر موقتی را تا مقداردهی بعدی به متغیر تغییر نام یافته تغییر دهید.
- متغیر موقتی را در مکان مقداردهی بعدی به متغیر ابتدایی تعریف کنید.
- کد را کامپایل و تست کنید.
- مراحل بالا را برای هر مقداردهی به متغیر موقتی اولیه تکرار کنید.
به زبان سادهتر در بازسازی کد جداسازی متغیر موقتی به ازای هر استفاده از متغیر موقتی اولیه یک متغیر جدید را ساخته و استفاده میکنیم. به شبه کد زیر توجه کنید:
var temp = "some text";
// temp usage
temp = "some other text";
// temp usage
temp = "yet another text";
// temp usage
temp = "final text";
// temp usage
در این کد یک متغیر موقتی بارهای مقداردهی و استفاده مجدد شده است. دید کلی در بازسازی این کد به صورت زیر است.
var temp = "some text";
// temp usage
var temp2 = "some other text";
// temp 2 usage
var temp3 = "yet another text";
// temp 3 usage
var temp4 = "final text";
// temp 4 usage
زمانیکه از یک متغیر موقتی چندین بار در یک متد استفاده میشود، ممکن است این مورد ناشی از وجود مسئولیتهای بیش از اندازه در یک متد باشد و با استفاده از بازسازی کد
استخراج متد به طریق دیگری مشکل متغیرهای موقتی حل شود. اما برای انجام استخراج متد نیز در نهایت نیاز است ابتدا بازسازی جداسازی متغیر موقتی را انجام دهید تا بلوکهای کد قابل استخراج مشخصتر شوند.