برنامه نویسی

🚫 استفاده از SWITCH را متوقف کنید، لطفا 🙏

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

مسئله

در این مثال، تابع notifier یک آرگومان اطلاع رسانی از نوع می گیرد Notification، که شماره ای است که اعلان های مختلف را نشان می دهد. این تابع از یک دستور سوئیچ برای تعیین اینکه کدام اعلان را بر اساس مقدار آن ارسال کند، استفاده می کند Notification بحث و جدل. نمونه ای را می بینیم:

در اینجا می توانید نگاهی به این موضوع بیندازید که چرا استفاده از Enums توصیه نمی شود

const enum Notification {
  verifySignUp,
  resendVerifySignup,
  emailConfirmed
}

export function notifier (notification: Notification) {
  switch (notification) {
    case Notification.verifySignUp: 
      // Execute something...
    return;

    case Notification.resendVerifySignup: 
      // Execute something...
    return;

    case Notification.emailConfirmed: 
      // Execute something...
    return 
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با افزایش تعداد موارد در سوئیچ، خوانایی کد کاهش می یابد. همچنین، اگر میوه جدیدی به enum اضافه شود، تابع باید برای رسیدگی به کیس جدید به‌روزرسانی شود، که در صورت فراموش کردن به‌روزرسانی، می‌تواند منجر به خطا شود.

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

جایگزین احتمالی دیگری که در پروژه های دیگر پیدا کرده ام استفاده از if است.

export function notifier(notification: Notification) {
  if (notification === Notification.verifySignUp) {
    // Execute something...
    return;
  }

  if (notification === Notification.resendVerifySignup) {
    // Execute something...
    return;
  }

  if (notification === Notification.emailConfirmed) {
    // Execute something...
    return;
  }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اما همانطور که باید ببینید، هر دو دارای یک اشکال هستند. اکنون که ما با مشکل روبرو شدیم. چگونه این را بهبود دهیم؟

راه حل

مانند هر راه حل نرم افزاری، پیاده سازی های مختلفی برای نحوه حل یک مشکل وجود دارد. در این مورد ما فقط به دو مورد می پردازیم، یکی از آنها استفاده از objects و دیگری از طریق mapping functions

استفاده از اشیاء

const notificationDirectory = {
  verifySignup: () => {
    // Execute something...
  },

  resendVerifySignup: () => {
    // Execute something...
  },

  emailConfirmed: () => {
    // Execute something...
  }
}

type NotificationTypes = keyof typeof notificationDirectory

function notifier (notification: NotificationTypes) {
  const handler = notificationDirectory[notification]

  if (!handler) throw new Error("Your method does not exist");

  if (!(typeof handler === 'function')) throw new Error("Your method must be a function");

  // Execute your method
  handler()
}

// send email for the user to confirm his email.
notifier('verifySignup')

// send email notifying that your email was verified
notifier('emailConfirmed')
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

استفاده از توابع نقشه برداری

const notificationMap = new Map<string, () => void>()

notificationMap.set('verifySignup', () => {
  // ...
})

notificationMap.set('resendVerifySignup', () => {
  // ...
})

notificationMap.set('emailConfirmed', () => {
  // ...
})

function notifier (notification: string) {
  const handler = notificationMap.get(notification)

  if (!handler) throw new Error("Your method does not exist");

  handler()
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مزایای استفاده از این تکنیک ها به جای سوئیچ در زیر توضیح داده شده است:

  • نگهداری راحت تر: با اضافه شدن اعلان‌های جدید، نیازی به افزودن نمونه‌های بیشتری در دستور سوئیچ نیست، فقط یک تابع جدید به آن اضافه کنید. notificationDirectory هدف – شی.

  • انعطاف پذیرتر: می‌توانید در هر زمانی اعلان‌ها را اضافه یا حذف کنید، بدون اینکه نگران به‌روزرسانی عبارت سوییچ مربوطه باشید.

  • امن تر: با استفاده از NotificationTypes تایپ کنید، می‌توانید مطمئن شوید که فقط مقادیر معتبر به متد اطلاع‌دهنده ارسال می‌شوند. اگر سعی شود مقداری ارسال شود که یکی از کلیدهای معتبر نیست notificationDirectory شی، یک خطای زمان اجرا پرتاب خواهد شد. این می تواند به شناسایی اشکالات زودتر کمک کند.

  • مقیاس پذیرتر: به جای نوشتن یک تابع طولانی که چندین مورد مختلف را مدیریت می کند، این رویکرد به شما امکان می دهد برای هر مورد یک تابع جداگانه تعریف کنید و کد شما را ماژولارتر و خواندن و نگهداری آسان تر می کند.

  • کارآمدتر: در برخی موارد استفاده از نقشه به جای دستور switch می تواند از نظر سرعت اجرا کارایی بیشتری داشته باشد. این به این دلیل است که نقشه‌ها به‌عنوان یک ساختار داده جستجوی کلید-مقدار پیاده‌سازی می‌شوند، که به شما امکان می‌دهد مقادیر را با کارایی بیشتری نسبت به جستجوی متوالی در یک عبارت سوئیچ جستجو و بازیابی کنید.

نتیجه

در نتیجه، اگرچه دستور switch ابزار مفیدی در توسعه نرم افزار است، اما استفاده بیش از حد از آن می تواند منجر به کدهایی شود که نگهداری و اصلاح آن دشوار است. با افزایش تعداد موارد در سوئیچ، خوانایی کد کاهش می‌یابد و در صورت فراموش کردن به‌روزرسانی تمام نمونه‌هایی که در آن استفاده می‌شود، افزودن موارد جدید می‌تواند منجر به خطا شود. علاوه بر این، جایگزین های مقیاس پذیر و قابل نگهداری بیشتری وجود دارد، مانند using objects یا mapping functions، که می تواند خوانایی و نگهداری کد را بهبود بخشد. بنابراین، در نظر گرفتن استفاده مناسب از عبارت switch و ارزیابی سایر جایگزین ها برای بهبود کیفیت کد در توسعه نرم افزار مهم است.

بیا دنبالم

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا