زمانیکه عبارت شرطی، یا محاسبات پیچیدهای در کد وجود دارد، میتوان آن را به بخشهای کوچکتری تقسیم و برای هر بخش، یک متغیر توضیحی ایجاد کرد؛ به طوریکه نام متغیر، توضیح کافی ای در مورد آن بخش از عبارت باشد.
به طور مثال به تکه کد زیر توجه کنید:
if (platform.ToUpper().Contains("MAC") && browser.ToUpper().Contains("SAFARI"))
{
// do something
} این تکه کد با بررسی زیرساخت و مرورگر کاربر، کاری را انجام میدهد. اما با کمی دقت متوجه میشویم عبارت شرطی استفاده شده در آن کمی پیچیده است. میتوان این کد را به صورت زیر بازسازی کرد.
var isSafari = browser.ToUpper().Contains("SAFARI");
var isMac = platform.ToUpper().Contains("MAC");
if (isSafari && isMac)
{
// do something
} کد حاصل از بازسازی انجام شده، کدی خواناتر و قابل توسعهتر است (البته در این مثال با نمونهای ساده سر و کار داریم و موارد واقعیتر معمولا پیچیدگی بیشتری دارند).
مراحل انجام این بازسازی کد
- متغیر محلی ای را ایجاد نمایید و بخشی از عبارت پیچیده را به آن مقداردهی کنید.
- تمامی استفادهها از آن بخش از عبارت را با مقدار متغیر جایگزین نمایید.
- کد را کامپایل و تست نمایید.
- برای بخشهای دیگر عبارت پیچیده همین کارها را تکرار نمایید.
مثال: با متدی که محاسبه قیمت نهایی یک کالا را انجام میدهد، شروع میکنیم.
public decimal GetPrice() {
// price = base price - quantity * discount + shipping
return quantity * itemPrice - Math.Max(0, quantity - 500) * itemPrice * 0.05
+ Math.Min(quantity * itemPrice * 0.1, 100);
}
در اولین نگاه متوجه میشویم که میتوان بخشی از محاسبات را که مربوط به قیمت پایه است، به صورت جداگانه در متغیری ذخیره نماییم:
var basePrice = quantity * itemPrice;
با این تغییر، متد مورد نظر به شکل زیر خواهد شد:
public decimal GetPrice() {
// price = base price - quantity * discount + shipping
var basePrice = quantity * itemPrice;
return basePrice - Math.Max(0, quantity - 500) * itemPrice * 0.05
+ Math.Min(basePrice * 0.1, 100);
}
سپس با کمی دقت میتوانیم به فرمول مستقل محاسبه تخفیف برسیم و آن را در متغیری جداگانه ذخیره نماییم. با این کار متد مورد نظر به صورت زیر خواهد شد:
public decimal GetPrice() {
// price = base price - quantity * discount + shipping
var basePrice = quantity * itemPrice;
var discount = Math.Max(0, quantity - 500) * itemPrice * 0.05;
return basePrice - discount
+ Math.Min(basePrice * 0.1, 100);
}
و پس از آن نیز فرمول مربوط به محاسبه مبلغ ارسال نیز کاملا واضح خواهد بود.
public decimal GetPrice() {
// price = base price - quantity * discount + shipping
var basePrice = quantity * itemPrice;
var discount = Math.Max(0, quantity - 500) * itemPrice * 0.05;
var shipping = Math.Min(basePrice * 0.1, 100);
return basePrice – discount + shipping;
}
مشاهده میکنید که نمونه کد مطرح شده، به کدی منظمتر و خواناتر تبدیل شده است. یکی از مزایای جانبی چنین بازسازی کدی، نیاز کمتر به کامنتهای توضیحی در مورد بدنه متد است. به طور مثال کامنت اولین خط از متد ذکر شده، در تکه کد نهایی بازسازی شده، کامنتی بی معنی است زیرا کد، به خودی خود کاری را که انجام میدهد، توضیح دادهاست. به این روش کد نویسی به طور کلی
self documenting code گفته میشود.
همان طور که در ابتدای مطلب نیز ذکر شد، در ادامهی این بازسازی کد میتوان بازسازیهای دیگری مانند
جایگزینی متغیر موقتی با پرس و جو را نیز استفاده نمود. این مورد به عنوان تمرین به خواننده واگذار میشود.