اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
سه دقیقه
زمانیکه عبارت شرطی، یا محاسبات پیچیدهای در کد وجود دارد، میتوان آن را به بخشهای کوچکتری تقسیم و برای هر بخش، یک متغیر توضیحی ایجاد کرد؛ به طوریکه نام متغیر، توضیح کافی ای در مورد آن بخش از عبارت باشد.
در ادامهی این بازسازی کد، معمولا میتوان بازسازی کد جایگزینی متغیر موقتی با پرس و جو (Replace temp with query) را انجام داد. زیرا متغیرهای محلی صرفا در محدودهی متد خود قابل دسترسی هستند و ممکن است توسعهی یک متد بلند را به همراه بیاورند.
به طور مثال به تکه کد زیر توجه کنید:
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 گفته میشود.
همان طور که در ابتدای مطلب نیز ذکر شد، در ادامهی این بازسازی کد میتوان بازسازیهای دیگری مانند جایگزینی متغیر موقتی با پرس و جو را نیز استفاده نمود. این مورد به عنوان تمرین به خواننده واگذار میشود.