برنامه نویسی

# اعتبارسنجی عمومی را با توابع قابل استفاده مجدد جایگزین کنید

توسعه دهندگان جاوا اسکریپت و تایپ اسکریپت اغلب شرایط مشابهی را به طور مکرر می نویسند. اگر شما یک توسعه دهنده وب هستید، احتمالاً با کدهایی مانند زیر مواجه شده اید:

const handleSaveTextKeydown = (event: KeyboardEvent) => {
   if (event.key === 'Enter') {
    //... save text
   }
}
وارد حالت تمام صفحه شوید

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

در این مورد، event.key از نوع است stringو معرفی اشکالات با قرار دادن تصادفی فاصله در آن آسان است 'Enter 'به عنوان مثال

چرا این شرایط را در یک تابع کپسوله نمی کنیم؟

const handleSaveTextKeydown = (event: KeyboardEvent) => {
   if (checkIsEnterKey(event.key)) {
    //... save text
   }
}
وارد حالت تمام صفحه شوید

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

این تضمین می کند که تمام بررسی های کلید Enter سازگار و قابل اعتماد هستند.

حال، این اعتبارسنجی را در نظر بگیرید:

type Value = null | object;

const value = {} as Value;

if (typeof value === 'object') {
  value; // value type is null | object
}
وارد حالت تمام صفحه شوید

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

حتی اگر TypeScript هوشمند است، value در داخل شرایط از نوع باقی می ماند Value. این به این دلیل است typeof null برمی گرداند 'object'.

بنابراین، باید بنویسید:

if (value !== null && typeof value === 'object') {
  value; // value type is object
}
وارد حالت تمام صفحه شوید

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

بسیاری از توسعه دهندگان ممکن است این را در یک تابع کپسوله نکنند و در عوض هر زمان که با این وضعیت مواجه شدند آن را مکررا بنویسند.

چند بار در زندگی خود همین شرط را نوشته اید؟

چند بار همین اشتباه را کرده اید؟

در آینده چند بار دیگر همین شرط را می نویسید؟

اگر من بودم این کار را می کردم:

if (checkIsObject(value)) {
  value; // value type is object
}
وارد حالت تمام صفحه شوید

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

محصور کردن شرایط عمومی در توابع مزایای زیادی دارد.

به مثال زیر توجه کنید:

const array = [0, 1, 2, 3, 4, 5, null, undefined];
وارد حالت تمام صفحه شوید

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

بیایید یک آرایه ایجاد کنیم که فقط مقادیر تهی را حذف کند.

ممکن است مختصر بودن را در اولویت قرار دهید و آن را به این صورت بنویسید:

const numbers = array.filter(Boolean);
وارد حالت تمام صفحه شوید

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

متأسفانه، این ایده آل نیست. 0 نیز به عنوان ارزیابی می شود false و حذف می شود پس باید بنویسید:

const numbers = array.filter(item => item !== null && item !== undefined);
وارد حالت تمام صفحه شوید

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

آیا این کد زشت و غیرقابل استفاده مجدد به نظر نمی رسد؟

من می توانم کد ظریف تری بنویسم:

const numbers = array.filter(checkIsNullish);
وارد حالت تمام صفحه شوید

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

نوشتن مکرر شرایط عمومی را متوقف کنید. این فقط منجر به اشتباه می شود و کد کمتر قابل خواندن می شود.

اجازه دهید کتابخانه ای را که من ایجاد کردم به نام چکر معرفی کنم.

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

در زمان نگارش این مقاله، توابع زیادی برای مدیریت انواع داده‌ها مانند رشته‌ها، اعداد، بولی ها و مقادیر تهی ارائه می‌شود. همه توابع آزمایش شده، مستند شده و شروع به استفاده آسان است.

بیایید به چند نمونه از دنیای واقعی نگاه کنیم.

بسته های ارائه شده توسط این کتابخانه همگی در JSR منتشر شده اند. آنها را می توان به راحتی در پروژه های NPM، PNPM، Yarn، Bun و Deno نصب کرد.

در اینجا، ما را می گیریم @checker/string بسته به عنوان نمونه با NPM.

  1. بسته را نصب کنید

دستور زیر را در پوشه پروژه خود اجرا کنید:

  npx jsr add @checker/string
وارد حالت تمام صفحه شوید

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

  1. با استفاده از توابع
  import { checkIsNotEmptyString, checkIsIndexFound } from "@checker/string";

  const value = "Hello";

  const formatted = value.trim();

  if (checkIsNotEmptyString(formatted)) {
    // formatted !== ''
    // When formatted is not an empty string
  }

  const index = value.indexOf("el");

  if (checkIsIndexFound(index)) {
    // index !== -1
    // When "el" is found in value
  }
وارد حالت تمام صفحه شوید

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

من علاقه ای به استفاده از عملگرهای نفی منطقی مانند آن ندارم !SOME_CONDITION برای معکوس کردن یک مقدار بولی این به این دلیل است که ضمنی است و صرفاً معکوس کردن مقدار بولی با افزودن یا حذف آن می‌تواند به بسیاری از موقعیت‌های خطرناک منجر شود.

بنابراین، همه توابع متناظر هستند checkIsNot~ توابع تعریف شده

شرایط عمومی را در توابع کپسوله کنید. به این ترتیب، کد خواناتر می شود و باگ ها راحت تر شناسایی می شوند.

ممنون که خواندید.

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

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

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

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