نريد أن نتيح هذا المشروع المفتوح المصدر إلى كل الناس حول العالم. من فضلك ساعدنا على ترجمة محتوى هذه السلسله للغة التى تعرفها.
الرجوع الي الدرس

أنشِئ آلة حاسبة يمكن توسعتها لاحقًا

الأهمية: 5

أنشِئ دالة إنشاء باني «constructor»‏ Calculator تُنشئ كائنات من نوع «آلة حاسبة» يمكن لنا «توسعتها».

تنقسم هذه المهمة إلى جزئين اثنين:

  1. أولًا، نفّذ تابِع calculate(str)‎ يأخذ سلسلة نصية (مثل “1 + 2”) بالتنسيق «عدد مُعامل عدد» (أي مقسومة بمسافات) ويُعيد الناتج. يجب أن يفهم التابِع الجمع + والطرح -.

مثال عن الاستعمال:

```js
let calc = new Calculator;

alert( calc.calculate("3 + 7") ); // 10
```
  1. بعدها أضِف تابِع addMethod(name, func)‎ يُعلّم الآلة الحاسبة عمليّة جديدة. يأخذ التابِع المُعامل name ودالة func(a,b)‎ بوسيطين تُنفّذ هذه العملية.

كمثال على ذلك سنُضيف عمليات الضرب * والقسمة / والأُسّ **:

let powerCalc = new Calculator();
powerCalc.addMethod("*", (a, b) => a * b);
powerCalc.addMethod("/", (a, b) => a / b);
powerCalc.addMethod("**", (a, b) => a ** b);

let result = powerCalc.calculate("2 ** 3");
alert(result); // 8
  • في هذه المهمة ليس هناك أقواس رياضية أو تعابير معقّدة.
  • تفصل الأعداد والمُعامل مسافة واحدة فقط.
  • يمكنك التعامل مع الأخطاء لو أردت.

افتح sandbox بالإختبارات.

  • يرجى ملاحظة كيفية تخزين الطرق. تتم إضافتها ببساطة إلى خاصية this.methods.
  • يتم إجراء جميع الاختبارات والتحويلات الرقمية بطريقة حساب '. يمكن توسيعه في المستقبل لدعم التعبيرات الأكثر تعقيدًا. في هذه المهمة نفترض أنid` فريد. قد لا يكون هناك عنصران للصفيف بنفس “المعرف”.

يُرجى استخدام طريقة الصفيف .reduce في الحل.

function Calculator() {

  this.methods = {
    "-": (a, b) => a - b,
    "+": (a, b) => a + b
  };

  this.calculate = function(str) {

    let split = str.split(' '),
      a = +split[0],
      op = split[1],
      b = +split[2];

    if (!this.methods[op] || isNaN(a) || isNaN(b)) {
      return NaN;
    }

    return this.methods[op](a, b);
  };

  this.addMethod = function(name, func) {
    this.methods[name] = func;
  };
}

افتح الحل الإختبارات في sandbox.