مسیرها
/
JavaScript
JavaScript
/
تمرین‌ها
/
حس‌گرهای کارخانه
حس‌گرهای کارخانه

حس‌گرهای کارخانه

تمرین یادگیری

مقدمه

خطاها

گزارش کردن خطاها زمانی مفید است که چیزی در یک برنامه یا بخشی از کد اشتباه یا غیرمنتظره باشد.

آن‌ها شیءهای جاوااسکریپت هستند.

ویژگی اصلی این شیء message است:

const error = new Error('Oops, something went wrong');

console.log(error.message);
// => "Oops, something went wrong"

با استفاده از نحوه‌ی نگارش throw می‌توانید یک خطا پرتاب کنید.

throw new Error('Oops');

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

try {
  throw new Error('Oops');
} catch (error) {
  console.log(error.message);
  // => "Oops"
}

وراثت

وراثت روشی برای ایجاد رابطه‌ی والد-فرزند بین کلاس‌ها است. کلاس فرزند (که گاهی زیرکلاس نامیده می‌شود) به رفتار و داده‌ای که کلاس والد (که گاهی ابرکلاس نامیده می‌شود) تعریف کرده است دسترسی دارد.

class Pet {
  constructor(name) {
    this.name = name;
  }

  introduce() {
    console.log(`This is my pet, ${this.name}.`);
  }
}

class Dog extends Pet {}

const dog = new Dog('Otis');
dog.introduce();
// => This is my pet, Otis.

کلیدواژه‌ی extends در تعریف کلاس فرزند، از طریق زنجیره‌ی پروتوتایپ رابطه‌ای با کلاس والد برقرار می‌کند.

اشیائی که سازنده‌ی فرزند ایجاد می‌کند، پروتوتایپ کلاس والد را در زنجیره‌ی پروتوتایپ خود خواهند داشت و این، دسترسی به هر متد یا داده‌ای که والد تعریف کرده است را فراهم می‌کند.

const dog = new Dog('Otis');

Dog.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(Dog.prototype); // => true

Pet.prototype.hasOwnProperty('introduce'); // => true
Dog.prototype.hasOwnProperty('introduce'); // => false
dog.hasOwnProperty('introduce'); // => false

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

class CustomError extends Error {}

try {
  // ... Code that may throw an error
} catch (error) {
  if (error instanceof CustomError) {
    console.log('The error thrown is an instance of the CustomError');
  }
}

دستورالعمل‌ها

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

1. پایش سطح رطوبت اتاق

مأموریت اول شما نوشتن نرم‌افزاری است که سطح رطوبت اتاق تولید را پایش کند. همین حالا حسگری به نرم‌افزار شرکت متصل است که به‌طور دوره‌ای درصد رطوبت اتاق را برمی‌گرداند.

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

اگر درصد رطوبت از ۷۰٪ بیشتر شود، باید خطایی پرتاب کنید (متن پیام مهم نیست).

checkHumidityLevel(60);
// => undefined
checkHumidityLevel(100);
// Throws an error

2. تشخیص گرمای بیش از حد

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

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

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

  • اگر حسگر خراب باشد، دما null خواهد بود. در این صورت، باید یک ArgumentError پرتاب کنید.
  • وقتی همه چیز درست کار می‌کند، اگر دما از ۵۰۰ درجه سانتی‌گراد بیشتر شود، باید یک OverheatingError پرتاب کنید. این کلاس خطا با آرگومان دما نمونه‌سازی می‌شود. حتماً مطمئن شوید که OverheatingError پرتاب‌شده خاصیتی به اسم throw دارد.
reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError

3. پایش ماشین

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

  • اگر حسگر خراب باشد، باید به یک تکنسین هشدار دهید.
  • اگر دما بیش از حد بالا باشد، در صورتی که دما از ۶۰۰ درجه سانتی‌گراد بیشتر شود ماشین را خاموش می‌کنید، و اگر کمتر باشد چراغ هشدار را روشن می‌کنید.
  • اگر خطای دیگری رخ دهد، آن را دوباره پرتاب می‌کنید.

تابعی به اسم monitorTheMachine پیاده‌سازی کنید که آرگومانی به اسم actions می‌گیرد.

actions شیئی است که ۴ خاصیت دارد:

خاصیت توضیح
check یک تابع. دمای ماشین را بررسی می‌کند. ممکن است خطاهای مختلفی پرتاب کند.
alertDeadSensor یک تابع. به تکنسین هشدار می‌دهد که حسگر دما از کار افتاده است.
alertOverheating یک تابع. چراغ هشدار روی ماشین را روشن می‌کند.
shutdown یک تابع. ماشین را خاموش می‌کند.

تابع monitorTheMachine(actions) باید در داخل خود check() را فراخوانی کند. اگر این فراخوانی بدون خطا انجام شود، تابع نباید چیزی برگرداند. اگر خطایی پرتاب شود، رفتار متفاوتی انتظار می‌رود:

استثنا رفتار مورد انتظار
ArgumentError تابع alertDeadSensor را فراخوانی کنید.
OverheatingError پروتکل گرمای بیش از حد را اجرا کنید.
(هر مورد دیگر) خطا را دوباره پرتاب کنید

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

monitorTheMachine({
  check,
  alertDeadSensor,
  alertOverheating,
  shutdown,
});
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
JavaScript Exercism

آماده‌اید حس‌گرهای کارخانه را شروع کنید؟

در Exercism ثبت‌نام کنید تا JavaScript را همراه با 37 مفهوم159 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.