بررسی Bad code smell ها: گذاره‌های Switch
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: سه دقیقه

این کد بد بو در دسته «بد استفاده کنندگان از شیء گرایی» قرار می‌گیرد. زمانیکه گذاره‌های switch و یا دنباله‌ای از گذاره‌های if در کد وجود داشته باشد، معمولا با چنین الگویی روبرو هستیم. تشخیص این کد بد بو نیز بسیار آسان است. 
در شرایط نادری استفاده از switch می‌تواند یک طراحی شیء گرای مناسب باشد. در طراحی شیء گرا معمولا یک گذاره switch نشان دهنده یک رابطه چند ریختی (Polymorphism) نادیده گرفته شده است. 
معمولا زمانیکه بجای استفاده از اصول طراحی شیء گرا، از گذاره‌های switch استفاده می‌شود، این گذاره‌ها در بخش‌های مختلف کد پراکنده خواهند شد. در نتیجه، برای اضافه یا حذف نمودن یک شرط از شرایط switch، باید تمامی گذاره‌ها را در کد، تغییر داد.  
از اولین قدم‌ها برای رفع چنین بوی بدی، می‌تواند متمرکز کردن گذاره switch پراکنده در کلاسی مناسب باشد. با این کار می‌توان کنترل نسبتا بیشتری بر روی گذاره و شرط‌های آن داشت.  
یکی از دلایل ایجاد چنین بوی بدی استفاده از کد نوع (Type code) بجای پیاده سازی روابط ارث بری است. به طور مثال فرض کنید در حال تولید سیستمی هستید که دو نوع مشتری حقیقی و حقوقی در آن وجود دارد. ممکن است به این نتیجه برسید که یک فیلد به نام Type را در کلاس مربوط به مشتری اضافه کنید. مانند کد زیر:  
public enum CustomerType 
{ 
     Person = 0, 
     Company = 1 
} 
public class Customer 
{ 
    public CustomerType Type { get; set; } 
}

با وجود چنین کلاسی از مشتری و نیاز به انجام فعالیت‌های مختلفی بر روی آن، احتمالا نیاز خواهد بود که در بخش‌های مختلف کد، گذاره‌ی switch ای مانند زیر را اضافه کنید:  

switch (customer.Type) 
{ 
      case CustomerType.Person: 
         // calculate discount, or send message or edit customer or anything else 
          break; 
      case CustomerType.Company: 
          // calculate discount, or send message or edit customer or anything else 
          break; 
      default: 
          throw new ArgumentOutOfRangeException(); 
 }

برای انجام فعالیت‌های مختلفی مانند محاسبه تخفیف، ارسال پیام و یا ویرایش مشتری، نیاز خواهد بود این گذاره تکرار شود که خود این موضوع بوی بد duplicate code است و به الگوی shotgun surgery نیز ختم خواهد شد. 

حال فرض کنید نیاز است مشتریان حقوقی، خود به دو نوع مشتری حقوقی بخش خصوصی و مشتری حقوقی بخش دولتی تقسیم شوند. در پیاده سازی ذکر شده باید به CustomerType یک آیتم افزوده شود و در تمامی switch‌ها نیز در صورت نیاز شرط مربوط به آن اضافه شود.  

برای حل این نوع از کد بد بو، معمولا یک کلاس پدر را به نام مشتری ایجاد کرده و کلاس‌های مختص هر یک از انواع مشتری را از آن به ارث می‌برند (Replace type code with subclass):

یا می‌توان طراحی را کمی متفاوت‌تر و به صورت زیر انجام داد:

دلیل مشابه دیگر ایجاد این الگوی بد کد استفاده از type code به عنوان وضعیت یک تایپ است. که در این صورت می‌توان بجای type code از state object استفاده کرد (Replace type code with strategy). به این مورد در مباحث مربوط به refactoring به طور مفصل پرداخته شده است.


جمع بندی 

این کد بد بو در شرایط متفاوتی ایجاد می‌شود. با این حال یکی از پر تکرارترین آنها استفاده بد یا عدم استفاده از الگوهای طراحی شیء گرا است. تصحیص این الگوی بد، به خوانایی و نگهداری کد در بلند مدت کمک بسیار زیادی می‌کند.