بازگشت به درس

یک ماشین حساب قابل توسعه بسازید

اهمیت: 5

یک تابع سازنده Calculator بسازید که شیءهای ماشین حساب «قابل توسعه» می‌سازد.

این تکلیف از دو بخش تشکیل شده است.

  1. اول، متد calculate(str) را بسازید که یک رشته مانند "1 + 2" را در شکل «عدد عملگر عدد» دریافت می‌کند و نتیجه را برمی‌گرداند. این متد باید جمع + و منها - را متوجه شود.

    مثالی از کاربرد آن:

    let calc = new Calculator;
    
    alert( calc.calculate("3 + 7") ); // 10
  2. سپس متد 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 اضافه شده‌اند.
  • تمام آزمایش‌ها و تبدیلات عددی در متد calculate انجام می‌شوند. در آینده ممکن است برای پشتیبانی از عبارات پیچیده‌تر توسعه بیابد.
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.