بازسازی کد: جایگزینی نوع‌های داده‌های یک کلاس با زیر کلاس‌ها
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: دو دقیقه

یک پیاده سازی از کلاس، می‌تواند به طور ضمنی شامل دو یا چند نوع (Type) باشد. یکی از ساده‌ترین راه‌های پیاده سازی این حالت، استفاده از فیلدهایی برای نگهداری نوع اصلی داده‌ی کلاس است که اصطلاحا Type code نیز نامیده می‌شوند. به طور مثال پیاده سازی زیر را در نظر بگیرید. 

به طور مثال در کلاس بالا یک کارمند می‌تواند فروشنده یا مهندس باشد. پیاده سازی بالا این مورد را با استفاده از دو فیلد نشان داده‌است که در صورت true بودن، مقدار هریک از آن‌ها، نوع کلاس متناظر با آن خواهد بود.

مثلا اگر IsSalesman مقدار true داشته باشد، شیء ما کارمندی با نقش Salesman است و در صورتی که IsEngineer مقدار true داشته باشد ، شیء کارمند، نقش مهندس دارد. بماند که حالت‌های دیگری نیز برای مقادیر این فیلدها وجود دارند! 

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

اگر با همین فرمان کدنویسی را ادامه دهیم احتمالا با کلاسی روبرو خواهیم شد که پر است از گذاره‌های if else ، switch و یا مواردی از این دست؛ که ابدا شرایط دلپذیری برای دوستانی که قصد نگهداری از کد ما را دارند، نیست! 

زمانیکه با چنین موردی مواجه می‌شوید. ابتدا به ارتباط معنایی نوع‌های به کار رفته‌ی در کلاس توجه کنید. در صورتیکه می‌توان این انواع را به صورت polymorphic طراحی مجدد کرد، حتما این کار را انجام دهید. البته به ندرت مشاهده کرده‌ام چنین چیزی امکان نداشته باشد. در صورتیکه ارتباط معنایی خاصی وجود نداشته باشد، می‌توانید با استفاده از دیگر بازسازی‌های کد، کلاس‌ها را جدا کرده و دو کلاس مجزا را ایجاد نمایید. یا با استفاده از دیگر بازسازی‌های کد که در آینده خواهم گفت، به طریق دیگری کد را تغییر دهید که خدا را هم خوش بیاید. به طور مثال طراحی زیر می‌تواند نتیجه بازسازی کلاس بالا با روش ذکر شده باشد.  

مراحل انجام این بازسازی کد  

  1. اگر type کد درونی کلاس از طریق سازنده به کلاس ارسال شده است، این سازنده را با یک متد سازنده (Factory method) جایگزین کنید. 
  2. به ازای هر مقدار از type کدهای درونی کلاس، یک زیر کلاس جدید بسازید. 
  3. تمامی استفاده‌ها از type کدهای درونی کلاس را بازسازی کرده و به کلاس‌های مربوط به خود منتقل کنید (احتمالا تمامی پیاده سازی‌هایی که if else یا switch ای بر روی مقدار type کدها دارند).
  4. از کلاس پایه، type کد را حذف کنید. 
  5. در صورت وجود تمامی استفاده‌ها از سازنده، کلاس اولیه را به استفاده از متد سازنده تغییر دهید. 
  6. کد را کامپایل و تست نمایید.