المسارات
/
JavaScript
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 في تعريف الصنف الابن تُنشئ علاقة مع الصنف الأب عبر سلسلة prototype.

الكائنات التي يُنشئها منشئ الصنف الابن تحتوي على prototype الخاص بالصنف الأب ضمن سلسلة prototype الخاصة بها، ما يتيح الوصول إلى أي طُرق أو بيانات يعرّفها الصنف الأب.

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

وكما هو الحال مع أي صنف في JavaScript، يمكن للأصناف الفرعية أن ترث من Error لإنشاء أخطاء مخصصة باستخدام الكلمة المفتاحية extends. تتحقق صيغة 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');
  }
}

التعليمات

Elena هي مديرة الجودة الجديدة في مصنع صحف. ولأنها وصلت للتو إلى الشركة، قررت مراجعة بعض العمليات في المصنع لترى ما يمكن تحسينه. اكتشفت أن الفنيين يجرون الكثير من فحوص الجودة يدويًا. ترى أن هناك فرصة جيدة للأتمتة، فتطلب منك، كمطور مستقل، أن تطوّر برنامجًا لمراقبة بعض الآلات.

1. مراقبة مستوى الرطوبة في الغرفة

مهمتك الأولى هي كتابة برنامج لمراقبة مستوى الرطوبة في غرفة الإنتاج. يوجد بالفعل مستشعر متصل ببرنامج الشركة يُرجع بشكل دوري نسبة الرطوبة في الغرفة.

عليك تنفيذ دالة في البرنامج ترمي خطأً إذا كانت نسبة الرطوبة مرتفعة جدًا. يجب أن تُسمّى الدالة checkHumidityLevel وأن تأخذ نسبة الرطوبة كمعامل.

يجب أن ترمي خطأً (الرسالة غير مهمة) إذا تجاوزت النسبة 70%.

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

2. اكتشاف ارتفاع درجة الحرارة

Elena سعيدة جدًا بمهمتك الأولى وتطلب منك أن تتولى مراقبة درجة حرارة الآلات. وأثناء حديثك مع الفني Greg، يُخبرك أنه إذا تجاوزت درجة حرارة آلة 500°C، يبدأ الفنيون في القلق من ارتفاع درجة الحرارة.

الآلة مزوّدة بمستشعر يقيس درجة حرارتها الداخلية. يجب أن تعرف أن المستشعر حساس جدًا وغالبًا ما يتعطل. وفي هذه الحالة، سيحتاج الفنيون إلى تغييره.

مهمتك هي تنفيذ دالة reportOverheating تأخذ درجة الحرارة كمعامل وترمي خطأً إذا كان المستشعر معطلًا أو إذا بدأت الآلة في ارتفاع درجة الحرارة. ولأنك ستحتاج لاحقًا إلى التصرف بشكل مختلف حسب نوع الخطأ، فأنت بحاجة إلى آلية للتمييز بين نوعي الأخطاء. يمكنك الاعتماد على رسائل الخطأ، لكن هذا سيجعل الكود هشًا لأنه سيتعطل إذا حُدّثت الرسالة. لذا، ولتتمكن من ذلك بشكل صحيح، سترمي نسخًا من أصناف أخطاء مختلفة.

  • إذا كان المستشعر معطلًا، فستكون درجة الحرارة null. في هذه الحالة، يجب أن ترمي ArgumentError.
  • عندما يعمل كل شيء بشكل سليم، إذا تجاوزت درجة الحرارة 500°C، يجب أن ترمي OverheatingError. سيتم إنشاء نسخة من صنف الخطأ هذا بوسيط هو درجة الحرارة. تأكد من أن OverheatingError الذي ترميه يحتوي على خاصية throw مرتبطة به.
reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError

3. مراقبة الآلة

الآن بعد أن أصبحت آلتك قادرة على اكتشاف الأخطاء، ستنفذ دالة تتفاعل مع هذه الأخطاء بطرق مختلفة:

  • إذا كان المستشعر معطلًا، فأنت بحاجة إلى تحذير الفني
  • إذا كانت درجة الحرارة مرتفعة جدًا، فإما أن توقف الآلة إذا تجاوزت درجة الحرارة 600°C، أو تشغّل ضوءًا تحذيريًا إذا كانت أقل من ذلك.
  • إذا حدث خطأ آخر، فستعيد رميه.

نفّذ دالة monitorTheMachine تأخذ وسيطًا اسمه actions.

actions كائن له 4 خصائص:

الخاصية الوصف
check دالة. تفحص درجة حرارة الآلة. وقد ترمي أخطاءً متنوعة.
alertDeadSensor دالة. تنبّه الفني إلى أن مستشعر درجة الحرارة معطل.
alertOverheating دالة. ستشغّل ضوءًا تحذيريًا على الآلة.
shutdown دالة. ستوقف الآلة.

دالة monitorTheMachine(actions) يجب أن تستدعي check() داخليًا. إذا نجح ذلك، فلا يجب أن تُرجع الدالة أي شيء. وإذا رمى ذلك خطأً، فمن المتوقع سلوك مختلف:

الاستثناء السلوك المتوقع
ArgumentError استدعاء الدالة alertDeadSensor.
OverheatingError تنفيذ بروتوكول ارتفاع درجة الحرارة.
(أي شيء آخر) إعادة رمي الخطأ

بروتوكول ارتفاع درجة الحرارة إذا كانت درجة الحرارة أقل من 600 °C، فشغّل الضوء التحذيري باستدعاء الدالة alertOverheating. وإذا تجاوزت درجة الحرارة 600 °C، فالوضع حرج، لذا استدعِ الدالة shutdown.

monitorTheMachine({
  check,
  alertDeadSensor,
  alertOverheating,
  shutdown,
});
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
JavaScript Exercism

مستعد لبدء مستشعرات المصنع؟

سجّل في Exercism لتتعلّم وتتقن JavaScript عبر 37 مفهومًا159 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.